별로 어렵지 않다. 아마 지금 설명하는 부분은 대부분의 프로그램에서 애니메이션 동작을 위해 사용되는
가장 기초적인 방법일 것이다.
자 먼저, 입자 하나를 만들어 생성할 것이다.
- 입자의 위치를 표현해야함
- 입자의 크기를 표시해야함
- 선택 : 입자의 색을 지정해야함
- 그 외 여러가지 속성들
[입자 A, 원으로 표현]
간단하게 입자를 클래스로 모델링 시켰다.
update() 함수를 통해 실제 입자가 움직이도록 할 것이다.
입자 모델링이 완료되면 이제 움직이도록 해야한다. 이 부분도 아주쉽다.
움직이는 부분은 수치해석분야의 일부인데, 다양한 방법들이 존재한다.
[ Euler Method, Runge-Kutta Method(RK2, RK4), Verlet Method 등... ]
여기서 필자도 최근들어 깊이 공부하고 있어서 각각 설명할 수 가 없다.
공부하고 정리해서 쉽게 알아볼 수 있도록 올려야겠다.
정확도가 필요한 정밀한 시뮬레이션이 아닌이상 대부분 가장 간단한 방법을 사용한다.
운동방정식
[ x = vt ]
가장 기본적인 공식으로 등속운동이다. 수치 해석적 표현으로 바꾸어보자
[ x(i+1) = x(i) + v(i)Δt ]
(i+1) 번째 위치(x)를 나타낸다. 조금 복잡한데 시뮬레이션을 위해 바꿔야 한다.
[ v(i+1) = v(i) + aΔt ]
위 공식은 등가속 공식인데 바꾸면 다음과 같이된다.
[ F=ma 에서 a = F/m ]
가속도를 구하기 위함이다. 힘(F)은 주로 외부에 오는 힘 외력으로 힘을 따로 계산하여 제일 마지막에
무게(m)와 나누어 준다.
아주 짧게 표현을 했는데 이제 모델링 해보자.
최종 모델링이다. 사실 가속도 구하는 부분은 따로 때내어 사용할 수 도 있다.
일단, 여기서 deltatime이라는 변수를 속도와 가속도에 곱하고 있다. 이건 뭥미~.~ 할 수 있다. 한번 보자 !
보통 게임엔진이나 기타 프로그램에서 주기적으로 불리는 update종류의 함수는 프레임당 한번
호출되도록 되어있다. 그럼 프로그램에서는 각 프레임당 걸린 시간을 알려주는데 그것이 deltatime이다.
적분의 개념을 알고있다면 아마 아하! 할 것이다.
여튼 본론으로 돌아와 곱하는 이유는 기기(device)별로 성능이 틀리고 주기가 조금씩 틀릴 수 있기
때문이다. 예를들어
1초에 100만큼 이동하는 물체가 있다고 하자. 물체의 속도는 10.
(deltatime이 없을 경우, 주사율(FPS) : 60 에 맞추어 모델링 했다고 가정)
====================================
(A) (A)
위치 : 0 주사율(FPS) 30 위치 : 50
1초 후
(B) (B)
위치 : 0 주사율(FPS) 60 위치 : 100
====================================
차이가 보이지 않는가?
주사율이 60이란 소리는 1초에 60번 update함수가 호출된다는 이야기다. 만약 그 어떤 경우에라도
주사율이 60이다 이럴땐 문제없지만 아닌 경우 심각하다.
그럼 사용할 경우는 어떨까?
====================================
(A) (A)
위치 : 0 주사율(FPS) 30 위치 : 100
1초 후
(B) (B)
위치 : 0 주사율(FPS) 60 위치 : 100
====================================
만약 deltatime이 주사율 60일때 0.1초가 나왔다고 가정하자 그럼 한 프레임당 0.1초가 걸린다는
소리인데, 주사율이 30으로 반으로 떨어지면서 deltatime은 즉, 프레임당 걸리는 속도는 2배로
증가할 것이다.
좀 더 쉽게 말하면 힘을 주사율만큼 쪼개어서 t시간 이후일 때 문제없이 적용되도록 한 것이다.
deltatime은 위치에 영향을 주는 요소에 곱하면 된다. (속도, 가속도, 힘 등...)
아이고... 벌써 새벽 3시가 넘었다...ㅜㅜ
시뮬레이션 풀 코드는 나중에 업데이트 해야겠다. 원리가 중요하니...
핵피로....