Post Lists

2018년 8월 27일 월요일

Physics, Part 3 : Collision Response

http://chrishecker.com/images/e/e7/Gdmphys3.pdf

Physics, Part 3: Collision Response
이전에 경험 있는 사람에게 물어봐라, 그러면 그들은 너에게 내가 운전할 때 차에 타지 말라고 말할 것이다. 몇 가지 이유 때문에, 차와 나는 그냥 잘 친해지지 않는다. 또는 아마도, 나는 나의 차의 앞 쪽이 뒤 쪽과 정말 친하다고 말할 것이다 - 다양한 추가 부분들 - 다른 차들의.

나의 운전 실력들은 견뎌낼만 하지 않지만, 오늘의 주제는 충돌을 피하는 방법이 아니라ㅣ (내가 명확히 쓰지 않도록 자격이 있는 주제이다),  오히려 "collision response"이다 - 우리가 충돌이 있다는 것을 이미 알기만 한다면, 무엇을 해야 할지에 관한 것이다.

너는 아마도 게임 물리에서 우리 시리즈의 맥락에서, "collision response"라는 용어가 구급차를 부르는 것을 언급하지 않는다는 것을 추측할 수 있다 (나의 일상 통근의 상황과는 대조적으로). 그 용어는 physical simulator에서 충돌 과정에서의 두 번째 절반을 언급한다. 그 첫 번째 절반은 "collision detection"이다. 실제 세계에서, 부딪히는 유리의 소리는 우리가 필요한 충돌 탐지이지만, 같은 것이 우리의 시뮬레이터에 해당하지 않는다. 거기에서 우리는 충돌을 위해 우리의 도형을 explicitly하게 검사할 코드가 필요하다. 충돌 탐지는 그 자체로 칼럼의 한 시리즈로 가치 있다. 그러나, 물리적인 것 보다는 좀 더 기하 문제이다. 그래서 이 칼럼을 위해서, 우리는 너가 이미 충돌을 탐지하는 방식을 가지고 있다고 가정할 것이다 (우리는 나중 칼럼에서 충돌을 탐지하는 문제로 돌아갈 것이다). 그 physics simulator는 collision detector로부터 어떤 정보를 요구한다; 우리는 이 정보를 확인할 것이다. 우리가 충돌 반응 공식을 개발해야하고, 그 컬럼의 끝에서 그 요구사항을 요약해야하기 때문이다.

일단 우리가 충돌을 탐지하기만 한다면, 재미있는 물리 수학이 시작된다. 우리가 그 오브젝트를 그 충돌(impact)에 반응하여 어떤 방향으로 움직일지를 결정하려고 노력하기 때문이다. 우리는 rigid bodies사이의 충돌로 우리의 범위를 좁힐 예정이지만 (그래서 우리는 내가 의심하지않는 자동차 타는 사람에게 달려갈 때 일어나는 모든 굽혀진 것들을 모델링 할 수 없을 것이다), 우리는 여전히 너가 이전에 보았던 것보다 더 잘할 수 있다. 대부분의 현재 게임들은 간단한 벡터 반사(vector refletions)를 하고, 또는 아마도 그 오브젝트의 질량을 고려한다. 그러나, 이 시리즈를 위한 우리의 목적을 유지하여, 우리는 좀 더 정확한 (그리고 흥미로운) 충돌 반응을 할 것이다. 우리의 오브젝트들은 그것들이 더 가벼운 물체를 무거운 물체로 던질 때 충돌할 때 회전하고 굴러 떨어질 것이다. 그리고 이것은 그들이 중심을 쳤을 때 서로에게 회전을 주게 된다.

Impulsive Behavior
충돌 과정 이해를 시작하기 위해서, 우리가 A와 B로 라벨링 된 두 오브젝트를 가진다고 상상하자. 그것들은 한 점 P에서 막 충돌하려 한다. 우연하게도, 그림 1은 이러한 그 오브젝트들을 보여준다. 실제로 두 오브젝트들에서 한점 P가 있고, 그래서 나는 오브젝트 A의 CM에서 그것의 점 P까지를 r^{AB}로 이름을 붙이고, 마찬가지로 B에 대해 r^{BP}를 이름 붙인다. 또한 P들의 속도를 v^{AP}와 v^{BP}라고 표기하자. 한 순간의 생각은 P들이 충돌이ㅡ 순간에 같은 정확한 위치에 있을 지라도 (또는 P에서 충돌이 없을지라도), 그 순간에 그것들의 속도는 꽤 다를 수 있다 - 만약 한 오브젝트가 정지해 있다면, 예를들어, P들의 속도를 고려한다면, 우리는 그것들의 상대적인 속도를 v^{AB}로 정의할 수 있다.



좀 더 중요하게, 만약 우리의 collision detector가 우리에게 충돌의 "normal vector"를 공급한다면 (n으로 표기되고, 전통적으로 body A를 향한다), 우리는 그 "relative normal velocity(상대적인 법선 속도)"를 충돌 normal 방향에서의 상대적인 속도 component로 정의할 수 있다.



한 normal vector를 선택하는 것은 아래에서 토론하듯이, 까다로울 수 있다. 그러나, vertex/edge collision의 경우에 - 그림 1에서 처럼 - normal이 그 edge에 수직하다는 것이 꽤 명백하다. Eq.2는 우리가 충돌에 대한 기준을 정의할 수 있게 한다:

한 몸체의 한 점이 따른 몸체의 한 점을 
negative relative normal velocity (음의 상대 법선 속도)로 
닿을 때 충돌이 발생한다.

이 문장은 Eq.2가 접촉 점에서 음수여야 하는 것을 말하고, 그렇지 않으면, 충돌이 없다는 것을 말한다. 다음의 세 가지 경우를 고려해라: 만약 Eq. 2가 0보다 더 크다면, 그러면 그 점들은 서로를 떠나고있고, 그래서 우리는 그것들을 무시할 수 있다. 만약 그것이 0이라면, 그 점들은 부딪히지도, 분리되고 있지도 않다 - 접촉(contact)이라고 불려지는 상황이다 - 그래서 우리는 future column에서 그 문제를 다룰 것이다. 마지막으로, Eq.2가 0보다 작다면, 그러면 그 점들은 서로 부딪히고 있고, 그래서 우리는 그것들이 관통하지 않도록 하기 위해 어떤 것을 할 필요가 있다. 그 어떤 것은 collision response이다.

collision response를 위해 해야할 명백한 것은 두 오브젝트에 대해 힘을 적용하는 것이지만, 그것은 실제로 rigid bodies에 대해 그 일을 하지 않는다. 한 힘은 그 몸체가 서로 관통하게 하지 않을 것이다. 왜냐하면 한 힘은 즉각적으로 한 속도를 바꿀 수 없기 때문이다. 즉, 한 힘은 속도를 바꾸는데 시간이 걸린다 - 그것은 시간에 대한 적분을 통해서만 그렇게 할 수 있다. 우리가 이전 컬럼들에서 배웠듯이, 그러나 우리의 오브젝트들은 이미 닿고 있다. 그래서 우리는 그 힘이 그것의 일을 하도록하고 그 negative relative normal velocity에 대응하는 것을 허용할 추가 시간을 가지고 있지 않다. 우리는 그것들의 속도를 즉각 바꾸어야만 한다. 그렇지 않으면 우리의 오브젝트들은 서로의 안으로 움직일 것이다. 어떻게 우리는 이 불연속적인 속도 변화에 영향을 줄 수 있는가?

우리가 이제까지 배웠던 물리에 대해 생각해 보자. 어느곳에서도 linear 또는 angular 둘 중 하나의 속도가 즉시 변화하지 않는다. 둘 다는 오직 적분을 통한 힘과 torques 의해 변화한다. 그리고 이것은 정의에 의해 속도 변화가 연속적이라는 것을 의미한다. 그러나 rigid body collision의 경우에, 우리는 그 속도를 즉각 바꾸어야만 한다. 그것은 새로운 양에 대해 요청한다: "impulse(충격)"

우리는 이 시점에서 다른 양을 도입하는 것에 대해 기분이 나빠선 안된다. 결국, 서로 관통할 수 있는 rigid bodies의 우리의 idealization은 우리에게 이 불연속적인 속도 mess를 가져다 준다; 우리가 그것에서 우리 자신을 빼내오기 위해,  좀 더 idealize하는 것은 놀랍지 않다.

실 세계 충돌에서, 우리가 직접 시뮬레이션할 수 없는 많은 복잡한 원자의 것들이 발생한다. 따라서, 우리가 rigid bodies로 실 세계의 오브젝트들을 근사하는 같은 방식으로, 우리는 실 세계 collision process를 idealized된 model로 근사할 필요가 있다. 충격들은 이 모델의 일부이다.

한 충격은 적분이 그것을 하도록 기다리지 않고 속도를 직접 변화할 수 있다 - 한 힘이 해야만 하는 것이다. 너는 한 충격을 정말 짧은 순간에 대해 적분된 큰 힘으로 생각할 수 있다. 그 힘은 너무 크고, 시간의 양은 너무 작아서, 우리는 극소의 시간 주기에 대해 더 이상 거의 무한한 힘을 다루고 있지 않고, 완벽히 유한한 impulse(충격)으로 다루고 있다. 그래서 힘이 시간에 대한 운동량을 변화시키기 때문에 (F = dot(p)를 기억해라), 우리의 충격은 운동량을 즉시 변화시킨다. 그리고 이것은 차례로 우리의 속도를 바꾼다 (mass * velocity라는 운동량의 정의에 의해서). 우리는 그 지점, 충돌 순간에 충격을 계싼하고 적용할 수 있고, 그래서 이러한 충격들은 몸체의 속도를 바꾸고, 그것들이 서로 관통하는 것을 막을 것이다.

그러나 우리는 적용하기 위해 어떻게 충격을 계산하는가? 이것이 충돌 반응의 중심 문제이다. 그 충격의 크기와 방향을 계산하는 많은 방법들이 있다. 그리고 이것은 너가 얼마나 현실적이길 원하는지에 의존한다. 공간의 이익을 위해, 우리는 상대적으로 간단한 모델을 할 것이지만, 우리에게 우리가 원하는 흥미로운 angular collision을 줄 것을 할 것이다. 그 시리즈의 나중에, 우리가 수학에 더 편해졌을 때, 우리는 좀 더 복잡한 근사를 시도할 것이다.

우리가 사용할 충돌 모델은, "Newton's Law of Restitution for Instantaneous Collisions with No Friction. (마찰이 없는 즉각 충돌에 대한 뉴턴의 복구 법칙)" 이다. 이 모델의 가장 쉬운 부분은 "instantaneous" 부분이다. 그 모델은 충돌 과정이 시간이 걸리지 않는다고(no time) 가정한다. "no time"은 매우 작은 양이기 때문에, 우리의 일반적인 미충돌(noncollision) 힘의 모든 것은 그 충돌동안 사라져버리고, 오직 충돌 충격(collision impulses)만이 계산된다. 따라서, 중력과 같은 미충돌 힘들은 충돌동안 고려되지 않는다. 비록 그것들이 실제로 충돌 전후에 효과가 있을지라도.

뉴턴의 복구 법칙은 또 다른 새로운 양을 도입한다, "coefficient of restitution(반발 계수, 나는 복구 계수라고 하여 좀 더 직관적으로 이 이름을 이해하는게 좋다고 생각한다)" (보통 e 또는 ϵ으로 표기되는, lowercase epsilon). 복구 계수는 단일의 스칼라로 충돌하는 몸체의 복잡한 compression(압축)과 restitution(복구)를 모델링한다. 그리고 이것은 그 접촉 점의 들어오고 나가는 relative normal velocities를 연관짓는다.




Eq.3은 들어오고 나가는 속도를 가리키기 위해 개별적으로 subscript 1과 2를 사용한다. 그 복구 계수 e는 우리에게 들어오는 에너지가 충돌동안 얼마나 흩어졌는지를 말해주는 스칼라값이다. 그것은 e = 1(superball)에서의 elastic collision(탄성 충돌)에서, e = 0(바닥에 떨어지는 점토 덩어리)까지의 plastic collision까지의 범위를 갖을 수 있다.

우리의 충돌 모델은 충돌점에서의 마찰이 없다는 최종적인 간단한 가정을 만든다. 따라서, 충돌에 의해 생성된 충격은 전적으로 normal direction n이다. (어떠한 tangential impulse(접선면의 충격)은 없다). 우리는 그 충격을 그 단일 스칼라 j * normal로 표현할 수 있다. 이것은 우리에게 jn을 준다. 동일하지만 반대의 힘에 대해 뉴턴의 세 번째 법칙은 A에 의해 느껴지는 한 충격은 jn이라고 말하고, 반면에 B에 의해 느껴지는 충격은 간단히 -jn이다.  그리고 이것이 동일하지만 반대의 충격이다. 이제, 우리는 충돌 반응 방정식을 유도할 준비가 되어있다.

Hit Me
시작하는 사람들을 위해, 우리는 회전할 수 없는 오브젝트들에 대한 충돌 반응 방정식을 유도할 것이다. 그러고나서 우리 그것을 따라가서 angular impact 또한 계산할 것이다. 이것은 조금 까다로울 것이다. 그래서 너는 아마 종이 한장이 있어야 한다. 우리가 쓸 첫 번째 방정식은 (현재 모르는) 충격의 영향하에 있는 들어오고 나가는 CM의  속도를 관련 짓는 것이다.




나는 충격은 운동량의 변화라는 것을 명심하여, Eqs. 4a와 4b를 쓸 수 있었다. 그래서 나는 운동량 방정식을 속도의 관점으로 변환하기 위해 각 오브젝트의 질량으로 나누었다. 그 오브젝트들은 아직 회전할 수 없기 때문에, CM의 속도 (v^A와 v^B)는 그 개별 몸체들의 모든 점의 속도이다; 우리는 방정식 1에서 v^{AP}를 v^A로 바꿀 수 있고 B에 대해서도 같은 교환을 한다. 다음으로, 우리는 들어오고 나가는 relative 속도를 복구 계수와 연관시키기 위해 Eq.3을 사용하고, Eq.1에서 relative velocity의 정의로 바꾼다. Eqs. 4a와 4b에서 내적으로 대체하고 분배하여, 우리는 다음을 얻는다.





우리는 v 항들이 왼쪽 변에서 Eq.2의 (그 오브젝트가 회전할 수 없다는 가정하에 수정된) relative normal vector를 구성한다는 것에 주목해야 Eq.5를 간단하게 할 수 있다. 우리는 그러고나서 scalar j에 대해 풀수 있고 다음을 찾게 된다 (오른쪽 변의 모든 항들이 충돌 시간에 알려져있다는 것에 주목해라).



우리가 충격의 크기를 알았으니, 우리는 우리의 오브젝트의 새로운 선형 속도를 알기 위해 그것을 Eqs. 4a와 4b에 넣을 수 있다. 처음에 너는 n이 충돌 반응 방정식이 작동하기 위해 단위 길이 벡터일 필요가 없다는 것을 주의해야 한다; 그 다양한 내적(dot product)은 너가 그것을 explicitly하게 표준화 하지 않고 n에 대해 단위길이의 크기가 아닌 것을 제거하게 할 것이다 (따라서 표준화에 따라오는 square root를 무시한다). 물론, 만약 너가 n이 단위 길이라는 것을 안다면, 너는 Eq.6의 분모에서 몇 가지 곱들을 피할 수 있다.

주의해야 할 두 번째 것은 이러한 같은 방정식들이 빌딩이나 땅과 같은 고정되어있어야 할 또 다른 rigid body와 충돌하는 움직이는 rigid body를 다룰 수 있다는 것이다. 이것을 보기위해, 그 오브젝트들 중 하나의 질량이 증가할 때 무엇이 발생하는지 보아라: 그 오브젝트에 대한 충격 효과가 감소한다. 이것을 무한의 질량으로 취해라. 그러면 그 오브젝트 상호간의 모든 질량은 0으로 된다. Eq. 6은 더 이상 그 오브젝트의 질량을 포함하지 않고, 그것은 고정된 오브젝트와의 충돌에 대한 방정식으로 퇴화한다. 실제로, 그 무한히 무거운 오브젝트는 고정되어질 필요는 없다, 그것의 속도는 여전히 Eq.6에 존재하기 때문이다. 그러나 만약 그것이 움직인다면, 그것은 어떤 dynamically simulated object를 쓸어버릴 것이고, 쿡 찌르는 것처럼 느껴지지 않을 것이다 (그러한 오브젝트는 운동학적으로 움직여지고 있다. 그것이 mass, force, and impulse의 운동량을 무시하고 있기 때문에).

마지막으로 너가 A의 질량을 1로, B의 질량을 무한으로하고, 그것의 속도를 0으로 하고, 복구계수를 1로하고, n을 단위길로 한다면, 너는 한 normal에 대해 벡터 (v^A)를 반사시키는 방정식을 인지할 것이다.

Spin Out
우리가 준비되었으니, 우리는 완전한 2D collision response equations를 끌어낼 수 있다. 그리고 angular velocity에 대한 항을 포함하여. 이것을 하기 위해서, 우리는 지난 칼럼에서 한 회전하고 평행하는 rigid body에서 임의의 점들의 속도를 계산하기 위해 배웠던 방정식을 사용할 필요가 있다.



나는 subscript 2를 사용하여 충돌 후의 속도를 위해 Eq.7을 썼다, 그러나 그것은 또한 너가 2를 1로 바꾼다면 충돌 전의 속도에 대해서도 유효하다.

다음으로, 한 충격의 영향에 있는 선형 속도에서의 변화를 위한 Eqs. 4a와 4b를 썼던것과 같은 방식으로, 우리는 충격이 적용될 때의 linear and angular 속도에서의 변화의 방정식을 쓸 수 있다. 여기에서 나는 body A에 대한 방정식을 쓴다:




Eq. 8a는 우리의 linear collision example과 비슷하다. 반면에 Eq. 8b는 body A에 점 P에서의 충격량 jn을 적용한 결과이다. 오른쪽에 있는 마지막 항은 linear impulse를 우리가 linear force를 지난 컬럼에서 torque로 변환했던 방식과 정확히 같은 방식으로 angular impulse로 변환한다: 적용점에 대해 perp-dot product를 사용하여. 충격은 angular momentum을 바꿀 것이기 때문에, 나는 Eq.8b를 angular velocities에서의 방정식으로 바꾸기 위해 CM에서 관성모멘트(the moment of inertia)로 나눈다.

Eqs. 8a와 8b는 함께 충돌 충격이 어떻게 body A의 충돌 전 속도에 영향을 주는지를 보여준다. body B에 대한 방정식은 j가 -j로 바뀔 때와 같다. 그 충격은 같고 반대방향이기 때문이다. 우리의 남은 작업은 j에 대해 푸는 것이고, 그러고나서 그것을 Eqs. 8a와 8b에 충돌을 해결하기 위해 넣는 것이다.

j에 대해 푸는 것은 이전 예시에서 같은 어느 정도의 대수를 포함한다. 처음에, Eq.3으로 시작하고, v^{AB}를 Eq.1에서의 정의로 바꾸고, Eq.7을 v^{AP}로 대체하고, 그것의 쌍둥이를 v^{BP}로 바꾸어라. 그러고나서, 아직 모르는 충돌 후 linear and angular 속도에 대해서, Eqs. 8a와 8b를 대체하고 그것들의 B versions을 대체해라. 그 항들을 모으고, 이전 충돌의 relative normal velocity에 대한 표현을 인지하도록 해라 (같은 방식으로 우리는 그것을 Eq.6에서의 부낮로 가져왔다), 그리고 j에 대해 풀어라. 우리는 그러면 끝났다





우리가 j를 계산했다면, 우리는 그것을 Eqs .8a와 8b에 넣고 (j를 음수화하고 B에 대해 동일한 방정식에 그것을 넣는 것을 잊지말아라), 그리고 우리는 충돌 반응이 끝난다. 그 충돌하는 몸체들은 떨어져서 날아가고, 그것들의 들어오는 속도와 질량을 기반으로ㅓ 정확한 회전으로 완성된다.

A Little Touch Up이제 너는 충돌 반응 방정식을 알았으니, 그것들이 우리의 전반적인 시뮬레이션 루프에 어떻게 맞는지를 봐보자. Lsting 1은 같은 프로그램에서 충돌 탐지와 반응을 지원하는 simulation loop에 대한 슈도코드를 보여준다. 나는 마지막 이슈를 슈도코드에 대한 단계별 알고리즘으로 바꾸었다. 왜냐하면 그 루프가 충돌을 다루도록 확자오딜 떄 좀 더 복잡해지기 때문이다.

이 새로운 복잡성의 근원은 충돌의 "정확한" 시간을 계산하는 것이다. 우리가 처음에 full time step으로 앞으로 integrate한 것에 유의해라. 만약 새로운 설정에서 상호 관통이 있다면, 우리는 그 시간 간격을 다시 나누고 다시 시도한다. 그 알고리즘은 충돌의 시간을 찾는 time step의 binary search를 하게 되는 것이다. 이것은 필수적으로 충돌 시간을 찾는 가장 효율적인 방법은 아니다. 왜냐하면 우리는 우리의 이전 적분 작업을 버리는 것이기 떄문이다. 그러나 그것은 간단하고 튼튼하다. 이 문제에 대한 다른 솔루션들은 그 충돌이 언제 발생했는지를 측정하는데 돕기위해, 이전의 integration parameters들을 사용하는 것을 포함한다. 그리고 collision이 발생할 곳에서 미리 앞서서 예측하려고 한다. 또는 심지어 관통하는 좌표를 사용하려하고, 그것이 너무 나쁘게 보이지 않도록 한다. 또한, 이 discrete collision routine은 "tunneling"을 잡지 못한다. tunneling에서, 빠르게 움직이는 오브젝트들은 완전히 다른 오브젝트들을 한 번의 적분 step에서 뚫고 움직일 수 있다.

한 관통하지 않는 configuration이 발견되기만 한다면, 우리는 그 충돌을 해결한다 - 만약 존재한다면 - 그리고 그 설정을 업데이트한다. 그러고나서 우리는 time step을 마무리짓기 위해 루프를 다시 돌리고, 마침내 그 오브젝트들을 그린다.

충돌 반응 방정식으로부터, 우리가 충돌에 대한 4가지 데이터를 알 필요가 있다는 것이 명백해질 것이다: 충돌 시간, 충돌에 참여하는 오브젝트들, 그러한 오브젝트들의 충돌점, 그리고 충돌 normal. 이러한 파라미터들 각각은 몇 가지 미묘함을 갖는데, 우리는 차례로 알아볼 것이다.

너는 내가 "정확한"이라는 단어를 첫 번째 요구되는 데이터를 언급할 때 몇 문단 전에 인용한 것을 알 것이다 : 충돌 시간. 그 이유는 너가 컴퓨터에서 numerically하게 작업할 때 정확한 충돌 시간 같은 것들이 없기 때문이다. 우리는 collision detection을 위해서 tolerance value (허용값)을 사용하도록 강요된다. 그리고 그 값 내에서, 우리는 우리가 충돌하고 있다고 (관통하기보다는 또는 닿지 않고있다기 보다는) 말하는 것을 동의한다. 그 샘플 코드는 이 테크닉을 보여준다.

다음의 정보는 - 충돌하는 오브젝트들의 모음 - 명백한 것처럼 보이지만, 우리의 현재 알고리즘이 오직 두 몸체들 사이의 하나의 충돌만을 다룰 수 있다는 것에 주목해라. 유사한 한계가 세 번째 파라미터, 충돌점에 대해서도 유효하다. convex polygons(볼록 다각형) 사이의 2D 충돌에서, 너는 collision "manifold"를 의미하는 한 edge/edge collision을 얻을 수 있다 - 닿고 있는 오브젝트들의 부분을 나타내는 공간이다 - 그 manifold는 더 이상 점이 아니라, line segment이다. 너는 이 충돌의 종류를 위해 line segment의 정점들을 사용하여 해결할 수 있지만, 심지어 그것은 우리의 현재 충돌 response routine의 힘을 넘어서는 것이다. 그것은 오직 하나의 충돌점을 다를 수 있고, 많은 동시의 충돌점들을 다루지 못한다. 동시에 발생하는 충돌들은 더욱 어렵고, 다음 시간을 기다려야 할 것이다. 상황은 3D에서 좀 더 악화된다. 거기에서 너는 convex 다면체로 점, 변, 그리고 면 충돌을 얻을 수 있고, 충돌 탐지와 반응은 너가 곡면에 들어갈 때 악몽이 된다. 어쨋든, 그 샘플 프로그램의 충돌 탐지기는 현재 오직 하나의 충돌점을 반환하고, 우리가 flat-edged bounces를 얻지 못할지라도 (그것은 항상 한 점이 처음에 때리는 것처럼 보인다), 그것은 여전히 보기 좋다.

Collision normal은 애매함이 발생하는 마지막 장소이다. 2D에서, edge/edge or a vertex/edge collision에서, normal vector는 edge에 수직인 벡터로서 쉽게 획득가능하다. 그러나, vertex/vertex collision에서, 너는 collision normal을 사용하기 위해 합리적인 벡터를 고를 필요가 있다. 그 샘플 프로그램은 vertex/vertex collisions을 vertex/edge collisions으로 다루어서 이 문제를 피한다. 하지만 그것은 비현실적인 행동으로 이끌 수 있다.

이 자료에 대한 레퍼런스들은 전체 컬럼의 공간을 채울 것이고, 또 다시 한번, 나는 그것들을 나의 웹시아티ㅡ에 채울 것이다. 내가 여기에서 사용한 유도는 physically based modeling에서의 그의 SIGGRAPH tutorial에서 David Baraff의 방젖ㅇ식들과 유사하다 (그것은 나의 레퍼런스 안에 있다). 수학과 물리의 대부분 결과처럼, 같은 방정식에 도달하는 많은 방식들이 있다. 그것들은 에너지와 운동 보존의 법칙을 기반으로 한 유도와, "generalized coordinates"라고 불려지는 것들을 기반으로 한 유도를 포함한다. 만약 너가 이 것을 진지하게 공부한다면, 너가 그것들을 이해하도록 많은 다른 방식들로 그 방정식들을 작업하고 싶을 것이다. 너가 더 연습하면 할 수록, 너는 좀 더 좋은 수학자와 물리학자가 될 것이다.








댓글 없음:

댓글 쓰기