post list

2016년 9월 14일

[Particle Animation] 입자 움직이도록 하기

입자를 움직여 보도록하자
별로 어렵지 않다. 아마 지금 설명하는 부분은 대부분의 프로그램에서 애니메이션 동작을 위해 사용되는
가장 기초적인 방법일 것이다.

자 먼저, 입자 하나를 만들어 생성할 것이다.


- 입자의 위치를 표현해야함
- 입자의 크기를 표시해야함
- 선택 : 입자의 색을 지정해야함
- 그 외 여러가지 속성들


[입자 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시가 넘었다...ㅜㅜ

시뮬레이션 풀 코드는 나중에 업데이트 해야겠다. 원리가 중요하니...

핵피로....






2016년 9월 12일

[Particle Animation] 소개

공부한 것을 바탕으로 자료를 올려볼까 한다.
Particle 이란건 찾아보면 입자라고 되어있다. 이 입자들을 어떤 규칙 또는 비 규칙적인 형태로 제어를
할 것이다.
입자를 움직이거나 제어하기 위한 알고리즘은 지금 다 설명해도 소용이 없다. 물론 알고있으면 좋지만
억지로 익힐려고 해도 (특별한 능력?)이 없는 이상 까먹는다.
사실 Particle은 GameEngine인 Unity, Cocos2d, Unreal, Havok 등에 거의 다 구현되어있다.
그럼에도 내가 이 분야를 공부하는 이유는 내가 좋아하기 때문이고 생각보다 응용할 수 있는 부분이
많기 때문이다.

아마 필자보다 더 뛰어난 분들도 많을 것이고 경험적으로 우월한 분들도 있을 것이다.
개인적으로 공부한 것 들이라 부족한 부분이 있으면 바로 지적해줬으면 좋겠다.

필자는 MacBook Air애서 Xcode를 이용하여 OpenGL환경을 구축할 것이다.
언어는 C++를 이용할 것이다.

환경구축에 대한 설명은 따로 하지않겠다. 왜냐하면, Graphic 표현이 된다면 어디에든 상관없다.

조건이 필요하다면 매번 갱신되는 시스템이 필요한데 update함수 같은 녀석이 필요하다.
1초에 위치값이 50 2초에 위치값이 300이면 이걸 갱신할 필요가 있다는 것이다. :D