Post Lists

2018년 8월 28일 화요일

Physics, Part 4 : The Third Dimension

http://chrishecker.com/images/b/bb/Gdmphys4.pdf

Physics, Part 4 : The Third Dimension
이것을 말하게 되서 나는 고통스럽지만, 이것이 나의 마지막 칼럼이 될 것이ㅏㄷ. 이러한 칼럼들을 쓰는 것은 많은 시간이 걸리고, 지금 당장 나는 모든 나의 꺠어있는 시간을 나의 스타트업 게임 회사에 쏟을 필요가 있고, 우리의 첫 번째 게임을 배송하는데 헌신할 필요가 있다. 그러나, 나는 Game Developer's Editor-at-Large에 머무를 것이고, 나는 잡지에 어떤 것을 쓸 것이다 - 나는 심지어 그 중단하는 동안에도 한 자료를 쓸 지도 모른다 - 그러나 이것이 적어도 1년간 마지막 occial Behind the Screen이다. 나는 이 칼럼을 쓰는 것을 좋아한다. 그래서 너는 내가 가능한한 빨리 돌아올 수 있을거라고 확신할 수 있다. 한 편, 내가 이러한 자료들을 쓰는 이유들 중 하나는 게임 개발자들 사이에 정보 공유를 격려하도록 하기 위해서 이다 - 만약 너가 너가 쓰고 싶은 자료에 대한 아이디어가 생긴다면, 그것을 에디터에게 제안하는 데 주저하지 말아라. 우리가 정보를 더 공유할수록, 우리의 산업은 더 빠르게 발전한다. 그리고 그것은 모두에게 좋다.

나의 백조가 노래 부르듯이, 나는 너에게 물리학 시리즈를 끝내기 위해 한 아티클의 이 괴물을 줄 것이다. 두 배의 길이이다! 방정식의 개수도 두 배이다!

Prelude
개인적으로, 나는 2D 물리학이 정말 멋지다고 생각한다. 그러나, 너는 너가 물리 시뮬레이션된 3D object가 벽을 달려나가는 것을 본 처음 순간을 결코 잊지 못할 것이다 - 특히 너가 너의 시뮬레이터를 쓸 때. 또한 더 좋거나 또는 더 안 좋거나, 요즘 나오는 대부분의 게임들은 3D이다. 만약 너가 그 세계의 대부분의 현실적인 사이드 스크롤러를 쓰고 있지 않다면, 너는 이 시리즈에서 처음 세 개의 칼러들의 3D와 동일한 것을 필요할 것이다. 이 회분은 매우 크다, 왜냐하면 나는 모든 세 칼럼들을 하나의 칼럼에 넣을 것이기 때문이다. 이것을 하기 위해서, 나는 너가 처음 세개의 칼럼의 자료들을 안다고 가정할 것이다. 그래서 너는 다시 돌아가서 그것들을 더 나아가기 전에 읽고 싶을지도 모른다.

이전 자료들 처럼, 이 자료는 운동학 섹션과 역학 섹션으로 나눠진다. 운동학은 우리에게 3D 오브젝트의 설정과 그것의 도함수를 어떻게 나타낼지를 말해줄 것이다. 역학은 우리에게 이러한 운동량을 서로 어떻게 연관짓고, 외부의 힘과 torques를 연관지을지를 말해줄 것이다. 대부분, 2D에서 3D로의 변환은 직관적이지만, 너도 보게 되듯이, 3D 방향에 대한 좋은 파라미터화의 부족은 일을 조금 망친다. 그러나 나는 나 스스로 앞설 것이다...

3D Kinematics
처음엔, 쉬운 부분이다. 3D linear kinematics (position, velocity, and acceleration)에 대한 방정식들은 2D 대응물들과 정확히 같다. 그 두 개의 요소를 가진 벡터들은 세 개의 요소로 바뀌고, 너는 다 했다.

불행하게도, 우리가 3D 방향을 고려할 때는 쉽지 않다. 2D에서 멋지게 우아한 방향의 표현을 고려해라: scalar값. 이 보다 더욱 간단해지고 여전히 몇 가지 유용항 정보를 나타내는 것은 어렵다. 우리가 보듯이, 그 방향 값 Ω, 그것의 시간 도함수 ⍵, 그것의 2차 도함수 ɑ는 모두 어떤 방향과 2차원에서의 방향의 변화를 파라미터화 하는 모든 스칼라들이다. 그러나, 단일의 스칼라는 명백히 3D에 들어맞지 않을 것이다. 그러나 무슨 표현이 그렇게 할 것인가?

이 질문에 답을하고, 이 자료를 평소보다 두 배 더 크게 하기 위해서, 나는 많은 수학을 생략하도록 강요받는다. 3D에서의 회전은 놀랍게도 수학에서 거의 모든 분야와 깊을 관련이 있는 풍부한 주제이다. 나의 웹사이트에서 Goldstein에 의한 고전 mechanics text는 3D 방향에 대한 50 page chapter를 가지고 있다. 그러나 그 챕터에서 여전히 많은 장소들이 있는데, 거기에서 Goldstein은 스스로 그 수업에 머물도록 자제해야만 한다. 방향을 피상적으로 다루는 것의 불가능성을 고려하면, 우리는 표현의 우리의 선택을 합리화하는 다음 문단을 쓰는 것에 만족할 필요가 있고, 그러고나서 우리의 표현의 특징을 묘사하는데로 넘어간다.

3D에서 세 개의 angular 자유도가 있다 (three linear and three angular degrees of freedom은 자주 들리는 "6DOF"가 된다), 그래서 우리는 적어도 한 임의의 방향을 묘사하기 위해 세 개의 스칼라를 사용할 필요가 있다. 이 시점에서, 수학은 우리에게 임의의 단점을 준다. 3D 방향의 세 개의 스칼라 파라미터화가 존재하지 않다는 것이 증명하는 것이 가능하다. 나는 이 증명을 하지 않았다 (나는 그것이 몇 가지 꽤 고급의 group theory를 사용한다고 생각하고, 나는 아직 그것을 배우지 않았다), 그래서 나는 너에게 그것이 정확히 어떻게 작동하는지를 말해줄 수 없다. 그러나 나는 그 증거의 요지가 특이성을 포함하는 어떠한 최소 파라미터화가 존재하지 않는다는 것이다. 이러한 특이성은 다른 형태들을 취한다 - 어떻게 너가 그 세 개의 자유도를 할당할지에 의존하면서 - 그러나 수학에 따라서, 그것들을 제거하는 것은 불가능하다. 가장 흔한 3D의 최소 파라미터화, 세 개의 오일러 각도 집합 (roll, pitch, and yaw 는 하나의 가능한 집합이다)을 다루는 사람은 아마도 이러한 특이성에 들어갔을 것이다. 운좋게도, 우리는 오직 세 개의 파라미터만을 사용하도록 강요받지 않는다. 우리는 더 많은 파라미터를 사용하여 트깅성을 피할 수 있다. 우리가 우리의 다양한 파라미터들을 3개의 자유도로 제한하는 한. 이것은 정확히 우리의 방향을 나타내기 위해 우리가 3x3 행렬을 선택해서 할 것이다.

비록 내가 우리는 우리의 방향 파라미터화를 합리화하기 위해 한 문단을 사용할 거싱라고 말했지만, 나는 조금 속일 것이고, "그러한 파라미터들을 제한하여" 내가 의미하는 것을 묘사하는 또 다른 문단을 쓸 것이다. 우리가 2D 위치를  나타내고 싶다고 가정하자. 이것을 하는 명백한 방법은 2D 벡터를 사용하는 것이고, 끝난다. 만약 우리가 특별히 최적이 아님을 느낀다면 - 또는 만약 2D 벡터를 사용하는데 문제가 있다면 - 우리는 2D 위치를 나타내는데 3D 벡터를 사용할 수 있다. 그 벡터의 끝이 한 평면에서 움직이는데 제한되는 한. 우리는 이 제한을 단일의 내적(dot product) 방정식으로 구현할 수 있다. 만약 우리의 변수 3D 위치 벡터와 또 다른 상수벡터의 내적이 항상 상수로 제한된다면, 그 3D 벡터의 끝 부분은 한 평면을 항상 움직여야만 한다. 이 3D 벡터 - single scalar 제약은 그 평면에서 움직이도록 우리에게 오직 두 개의 자유도를 남긴다 - 이것은 처음에 2D 벡터를 사용하는 것과 같다. 규칙으로서, 제약받지 않는 자유도의 원래 개수 - 스칼라 제약의 개수 방정식은 우리에게 최종 자유도의 개수를 준다. 너가 역학에 대해서 배울 때, 이 자유도의 개념과 제약 방정식은 놀랍게도 중요하다.  (그리고 일반적으로 수학에서). 너가 그 아이디어에 편해질 때까지 잠시동안 생각해보아라.

이제, 내가 말 했듯이, 우리는 우리의 rigid body의 방향을 나타내기 위해 3x3 행렬을 사용할 것이다. 명백히, 임의의 3x3 행렬은 9개의 자유도를 가진다 (그 행렬의 각 스칼라에 대해 하나씩), 그래서 우리는 3D 방향을 나타내는데 필요한 세 개의 자유도로 줄일 제약이 필요할 것이다. 우리는 우리의 행렬이 특별한 orthogonal이 되도록 제한하여, 이러한 제약들을 얻는다. "special" 부분은 행렬이 reflection이 아니라는 것을 의미한다 - 그것은 오른손 좌표계에서 왼손 좌표계로 뒤집을 수 없다. "orthogonal" part는 다음의 행렬 방정식에서 온다:



영어에서, A * 그것의 전치인 A^T는 항등행렬을 만든다, 또 다른 방식으로 표현하면, A^T = A^-1 이다 - 전치행렬이 그 역행렬이다. Eq.1은 또한 A^TA = 1을 암시한다. orthogonal matrices의 이론은 적어도 3D 방향의 이론 만큼 크다, 그래서 또 다시, 나는 우리에게 영향을 주는 highlights를 다룰 것이다. Eq. 1은 우리에게 우리의 여섯개의 제약 방정식을 준다. 왜냐하면 그것은 A의 행들의 많은 내적이기 때문이다. 이러한 제약들은 항등행렬의 대각선의 1로부터 온다. 그리고 그것은 행들이 단위 길이라는 것을 의미한다. 다른 세 가지 제약은 0으로 부터이다. 그리고 이것은 그 행들이 모두 서로에게 직교한다는 것이다. 그러한 제약은 우리를 정확히 A에서 세 개의 자유도를 가져다준다. 대부분의 사람들은 3D 회전이 orthogonal하고 Eq.1에 복종한다는 것을 인지하지만, 그 말을 증명하는 것도 또한 가능하다: 그 어떤 specialr orthogonal 3x3 matrix는 회전이다. 우리가 Eq.1의 6개의 제약을 강화하는 한, 우리는 유효한 회전을 갖는다. 부가적인 메모로서, 방향을 나타내기 위해 3x3 행렬을 사용하는 사람들은 아마도 orthogonality 제약이 numerical inaccuracy의 부분에서 강화되지 않을 때 문제에 빠진다. 이 경우에, 너의 "rotation matrix"는 아마도 너의 오브젝트를 스케일링하고 shearing하기 시작한다. 그것들을 회전하게 하는 대신에.

우리는 여전히 mathematical fast-forward mode에 있다. 그래서 나는 special orthogonal matrix가 평범한 old matrix multiplication을 통해 한 벡터에게 작동 (또는 회전)하는 것을 지적할 것이다. 이것은 3x3 행렬이 오일러 각들의 한 집합이라기 보단느 좀 더 편리한 방향 표기인 이유이다 - 오일러 각들은 한 벡터를 회저시키는 삼각함수를 평가하는 것을 요구한다. 또한, 두 special orthogonal 행렬들의 행렬곱은 cumulative rotation(축적되는 회전)이다 (그 곱 BA를 한 열 벡터에 적용시키는 것은 A에 적용하고 그러고나서 B에 적용하는 것과 같다), 그리고 이것은 그 곱이 또 다른 special orthogonal matrix가 되어야 한다는 것을 의미한다. 마지막으로, 행렬 곱은 교환법칙이 안된다 (BA와 AB는 다르다). 이것은 회전의 비교환법칙을 따라한다; 다른 순서로 수행되었을 때, 하나의 다른 최종 방향을 만들어내는 회전의 한 순서를 구성하는 것은 쉽다,

나는 이 시점에서 한 단계 돌아가서, 내가 회전 행렬의 이갸이에서 다소 낯설게 되었는지 설명하고 싶다. 내가 모든 사람들이 행렬이 한 벡터를 회전할 수 있다고, 그리고 행렬의 연속이 작동한다는 것을 아는것을 이해하지 못하는 것인가? 물론, 사실 나는 너가 이것을 안다고 생각한다. 나는 이 칼럼에서 그것을 설명할 공간이 없다. 그러나, 나는 대부분의 컴퓨터 그래픽스 위주의 교재는 회전 행렬을 어떻게 구성하는지를 설명한다 (이러한 장소에 sine과 cosines을 넣어라"), 그러나 그 책들은 회전 행렬의 공식적인 특성에 대한 많은 것들을 말하지 않는다. 역학에서, 우리의 오브젝트들에 그것들의 초기 방향을 준 후에, 우리는 결코 또 다시 처음부터 회전행렬을 구성하지 않는다. 우리의 방향은 우리가 역학 시스템에서 수행하는 적분의 결과로서 나아간다 - z축에 대해서 회전을 만드는 방법을 아는 것은 우리에게 많은 도움이 되지 않는다. 또 다른 중요한 점은 3x3 행렬은 방향이라는 것이다. 그래픽스에서, 우리는 회전을 유발하는 행렬들을 사용하는 것을 배우지만, 이 칼럼에서, 그 행렬은 간단히 방향 표기이다 (그것이 벡터와 곱해졌을 때 회전을 만드는 좋은 특성을 가지고 있다는 것 외에도). 우리는 예를들어 오일러 각을 사용하지 않고, 그것들로 벡터에 작동시키기 위해 행렬들로 바꾸지 않을 것이다; 우리는 행렬을 우리의 오브젝트의 방향의 표기만으로서 저장할 것이다. 그래서 만약 누군가 오브젝트 A의 방향을 요청한다면, 우리는 그나 그녀에게 전체 3x3 행렬을 줄 것이다. 그 행렬이 special orthogonal하다는 보장과함께. 그래서 그것은 정말 한 방향을 표기한다. 만약 우리가 그것이 special orthogonal을 확신하지 못한다면, 우리의 방향 표기는 적절히 잘 작동하지 않을 것이다. 우리가 오일러 각에 대해 간단함을 얻지만, 우리는 그 얻는 것을 되돌려줘야 한다. 왜냐하면 우리의 행렬에 대한 제약을 강화하는 것이 요구되기 때문이다. 나는 내가 3D 방향의 미효함에 대해 좀 더 시간을 쏟을 수 있기를 바라지만, 그럴 수 없다. 그래서 너는 레퍼런스로부터 그것에 대해 발견해야만 할 것이다. 어쨋든, 나와 함께 참고 가라: 너의 현재 행렬에 대한 지식을 취하고, 그것에 너가 여기에서 배운 새로운 것을 더하라, 그리고 우리가 결국에 같은 행렬에 대해서 말고 있다는 것을 깨달아라 - 이제 너는 다른 측면으로부터 그것들을 본다.

방정식을 다루는 것이 오는 것을 위해 준비운동하기 위해서, orthogonal matrices에 대한 기본 결과를 증명하자. 우리는 이 결과를 나중에 사용할 것이다. 어떤 벡터 rr' = Ar에 의해 r'로 바꾸는 회전행렬 A로 시작하자. 이제, 우리가 한 (가급적 회전이 아닌) 행렬 B'r'에 적용하고 싶다고 가정하자. 이것은 A가 그것을 회전하기 전에 r에 적용되는 행렬 B와 같은 효과이다. Symbolically, 우리는 B'Ar = ABr 에서 B'를 알아내고 싶다. 그것을 다른 방식으로 생각해보자. 어떻게 우리는 행렬 BA에 의해서 회전시키는가의 방식으로. 그래서 그것이 prime space에서 작동할지? 우리는 r = 1r인 것에 주목하여 시작한다. 나는 그러므로 항등행렬을 이전 방정식의 오른쪽 변에 넣을 수 있다. 이것은 우리에게 AB1r을 준다 (항등행렬을 넣는 것은 흔한 linear algebra trick이다). Eq.1의 그 항등원 A^TA = 1은 우리에게 B'Ar =ABA^TAr을 준다. 두 항을 비교하는 것은 다음의 방정식을 준다:



Eq.2는 선형대수에서 "similarity transform(닮음 변환)"이라고 불리는 것을 정의한다. 그것은 B가 unprimed space에서 벡터들에게 작동하는 것과 같은 방식으로, primed vectors에 작동하는 primed space에서의 행렬을 얻기위해 B를 어떻게 회전시키는지를 보여준다. 너는 한 오브젝트를 world space에서 local x-axis에 대해 회전시킬 한 행렬을 찾기 위해 Eq.2를 사용할 수 있다. (이 경우에일지라도, 아마도 그 오브젝트가 local space에 있을 때 local x-axis에 회전하는 것이 더 쉽지만, 만약 너가 original r을 가지고 있지 않다면, 너는 Eq2가 필요하다).

Axis and Angle
우리는 방향을 위한 우리의 운동 표기에 대해 결정했지만, 우리는 여전히 kinematic derivatives의 표기를 고를 필요가 있다: angular velocity and angular acceleration. 그렇게 하기 위해서, 우리는 조금 더 세부적으로 우리의 방향 표기를 알아볼 필요가 있다. 나는 너에게 한 가지 더 증명되지 않은 사실을 줄 것이고, 그러고나서 우리는 몇 가지 결과를 느리게해서 유도할 것이다.

그 사실은 어떤 회전 (그리고 이것은 모든 회전의 조합을 포함한다)이 단일의 unit vector와 그 벡터에 대한 회전 각으로 묘사되어질 수 있다는 것이다. 이것은 너가 어떤 너가 좋아하는 어떤 나선형의 회전의 순서든지 연쇄시킬 수 있다는 것을 의미한다. 그리고 만약 너가 나에게 시작과 끝 방향을 말한다면, 나는 너에게 또 다시 방향에 대한 변화를 캡슐화한 단위 벡터와 스칼라를 줄 수 있다. 그 스칼라는 그 벡터에 대해 얼마나 멀리 회전시켜야 하는지를 말한다. 이 회전은 한 단계에서 너의 시작에서 끝 방향으로 너를 데려갈 것이다. (여기에서 우리가 말하는 자유도가 얼마나 많은지에 주목해라: 벡터의 원소들에 대해 3개, 각에 대해 한 개 추가, 벡터의 단위 길이 제약 -1개. 놀랍게도 3개이다)

우리는 또한 직접적으로 단위 벡터와 각도로부터 회전 방정식을 구성할 수 있다. 단위 벡터 n, 그 벡터에 대한 각도 θ 그리고 r을 회전시킬 임의의 벡터로 시작해보자. 그림 1은 그 상황을 보여준다, 최종 벡터로서의 r'가 있는. 만약 우리가 -n을 r과 r'의 끝을 포함하는 회전면에 투영시켜서 본다면, 우리는 그림 2에서의 회전원을 본다. 우리가 삼각함수로부터 알 듯이,  만약 우리가 r의 끝이 이 다이어그램의 x축에 있다고 고려한다면, 이 평면좌표에서 측정되는 그 r'의 끝의 좌표는(x =rcosθ, y = rsinθ)가 될 ㅓㄳ이다. 거기에서 r는 원의 반지름이다. 이 (x,y) 좌표 표기는 그 벡터 합 o + rcosθx + rsinθy 벡터합 또는 "원점 o에서 시작하여, rcosθ만큼 x 벡터로가고, rsinθ 길이 만큼 y벡터를 간다"고 말하는 짧게 말하는 방법이다. 그래서, 우리가 해야할 필요가 있는 모든 것은 그 벡터 o, x, 그리고 y를 3D 공간에서 구성하는 것이다. 그러고나서 2D 회전 공식을 그것들에 적용하는 것이다.

처음에, 우리는 원점을 정의한다. 그 원점은 회전 면에서 그것의 끝이 있는 n과 평행한 벡터이다. 우리는 내적으로 r을 n에 사영시켜 이 벡터를 만들 수 있고, 이것은 최종 거리 n을 움직이게 한다.




Eq.3은 내적에 대해 "matrix notation"을 사용한다. 만약 우리가 그 열 벡터 n을 전치시킨다면, 우리는 행 벡터를 얻는다. 한 행 벡터 * 열벡터 r은 내적과 같고, 스칼라 값을 만든다 (행렬에 대해서, 1xn * nx1 = 1x1). 그 o 벡터는 우리를 회전의 면으로 움직이게 한다. 우리는 사소하게 그 x 벡터를 r의 끝과 o 벡터 사이의 차이로 정의할 수 있다.



우리가 x를 표준화 하지 않는다는 것에 주목해라. 왜냐하면 그것의 길이가 정확히 우리가 원하는 것이기 때문이다 : 회전 원 r의 반지름. 마지막으로, 우리는 n과 r의 외적을 ㅏㅅ용하여 y벡터를 만든다.



그 외적은 n과 r 둘 다에 수직한 y를 만든다. 그러므로, x를 만들어낸다. x는 두 n과 r의 선형 결합이기 때문이다. 그 y벡터는 또한 완벽한 길이이다. 그 외적의 크기는 |r|sinɸ (n은 단위 길이)와 동일하기 때문이다. 그리고 이것은 편리하게 r과 같다. 그 원은 반지름. 너가 그림 1에서 볼 수 있듯이, 그것을 다 합치면, 우리는 다음을 얻는다



이것은 유명한 공식의 한 형태인데, 어느누구도 동의 하지 않는 것처럼 들리는 이름을 가졌다. 나는 그것이 The Rotation Formula, Rodriguez's Formula, 그리고 수 많은 다른 이름들로 불려지는 것을 들었다. 문제는 없다: 우리는 그것을 Eq.6라고 부른다. Eq.6는 n에 대해 r을 theta만큼 회전시킬 것이다. 우리는 실제로 벡터를 회전시키기 위해 Eq.6을 사용하지 않을 것이다. 비로 그것이 올바르게 일을 할지라도. 대신에, 우리는 3D 방향을 위한 유용한 운동 방정식을 증명하기위해 그것을 사용할 것이다. 우리는 또한 Eq.6으로부터 오른쪽변의 r벡터를 뽑아내어 회전 행렬을 구성할 수 있다. 그러나 우리는 공간이 부족하고, 그래서 나는 매우 너가 스스로 그것을 탐험하는 것을 추천한다 (Hint : 3x3 matrix 각 텀에 연관되어있는 것을 알아내려고해라. 그래서 그 행렬 * r이 Eq.6의 항과 같기 위해서. 너는 "tilde operator"가 필요할 것이다 나중에 이야기할.)

































댓글 없음:

댓글 쓰기