| 강체 동역학 Rigid Body Dynamics | |
|---|---|
| 분야 | 고전역학 × 수치적분 × 게임 물리 |
| 핵심 개념 | 관성텐서, 오일러 방정식, 쿼터니언 |
| 지배 원리 | 뉴턴-오일러 운동방정식 |
| 주요 엔진 | PhysX, Havok, Bullet, Box2D |
1. 개요[편집]
안 찌그러지는 물체만 다루면 인생이 편해진다. 문제는 그게 세상에 없다는 것.
강체 동역학(Rigid Body Dynamics)은 변형되지 않는 이상적 물체, 즉 강체(rigid body)의 병진운동과 회전운동을 뉴턴-오일러 운동방정식으로 기술하고 시간에 따라 적분하는 역학 분야이다. 강체란 내부 임의의 두 점 사이 거리가 항상 일정하다고 가정한 물체를 말하며, 이 가정 덕분에 물체의 상태를 질량중심의 위치·속도와 회전 자세·각속도라는 소수의 변수만으로 완전히 기술할 수 있다.
현실의 물체는 힘을 받으면 어느 정도 휘고 찌그러지지만(구조해석이 다루는 영역), 게임이나 로보틱스처럼 “돌이 굴러가고 상자가 쌓이고 캐릭터가 넘어지는” 거동만 필요하면 변형을 무시하는 편이 압도적으로 싸고 빠르다. 그래서 거의 모든 물리 엔진의 심장부에는 강체 동역학 솔버가 들어 있다.
2. 병진과 회전, 그리고 관성텐서[편집]
강체의 운동은 딱 두 부분으로 쪼개진다. 질량중심의 병진운동은 우리에게 익숙한 뉴턴 제2법칙 그대로다.
여기까지는 점질량과 다를 게 없다. 골치 아픈 쪽은 회전운동이다. 회전에서 질량의 역할을 하는 물리량은 스칼라가 아니라 3×3 행렬인 관성텐서(inertia tensor) 이다. 각운동량 은 각속도 와 다음처럼 엮인다.
관성텐서가 행렬이라는 사실이 온갖 직관 파괴의 원흉이다. 각속도와 각운동량이 일반적으로 평행하지 않기 때문에, 아무 힘을 안 줘도 회전축이 저 혼자 춤을 춘다. 물체마다 고유한 세 개의 주축(principal axis)이 있고, 그 축들로 좌표계를 잡으면 관성텐서가 대각행렬로 예뻐진다. 이 대각화가 바로 회전 동역학 구현의 첫 관문.1
3. 오일러 방정식과 자세의 표현[편집]
회전운동방정식은 물체 고정 좌표계에서 오일러(Euler)가 정리한 형태로 쓴다. 토크 에 대해
이 식의 두 번째 항, 즉 자이로스코픽(gyroscopic) 항이 회전체의 온갖 신기한 현상을 만든다. 우주에서 손잡이 달린 T자 물체가 주기적으로 뒤집히는 “테니스 라켓 정리(중간축 정리)“가 바로 이 항의 작품이다.2
문제는 자세를 어떻게 저장하느냐다. 회전각을 3개(오일러 각)로 표현하면 직관적이지만, 특정 자세에서 두 축이 겹쳐 자유도가 하나 사라지는 짐벌 락(gimbal lock)에 빠진다. 그래서 현대 엔진은 거의 예외 없이 쿼터니언(quaternion)을 쓴다. 4개 성분 로 3차원 회전을 표현하며, 짐벌 락이 없고 두 자세 사이를 부드럽게 보간(slerp)하기도 좋다. 각속도로 쿼터니언을 시간적분하는 식은 다음과 같다.
여기서 는 각속도를 순허수 쿼터니언으로 올린 것이고 는 쿼터니언 곱이다. 적분하다 보면 노름이 슬금슬금 1에서 벗어나므로 매 스텝 정규화해 주는 것이 국룰이다.
4. 게임 엔진에서의 시간 적분[편집]
강체 상태를 매 프레임 앞으로 밀어주는 것이 적분기(integrator)의 역할이다. 게임 물리에서 정확한 룽게-쿠타 같은 고차 기법(룽게-쿠타법)은 비용 대비 이득이 적어서, 실무는 값싸고 안정적인 심플렉틱(symplectic) 계열을 선호한다. 특히 속도를 먼저 갱신하고 그 속도로 위치를 갱신하는 세미-임플리시트 오일러(semi-implicit Euler)가 사실상 표준이다.
명시적 오일러가 에너지를 슬금슬금 발산시켜 시뮬레이션을 폭발시키는 반면, 세미-임플리시트는 에너지를 장기적으로 유지해 상자 더미가 밤새 돌려도 안 터진다. 위치기반 기법이나 베를레 적분도 같은 이유로 사랑받는다. 그리고 물체끼리 겹쳤는지 판정하는 충돌 감지와, 겹침을 밀어내는 제약 해결기(constraint solver)가 적분기와 한 세트로 돌아간다.3
5. 슬립과 잠자기 — 게을러야 산다[편집]
수백 개 강체를 매 프레임 다 계산하면 CPU가 녹는다. 다행히 대부분의 물체는 대부분의 시간 동안 가만히 있다. 그래서 엔진은 두 가지 꼼수를 쓴다.
- 슬립(sleeping): 일정 시간 동안 속도가 문턱값 이하로 유지된 물체를 “잠재운다”. 잠든 물체는 적분·충돌 계산 대상에서 빠지고, 근처에서 충격이 오면 다시 깨어난다. 쌓아 놓은 상자 탑이 조용해지면 통째로 잠들어 CPU를 아낀다.
- 미끄러짐/떨림 억제: 접촉 상태의 물체는 이론적으로 정지해야 하는데, 수치 오차로 미세하게 계속 떨거나 스르르 밀린다. 이걸 방치하면 쌓아 둔 탑이 저 혼자 무너진다. 접촉 제약에 위치 보정(baumgarte/soft constraint)과 마찰 처리를 넣어 잡는다.
잠자기 문턱값을 너무 높이면 던진 물체가 공중에서 얼어붙는 유령 버그가, 너무 낮추면 성능이 안 나온다. 이 문턱값 튜닝이 물리 프로그래머의 은근한 노가다 포인트.4
6. 어디에 쓰이나[편집]
- 게임: 부서지는 상자, 굴러가는 배럴, 넘어지는 래그돌(ragdoll) 캐릭터. 강체 + 관절 제약의 조합.
- 로보틱스: 매니퓰레이터·다족보행 로봇의 순/역동역학. 여기서는 게임보다 정확도 요구가 훨씬 빡세다.
- 우주역학: 인공위성의 자세 제어(attitude control). 관성텐서와 오일러 방정식이 실전 투입되는 대표 분야.
- 차량 시뮬레이터: 서스펜션 위에 얹힌 차체를 강체로 놓고 타이어 힘을 먹인다.
강체는 “안 찌그러진다”는 딱 한 줄의 가정으로 세상을 엄청나게 단순화한다. 그 대가로 충돌·마찰·연성이라는 새로운 지옥문이 열리지만, 그건 또 다른 문서의 몫이다.
7. 관련 문서[편집]
8. Footnotes[편집]
-
관성텐서의 대각화는 결국 대칭행렬의 고유값 문제다. 고유벡터가 주축, 고유값이 주관성모멘트가 된다. 구조해석의 모드 해석에서 고유값 문제 푸는 것과 수학적으로 형제지간. ↩
-
러시아 우주비행사 블라디미르 자니베코프가 1985년 궤도에서 나비너트가 저절로 주기적으로 뒤집히는 걸 관찰해 “자니베코프 효과”로도 불린다. 유튜브에 무중력 T핸들 영상 널렸으니 한 번 보면 각운동량 보존이 얼마나 반직관적인지 체감된다. ↩
-
“적분은 쉽고 충돌이 어렵다”는 게 물리 엔진 개발자들의 공통된 한탄이다. 실제로 상용 엔진 코드의 대부분은 적분기가 아니라 브로드페이즈·내로우페이즈 충돌과 제약 해결기가 차지한다. ↩
-
게임에서 “물건을 밀었는데 안 움직인다” 또는 “가만히 있어야 할 통이 스르륵 굴러간다”는 버그의 상당수가 이 슬립/떨림 파라미터에서 나온다. 물리 QA의 영원한 단골 이슈. ↩