본문 바로가기
플래시 자료 제작

교플강8 - 자유낙하운동

by 민서아빠(과학사랑) 2013. 1. 16.

2. 자유낙하 운동을 컴퓨터로 구현할 수 있다.

가. 자유낙하 운동 공식 이해

자유낙하란 중력에 의해 물체가 지구중심으로 떨어지는 운동을 이야기 한다. 지구중심방향으로 떨어지는 물체는 중력가속도(g) 때문에 점점 속력이 빨라지는 등가속도 운동을 하게 된다. 이곳에서 자유낙하 운동을 다루고자 하는 이유는 우리 주변에서 항상 접하고 있는 사건이기 때문이다. 자유낙하 운동의 공식을 살펴보면 아래와 같다.

 

중력가속도 : g=9.8(m/s²)
속 도 : v=v0+gt
이 동거 리 : s=s0+v0t +(1/2)gt²


v:나중속도(m/s), v0:처음속도(m/s), a:가속도(m/s²)
t:걸린시간(s), s:이동거리(m) s0:초기위치(m)

 

나. 자유낙하 운동 표현방법 구상

우선 시간부터 생각해 보자. 시간 변화는 플래시에서는 1Frame 으로 대신 생각할 수 있다. 즉 플래시 프로그램은 프레임 방식의 프로그램으로 매 프레임을 실행할 때 마다 사건이 발생하므로, 따로 시간을 나타내 주지 않아도, 프레임마다 시간이 흘러간다고 보면 될 것이다. 따라서 onEnterFrame = function () 문 안에 액션스크립트를 넣어 주는 것 만으로도 시간은 계속해서 프레임마다 흘러가고 있다는 것을 알 수 있다.

그렇다면 속력은 어떻게 나타낼 것인가? 속력은 아래와 같이 나타내면 된다.

처음속도를 0이라고 했을 때 프레임 스크립트에 아래와 같이 나타낼 수 있다.

 

//초기값
g = 1; //중력가속도 값
vy = 0; // 속력 초기화
onEnterFrame = function () {
vy = vy+g; // vy 속력에 중력가속도 값 더해서 속력 증가
trace(vy);
}

 

<토의> 위 속력공식과 아래 스크립트에서 표현한 내용에 차이가 있어 보일 것이다. 어떤 차이가 있어 보이고, 왜 그런지 토의해 보자.(시간표현에 대한문제)

 


 

속력공식에서는 처음속도를 0이라고 v=gt 가 된다. 그래서 t 가 증가할 때 마다 v 값이 일정하게 증가하게 되는 것을 알 수 있다. 아래 액션스크립트에서는 스크립트상에서 t 에 대한 언급이 없다. 어떤 차이가 있는 것일까?

vy = vy+g 가 같는 의미를 생각해 보자. vy 는 우리가 만든 속력값이다. 그런데 vy 는 처음에는 0 이 었으나, 프레임이 실행될때마다. g 만큼 값이 증가하게 될 것이다. 그렇다면 vy 값도 일정하게 증가한다는 것을 알 수 있다. 즉 공식과는 달라 보이지만 스크립트로 표현한 값이 결과적으로는 똑같은 값을 나타내고 있다는 것을 알 수 있다.

t 라는 시간변수를 동원해서 프로그램을 할 수도 있겠지만, 플래시 특성상 플래시 프로그램이 프레임 방식이라는 것을 잘 이해하면 t 라는 시간변수를 사용하지 않고도 자유낙하 운동을 간단하게 표현해 낼 수 있는 것이다.

같은 방법으로 자유낙하 운동의 이동거리를 액션스크립트로 표현해 보아라

 


 

다. 자유낙하 운동 시뮬레이션

1)고려해야 할 사항에 대해 토의해 보고 변수명을 정해보자.

 

공의 인스턴스명 (ball)
중력가속도(g=1)
프레임 속도 30fps
화면크기 550*400

 

ball 무비클립을 마우스로 드래그 해서 원하는 위치에 가져다 놓고 마우스를 때는 순간 자유낙하 운동을 하도록 만들어 보자 .그러기 위해선 앞에서 배웠던 startDrag 문을 적당히 사용해야 할 것이다.

또 startDrag 하는 동안 자유낙하 운동이 일어나지 않게 하기 위해서는 어떻게 해야 할까. check1 이라는 변수를 사용하여, 마우스로 ball 의 위치를 이동시킨후 마우스를 때는 순간 자유낙하 운동이 발생할 수 있도록 해보자. 그리고 바닥에 충돌후 다시 튀어 오르는 것도 조건문을 활용하여 만들어 보자.

2) 액션스크립트 작성

 

//초기값
g = 1; //중력가속도 값
vy = 0; // 속력 초기값
sy = 0; // 위치 초기값
check1 = 0; // 자유낙하 여부 결정 0이면 동작정지, 1이면 작동
onEnterFrame = function () {
if (check1 == 1) {
vy = vy+g; //vy 속력에 중력가속도 값 더해서 속력 증가
sy = sy+vy; //sy 이동위치 증가
ball._y = sy; // ball 의 y 위치를 이동위치와 같게 해줌
// 만약 볼이 바닥에 닿으면 속력 방향 바꾸어줌
if (ball._y>400-ball._width/2) {
vy = -1*Math.abs(vy)-g;
}
}
}
//볼을 마우스로 누르면 따라오게 함
ball.onPress = function() {
this.startDrag();
check1 = 0; //볼을 이동하는 동안 자유낙하를 중지시킴
}
//볼에서 마우스를 때는 순간 초기 변수값을 재조정 하고 떨어지게 함
ball.onRelease = function() {
this.stopDrag();
check1 = 1;
vy = 0;
sy=ball._y;
}

 

<마우스로 볼을 잡아서 올렸다가 놓아보자>

fall.swf
다운로드

 

바닥과 충돌 후 같은 높이까지 튀어 오르지 않도록 하려면 어떻게야 할까. 즉 완전 탄성충돌이 일어나지 않게 하려면 바닥과 충돌한후 마찰력에 의해 감쇠효과가 나타나야 한다. vy = -1*Math.abs(vy)-g; 값에서 -1을 -0.9 로 바꾸어 보자. 다른 값으로도 바꾸어 보자.
<-1을 -0.9로 바꾸면>

fall2.swf
다운로드

 

 

자유낙하운동.fla
다운로드

 

자유낙하운동2.fla
다운로드


<질문> vy=0 으로 바꾸면 어떻게 될까? -1대신 -1.1 로 바꾸면 어떻게 될까?