물리 엔진의 뼈대 · 적분기 · 실습
세 적분기의 에너지를 견준다
목표
같은 물리 법칙을 세 가지 방법으로 이산화해 굴려 보고, 그 차이가 그림으로 드러나게 만듭니다. 이 실습이 끝나면 물리 엔진이 왜 특정 적분기를 고르는지 근거를 가지고 말할 수 있게 됩니다.
왜 중요한가
물리 엔진의 겉모습은 충돌과 마찰이지만, 그 아래에서 매 걸음 돌고 있는 것은 적분기입니다. 그리고 적분 방법은 오차만 내는 것이 아니라 계의 성질을 바꿉니다. 명시적 오일러로 용수철을 굴리면 에너지가 매 걸음 정확히 (1 + dt²) 배씩 늘어나 몇 초 만에 발산합니다. 힘 계산이 틀린 것이 아니라 순서가 틀린 것입니다.
두 줄의 순서만 바꾼 반암시적 오일러는 같은 비용으로 안정적입니다. 게임 물리 엔진이 이것을 쓰는 이유이고, 이 사실은 숫자를 직접 뽑아 그래프로 보면 잊히지 않습니다. 그래서 이 실습은 결과를 CSV 로 남기고 한 장의 PNG 에 겹쳐 그립니다.
단계
1. /root/integrator 에 도구 상자를 놓습니다.
2. /root/integrator/out/euler.csv — 명시적 오일러.
3. /root/integrator/out/semi.csv — 반암시적 오일러.
4. /root/integrator/out/verlet.csv — 속도 베를레.
5. /root/integrator/out/energy.png — 세 에너지 곡선을 한 장에.
6. /root/integrator/out/06-dt.txt — dt 를 바꾼 증가율.
7. /root/integrator/out/damped.csv 와 damped.png — 감쇠를 힘으로.
참고
- 그림은
nohup python3 -m http.server 8080 -d /root/integrator/out &로 띄우고 웹 미리보기 에서http://localhost:8080/energy.png를 엽니다. - CSV 는 머리글 한 줄 + 401줄입니다. 0걸음째(초기 상태)를 빠뜨리지 마십시오.
- 흔한 실수 하나: 명시적 오일러를 두 줄로 나눠 쓰다가 새 x 를 속도 계산에 써 버리는 것입니다. 그 순간 그것은 반암시적 오일러가 되고, 두 CSV 가 똑같아집니다.
- 흔한 실수 둘: 베를레에서 반복문 전에 초기 가속도를 구해 두지 않는 것입니다. 첫 걸음이 틀립니다.
단계 7개
- 그리기 도구 상자를 놓는다
- 명시적 오일러
- 반암시적 오일러
- 속도 베를레
- 세 곡선을 한 장에
- dt 를 바꾸면 얼마나 나빠지나
- 감쇠는 힘으로 넣는다