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

mathematics/game mathematics

mathematics/game mathematics

[Mathematics] 12. TRS Matrix

3차원 공간에 있는 오브젝트의 가장 기본적인 물리적 연산 세가지가 바로 Translation(이동), Rotation(회전), Scaling(크기 변환)이다. 그동안 앞선 글들에서 우리는 이 세가지의 기본 연산을 행렬곱으로 표현할 수 있음을 배웠다. 그렇다면 이 변환들을 해주는 행렬들을 미리 다 곱해놓으면 단 한 번의 행렬곱으로 모든 물리적 연산을 표현할 수 있지 않을까? 실제로도 그렇다. 그러나 여기서 주의해야 하는 것은 어떤 연산을 먼저 하는지가 중요하다는 점이다. 위 사진처럼 물체를 이동시킨 후 회전시키고 그 다음 크기를 변화시키면 우리가 원하는 결과가 나오지 않았음을 알 수 있다. 때문에 우리는 항상 Scaling, Rotation, Translation의 순서로 연산을 해주어야 한다. 이 연산은..

mathematics/game mathematics

[Mathematics] 11. Translation

x,y,z에 v 벡터를 더해주는 대신 사진 하단처럼 4x4 행렬을 만들고 그 행렬에 (x,y,z,1)을 곱해주는 것으로 결과값을 구할 수 있다. 이는 캐릭터 이동 등에 쓰일 수 있다. 이때 쓰인 4x4 행렬을 이동행렬(Translation Matrix)라고 한다.

mathematics/game mathematics

[Mathematics] 10. Rotation

3차원 회전에 대한 각 축별 회전행렬(Rotation Matrix)도 같은 원리로 도출할 수 있다. 회전방향은 마찬가지로 기준이 되는 축에 대해 반시계 방향이다. (위 식을 보면 2차원 회전행렬과 3차원 z축 기준 회전행렬이 거의 유사함을 볼 수 있다) void Matrix4x4::SetRotation(float flAngle, const Vector& v) { // Normalize beforehand TAssert(fabs(v.LengthSqr() - 1) < 0.000001f); // c = cos(angle), s = sin(angle), t = (1-c) // [ xxt+c xyt-zs xzt+ys ] // [ yxt+zs yyt+c yzt-xs ] // [ zxt-ys zyt+xs zzt+c ..

mathematics/game mathematics

[Mathematics] 9. Scaling

어떤 벡터의 크기를 키우거나 줄이려면 Identity Matrix의 각 열벡터에 상수배를 해준 후 Identity Matrix에 벡터를 곱해주면 된다. 이때 만약 I 대신 다른 기저벡터 좌표계에 대해 크기를 변경하고 싶다면 I 대신 그 기저벡터들을 열벡터로 가지는 행렬을 대신 사용하면 된다.

mathematics/game mathematics

[Mathematics] 8. 좌표계 변환

어떤 좌표계A에서 좌표계B로 좌표를 이동시키거나 그 반대로 이동시키는 방법을 나타내면 다음과 같다. 위 예시에서는 Our coordinates는 기본적인 3차원 좌표계이며 Jennifer's coordinates는 기본 좌표계에서의 벡터 (2,1), (-1,1)을 basis 혹은 기저벡터로 하는 좌표계이다. 이때 Jennifer의 좌표계에서 표현된 어떤 좌표를 우리 좌표계의 표현방식으로 표현하려면 위처럼 jennifer의 기저벡터를 행렬A로 표현한 후 A에 좌표를 곱해주면 된다. 반대로 우리 좌표계에서의 좌표를 Jennifer의 좌표계에서 표현하려면 A의 역행렬에 좌표를 곱해주면 된다. 참고: https://youtu.be/P2LTAUO1TdA (영상 후반부의 다른 좌표계로의 rotation을 하는 법도..

mathematics/game mathematics

[Mathematics] 7. Billboarding

둠이나 단간론파처럼 스프라이트가 2D이지만 게임 저체는 3D인 환경에서 스프라이트가 항상 플레이어를 바라보도록 하려면 어떻게 해야할까? 플레이어, 그리고 스프라이트의 3차원 상의 위치가 주어졌다고 가정하자. (E, P) 일단 스프라이트에서 플레이어로 향하는 방향을 구하면 F = P - E 이다. 이걸 구하면 우리는 플레이어의 시야와 스프라이트가 우측으로 90도를 이루는 R벡터를 구할 수 있다. 어떤 두 벡터를 외적하면 그 두 벡터 모두에 수직인 벡터를 구할 수 있다는 것을 우리는 이미 한 차례 다뤘었다. R = F x (0,1,0) (여기서 F와 외적중인 벡터가 (0,1,0), 즉 global한 up vector임을 기억하자. U벡터는 스프라이트 자체의 상대좌표계상에서의 up벡터를 의미한다.) 이제 F와..

mathematics/game mathematics

[Mathematics] 6. 총알 소리 (Bullet whizzes)

총알이 어떤 경로를 따라 발사되었을때 주변의 플레이어에게 총알이 바람을 가르는 소리를 들려주려고 한다. 이때 음원의 위치는 어디가 되어야 하는가? 플레이어의 위치를 P, 총알의 발사경로를 a, proj a b를 b프라임이라고 할때 우리는 간단한 벡터 연산을 통해 a와 b와 세타각을 이용해 b프라임을 표현 가능하다. (b 프라임이 음원의 위치이다.)

mathematics/game mathematics

[Mathematics] 5. AABB Intersection

삼각형의 닮음 성질을 이용해 어떤 벡터와 x,y 축에 평행한 변을 가진 사각형의 collision check를 하는 방법이다. 3차원에서도 여기서 축 하나만 더 추가하면 같은 원리로 판정이 가능하다. 만약 사각형이 축에 평행하지 않다면 어떻게 해야 할까? 뒤에서 다루는 내용인 사각형의 각 좌표에 TRS Matrix를 곱해주어 사각형이 회전한 상태라고 가정해보자. 이 상태에서 어떤 벡터(직선)와의 충돌을 판정하려면 단순히 이 사각형을 다시 축에 평행하게 이동시키고, 이 벡터도 동일한 상대적 위치를 유지하도록 이동시켜주면 된다. 정리하면, 각 변이 축에 평행하지 않은 사각형과 어떤 벡터의 충돌을 판정하려면, 사각형의 꼭짓점들과 판정하려는 벡터에 TRS의 역행렬, 즉 S^-1 * R^-1 * T^-1을 곱해주..