갬장장이
'mathematics/game mathematics' 카테고리의 글 목록 (4 Page)

mathematics/game mathematics

mathematics/game mathematics

[Mathematics] 4. Interpolation

t1~t2동안 s1~s2 사이를 움직이게 하는 함수 Remap(t)를 구하는 방법: 두 개의 함수로 분할한다

mathematics/game mathematics

[Mathematics] 3. 벡터의 외적

이전글에서 오일러각을 이용해 플레이어 카메라의 방향벡터를 구할 수 있었고, 그 벡터의 x, z 성분이 플레이어의 평면 상에서의 방향벡터라는 것도 알 수 있었다. 이때 플레이어의 평면 상의 방향벡터가 forward 벡터가 된다. FPS에서 W나 S를 누르면 바라보는 방향으로 이동하는데, 즉 플레이어의 속도= forward 방향*스칼라*캐릭터 이동속도 가 된다. (여기서 스칼라 값은 W를 눌렀는지 S를 눌렀는지에 따라 결정되며 보통 W를 1, S를 -1로 둔다. 조이스틱에선 조이스틱을 기울인 정도까지 고려해 -1~1 사이의 값을 줄 수 있다.) 마찬가지로 A나 D를 누르면 속도 = right방향*스칼라*캐릭터 이동속도 가 된다. (이 경우엔 D가 1, A가 -1) 종합하면 플레이어의 xz평면 상에서의 was..

mathematics/game mathematics

[Mathematics] 2. Euler angle

오일러각은 어떠한 3차원 회전을 세 개의 값으로 표현하는 방법이다. 각 값은 pitch, yaw, roll이며 다음과 같이 쉽게 이해가 가능하다 pitch: 고개를 위아래로 들었다내렸다 하는것 yaw: 고개를 좌우로 도리도리 roll: 머리를 어깨 쪽으로 까딱까딱 (뭔가 잘 이해가 안 갈때 하는 동작처럼) FPS 게임에 대입하면 마우스의 x는 yaw, y는 pitch에 대응된다. 오일러각을 원점에서 시작하는 3차원 벡터로 변한할 수 있다. (fps의 경우 플레이어 카메라의 방향벡터) 플레이어가 서있는 평면이 xz평면이라고 생각하면 공식은 다음과 같다. (p,y,r) -> (vx,vy,vz) vx = cos y * cos p vy = sin p vz = sin y * cos p (vx, vz) 가 플레이어..

mathematics/game mathematics

[Mathematics] 1. Delta time

게임과 수학 카테고리의 포스트들은 학습 기록용으로 작성중이기 때문에 글이 정돈되지 않을 수 있다는 점 양해 부탁드립니다🙏 본 카테고리의 글들은 Dunn and Parberry의 책 에서 다루는 내용들 위주로 작성되고 있습니다. 30 fps인 게임에서의 dt(delta time)는 1/30s이다. 어떤 오브젝트의 현재 변위를 s, 현재 속도를 v, 다음 프레임에서의 변위를 s' 이라고 했을 때 s' = s + dt * v이다. 마찬가지로 현재 속도를 v, 현재 가속도를 a, 다음 프레임에서의 속도를 v'이라고 했을 때 v'=v + dt * a 이다.

mathematics/game mathematics

오일러 각도 (Euler Angle)

오일러 각도: 3개의 값 만으로 모든 3차원 회전을 표현하는 방법. Pitch - 고개를 끄덕거릴 때 변하는 값 Yaw - 고개를 좌우로 흔들 때 변하는 값 Roll - 목을 스트레칭 할 때 머리를 어깨 쪽으로 기울일 때 변하는 값 (P,Y,R) 순으로 쓴다. 오일러 각도를 3차원 벡터로 변환하는 법: (x, y, z) = (cos Y cos P, sin Y cos P, sin P) 참고:

mathematics/game mathematics

Linear Interpolation (선형 보간)

*interpolate (약어 lerp) 구현방법1. Approach 함수 Approach(G, C, dt) if G - C > dt: return C + dt if G - C < -dt: return C - dt else: return G 매 게임 프레임마다 Approach()의 결과값을 다시 Approach의 C값에 집어넣는다. 그러면 G에 dt씩 근접해간다. (dt를 더할 수도 뺄 수도 있다) 실제 사례에 적용 - WASD로 이동할 때 그냥 바로 캐릭터의 velocity를 상수로 바꿔버리면 움직임이 부자연스럽다. 따라서 WASD를 눌렀을 때 VelocityGoal을 상수로 설정하고, 매 프레임(Update())마다 Approach(캐릭터.velocity, 캐릭터.velocityGoal, dt)를 실..