'포물선 운동'에 해당되는 글 6건

  1. 2008.08.28 [FLASK]화살 엔진 ver.1.52
  2. 2008.08.28 [수정필요]포물선 운동_05 (1)
  3. 2008.08.28 [수정필요]포물선 운동_04
  4. 2008.08.28 포물선 운동_03
  5. 2008.08.28 포물선 운동_02
  6. 2008.08.28 포물선 운동_01 (1)
2008.08.28 20:03
[FLASK]화살 엔진 ver.1.52



신고

'[+++ FLASH +++] > - - Flask`s Movies' 카테고리의 다른 글

[Flask]시계 (미완성)  (0) 2008.08.29
[Flask]Bullet Effect_03  (0) 2008.08.29
[Flask]Digit Time ver 1.1  (0) 2008.08.28
[FLASK]화살 엔진 ver.1.52  (0) 2008.08.28
Trackback 0 Comment 0
2008.08.28 19:57
5번째 글입니다.

이제까지 포물선 운동을 구현해 보았습니다.

이제까진 수류탄이나 돌맹이를 던지는것을 구현했죠.

오늘은 '화살'을 구현해봅시다.


먼저 생각해봅시다.

화살이라...

수류탄은 그냥 포물선 공식을 써주고 각도는 맘대로하고 날아가면 되지만...

화살은.....포물선의 접선에 대해서 각도가 변해야하죠..

그럼 이걸 어떻게 표현해야할까요?

접선이라....접선 하시면 떠오르는거 없으세요? 바로 '미분' 이죠. 오늘은 '미분의 개념'을 이용해서 화살을 표현해볼껍니다.


미분이라....

미분은 잘게 잘라놓은것이죠.

그럼 플래시에선 어떻게 잘게 자를까요? (dx 를 뜻하는것이죠.)

바로 플래시의 시간의 단위인 '프레임'을 쓸겁니다.

프레임을 기본단위로 하여 기울기를 구해봅시다.

기울기라.. 기울기는 Δy/Δx 죠? (Δ는 델타)

가정을 한번 해봅니다. 화살이 1, 2 프레임 진행했다고 합시다.

지금 현재는 2 프레임이니 2프레임에서의 기울기를 표현해야죠.

그럼 1프레임에서의 x, y값을 알고 2프레임에서의 x, y 값을 알수 있으니 기울기를 구할수 있겠죠?

이걸 액션 스크립트로 나타내면 다음과 같습니다.

diffX = mc._x - beforeX;
diffY = mc._y - beforeY;
beforeX = mc._x;
beforeY = mc._y;

음미 해봅시다...음.......

현 재 프레임(1)에서 beforeX, Y 는 mc의 x, y 값을 저장해두고, 다음 프레임(2)에 가서 현재의 프레임(2) 에서의 mc의 x, y 값에서 저장한 값(beforeX, Y)을 빼주면 diif(델타)X, Y 가 나오게 되죠..

그런데 생각해보니, 저렇게 해서 구한 기울기 값은 탄제트 값이 나오게 됩니다. (탄젠트(tan) 다들 아시죠? 높이/밑변)

하지만 우리가 필요한건 육십분법의 각을 알야야합니다. (왜냐하면, 무비클립의 각도를 ._rotation으로 할것이니까요.)

그래서 탄젠트의 역함수, 아크 탄젠트2(atan2)를 씁니다.

mc._rotation = Math.atan2(diffY, diffX)*180/Math.PI;

라고 해주면 되겠습니다.

이해 가시나요? (아크 탄젠트는 탄젠트의 역함수라서 y, x 위치가 바뀐건가..;;)
신고

'[+++ FLASH +++] > - - 물리' 카테고리의 다른 글

[ 01 ] 중력 & 반중력 ?  (0) 2009.06.11
[수정필요]포물선 운동_05  (1) 2008.08.28
[수정필요]포물선 운동_04  (0) 2008.08.28
포물선 운동_03  (0) 2008.08.28
Trackback 0 Comment 1
  1. 지나가는이 2009.12.25 16:43 신고 address edit & del reply

    유용한 강좌 잘 봤습니다~ 감사합니다~

2008.08.28 19:57
예제를 봐봅시다.

<예제 소스>

//변수들
var V0:Number = 0;
var theta:Number = 0;
var t:Number = 0;
var G:Number = 10;
var F:Number = 25;
var Fw:Number = 0;
var wtheta:Number = 0;
var m:Number = 1;
var Vx:Number;
var Vy:Number;
var i=0;

//리셋 펑션
function reset(){
    _root.ball._x = 400;
    _root.ball._y = 300;
    Vx = 0;
    Vy = 0;
    t=0; //퀴즈 왜 리셋시에 t를 0으로 만들까요?
}
reset();


onEnterFrame = function(){ // 매 프레임마다
    if(_root.ball._x > 800 || _root.ball._x<0 || _root.ball._y>1000 || _root.ball._y<-400){ reset();}
//해당 범위를 넘어가면 리셋 함수 호출

    theta = int(_root.DT.text)*Math.PI/180
//오늘의 핵심.

    V0 = F/m; // 초기 속도 구하기.

    Vx = V0*Math.cos(theta) + t*Fw*Math.cos(wtheta)/m
    Vy = V0*Math.sin(theta) - G*t - t*Fw*Math.sin(wtheta)/m

    _root.ball._x+= Vx;
    _root.ball._y-= Vy;
    t+=0.1; // t 값 증가시키기

//트레이서(추적)
    _root.attachMovie("ball", "ball"+i, i)
    var mc = _root["ball"+i]
    mc._x = _root.ball._x;
    mc._y = _root.ball._y;
    mc._alpha = 10
    mc._xscale = 50;
    mc._yscale = 50;
    i++;
}



오늘의 핵심을 봅시다,

theta = int(_root.DT.text)*Math.PI/180


바로 세타에 관한 식입니다.

매스 클래스의 코사인, 사인 함수를 보면 괄호안에 들어가는 값들은 우리가 말하는 각(육십분법이죠. 90도(직각), 45도  이렇게 말이죠.)
이 아니라 호도법으로 들어가야합니다. 바로 '라디안(rad)' 인데요...이건 수학 10-나에 나오는 내용이죠. 어쨋든,

괄호 안에는 호도법이 들어가야 제대로된 코사인, 사인 값을 얻을수 있습니다.

그러면 호도법은 어떻게 구할까요?

 1π 라디안이 180도이므로,

60분법*π/180 해주면 됩니다.

퀴즈 답)
t=0이 없는 채로 컴파일 시켜보세요. 그럼 공에 중력 가속도가 게속 붙어있는 상태가 되어서 실제 움직임처럼 표현되지 않습니다.
그래서 리셋시에 t 를 0으로 만들어줘서 초반 움직임에 중력가속도가 서서히 붙게 한것입니다.
신고

'[+++ FLASH +++] > - - 물리' 카테고리의 다른 글

[수정필요]포물선 운동_05  (1) 2008.08.28
[수정필요]포물선 운동_04  (0) 2008.08.28
포물선 운동_03  (0) 2008.08.28
포물선 운동_02  (0) 2008.08.28
Trackback 0 Comment 0
2008.08.28 19:57
3번째 글입니다.

오늘은 포물선의 초기속도를 힘으로 표현할껍니다.

일단......물리에서 나오는 유명한 공식!

F = ma (모르시는 분들은 위해 F 는 힘(N), m 은 질량(kg), a 는 가속도(m/s^2)입니다.)

이것을 이용해서 속도를 나태내어봅시다.

F = ma 를 변형시키면

F=m*v/t 입니다. (자세한 유도 : a 는 m/s^2, v 는 m/s 인데, v를 s(시간)으로 나눠주면 a=v/t 가 되겠죠.)

이제 이항해봅시다.(v 가 앞으로 나오게 해야되겠죠?)

v = F*t/m

이제 됐습니다.

그런데 식을 보면... t (시간) 변수가 있습니다. 이것은 힘을 주는 시간입니다. 힘을 오랜 시간동안 주면 속도가 빨라지겠죠?

하지만 지금 만드는 포물선운동은 힘을 주는 시간이 일정하다고 생각합니다. 그래서 t=1 로 두고,

v = F/m

라고 하면 됩니다.



이제 거의 끝이 났군요. 전에 유도한 공식에 대입해보면,

V0 = F/m;

Vx = V0*Math.cos(theta) + t*Fw*Math.cos(wtheta)/m
Vy = V0*Math.sin(theta) - G*t - t*Fw*Math.sin(wtheta)/m

완성입니다.



<부록>

[이제까지 쓰인 변수들]

var Vx:Number;
var Vy:Number;
var V0:Number = 0;
var theta:Number = 0
var t:Number = 0;
var G:Number = 10;
var F:Number = 0;
var Fw:Number = 0;
var wtheta:Number = 0;
var m:Number = 10;
저작자 표시 비영리 변경 금지
신고

'[+++ FLASH +++] > - - 물리' 카테고리의 다른 글

[수정필요]포물선 운동_04  (0) 2008.08.28
포물선 운동_03  (0) 2008.08.28
포물선 운동_02  (0) 2008.08.28
포물선 운동_01  (1) 2008.08.28
Trackback 0 Comment 0
2008.08.28 19:56
2번째 글입니다.


포물선 운동_01 에서 도출해낸 공식입니다.

+++++++++++++++++++++++++++++++++++++++++++++++++++++++

Vx = V0*Math.cos(theta)
Vy = V0*Math.sin(theta) - G*t

+++++++++++++++++++++++++++++++++++++++++++++++++++++++


오늘은 바람을 넣을 차례입니다.

먼저 바람이 불어 가는 방향(wtheta)과 바람의 세기(Fw)를 고려합니다.

그럼 아래와 같은 공식이 도출되죠.

Vx = V0*Math.cos(theta) + t*Fw*Math.cos(wtheta)
Vy = V0*Math.sin(theta) - G*t - t*Fw*Math.sin(wtheta)

됬나요?

그 런데 바람의 영향은 질량이 클수록 덜 받습니다. 왜냐구요?  바로 관성때문이죠. 질량이 클수록 자기가 운동하고있는 쪽으로 운동하니 바람의 영향을 받으려면 더 큰 힘을 줘야합니다. 어쟀든... 바람의 영향은 질량에 반비례하니 1/m 을 곱해주면 되겠죠?


Vx = V0*Math.cos(theta) + t*Fw*Math.cos(wtheta)/m
Vy = V0*Math.sin(theta) - G*t - t*Fw*Math.sin(wtheta)/m

이제 끝이군요.

다음편에서는 초기 속도 V0으로 나타내지 말고 힘으로 나타내 봅시다.


퀴즈)
왜 힘으로 표현하려할까요? 귀찮게..;
저작자 표시 비영리 변경 금지
신고

'[+++ FLASH +++] > - - 물리' 카테고리의 다른 글

[수정필요]포물선 운동_04  (0) 2008.08.28
포물선 운동_03  (0) 2008.08.28
포물선 운동_02  (0) 2008.08.28
포물선 운동_01  (1) 2008.08.28
Trackback 0 Comment 0
2008.08.28 19:55
포물선 운동 _01



포물선 운동,.,... 돌맹이를 던질때 돌맹이가 그리는 자취죠....

그러면...어떻게 표현해야할까요... 이차곡선으로 표현하자니... 힘들군요..ㅋ

벡터를 써봅시다...(벡터...라고 하긴 쫌 뭐하지만..)

Vx, Vy 를 벡터x, y 라고 합니다.

대략 이렇게 쓰면 되겠습니다.

_root.obj._x +=  Vx;
_root.obj._y -=  Vy;

벡터니 벡터는 '방향'을 가진 스칼라 이니까 방향을 표현해야겠죠.

그러면,

Vx = Math.cos(theta)
Vy = Math.sin(theta)

로 표현됬군요.(왜 코사인, 사인이 되는지는 공부하고 오세요. theta 는 범위 0~ 360/π 의 값이겠죠..? )

이제 초기 속도(V0)를 줍시다,.

Vx = V0*Math.cos(theta)
Vy = V0*Math.sin(theta)

이제 거의다 완성 됬는데....실행해보면,,,,,,이놈이 직진 운동을 합니다.....왜,,,,일까요...

바로 중력이 없기 때문입니다.

중력(G)을 넣어보죠.


Vy = V0*Math.sin(theta) - G*t

이렇게 되겠군요,

저기서 t의 역할은 시간입니다.

매 프레임마다 일정량을 더해줘서(t+=0.1 정도) 증가 시켜줘야 중력을 받는 모션이 됩니다..

모르시겠다구요? 잘 생각해보시면,,,알게 됩니다.....

(잘 모르실까봐...만약 그냥 빼기 G 해보면 직진운동만 하게됩니다. 왜냐면 Vy 가 일정한 값을 갖기 때문이죠. 그래서 G 를 증가시켜줘야하는데 중력 가속도는 증가할수 없으므로(지구에선), 시간 t를 곱해주는겁니다.)

다음 편엔 '바람' 을 넣어봅시다.

퀴즈) 바람도 힘의 일종입니다. 그렇다면  시각 t를 곱해줄 필요가 있을까요?
또 Vx, Vy 에 포함 시켜야 할까요?
저작자 표시 비영리 변경 금지
신고

'[+++ FLASH +++] > - - 물리' 카테고리의 다른 글

[수정필요]포물선 운동_04  (0) 2008.08.28
포물선 운동_03  (0) 2008.08.28
포물선 운동_02  (0) 2008.08.28
포물선 운동_01  (1) 2008.08.28
Trackback 0 Comment 1
  1. DuckMan 2011.12.27 17:18 신고 address edit & del reply

    안녕하세요 글 잘봤습니다. 이 공식을 활용해서 원하는 위치에 투사체를 이동시킬수있을까요?
    초기 속도와 각도를 구해야하는데 쉽지가 않네요 ㅜㅜ



티스토리 툴바