2017-05-10 8 views
1

Bullet Physics의 HelloWorld.cpp가 자유 낙하의 예라고 생각합니다.Bullet Physics의 HelloWorld 예제 결과가 자유 낙하 법과 일치하지 않습니까?

Bullet Physics의 결과가 물리 법칙과 일치하는지 확인하기 위해 HelloWorld.cpp에서 구의 초기 위치를 "startTransform.setOrigin (btVector3 (2, 10, 0)); " "startTransform.setOrigin (btVector3 (2, 0, 0));"로 변경하고 시뮬레이션 단계를 "//dynamicsWorld-> stepSimulation (1.f/60.f, 10);" "dynamicsWorld-> stepSimulation (0.1f, 0, 0.1f);"

이 두 가지 변경 후에 출력은 0.1 초 간격으로 자유 낙하 모션에서 구의 위치가 될 것이라고 생각합니다. 또한 각 시뮬레이션 단계에서 구의 선 속도를 출력합니다. 결과는 다음과 같습니다. vx, vy, yz, px, py, pz

첫 번째 줄은 초기 선형 속도와 위치입니다. 속도는 자유 낙하 법칙 (즉, v = g * t)과 일치하지만, 위치 (변위)는 자유 낙하 법칙과 일치하지 않는다는 것을 알 수있다 (즉, s = g * t * t/2).

그래서 Bullet Physics가 안정적인지 궁금합니다. 아니면 뭔가 잘못 됐어?

감사합니다.

+0

0.1 초 단계는 나에게 들립니다. 국제 경기에서 크리켓 볼의 궤적을 모델링 할 때, 위치를 스테핑하는 실수를 줄이기 위해 약 0.001 초의 타임 스텝을 사용했습니다. BulletPhysics를 사용하지 않았지만 통합을 수행하기보다는 오히려 근사치이기 때문에 시간 퀀텀을 제공한다고 말하고 싶습니다. 시간 퀀텀을 작게 만들면 오류가 수학적 예측에 수렴되기 시작해야합니다. 오, 그리고 아무 것도 진공 상태에 있다고 가정하지 마라. – paddy

+0

대단히 감사합니다!귀하의 요지를 이해하고 0.001 초의 시뮬레이션 단계를 시도했습니다. 그러나 결과는 자유 낙하 법의 수학적 예측에 대한 어떠한 "수렴"도 보여주지 못했습니다. 속도는 여전히 "-0.01, -0.02, -0.03, ..., -0.10"의 순서로 맞습니다. 그러나 위치 시퀀스는 "-0.00001, -0.00003, -0.00006, -0.00010, ..., -0.00045, -0.00055"입니다.이 값은 0.1s에 10000을 곱한 값입니다. – Langping

+0

절대 위치가 아닌 위치 델타를 제공합니까? 이 문서를주의 깊게 읽었습니까? – paddy

답변

2

특히 Bullet에 대해서는 많이 알지 못하지만 아마도 물리 엔진에 대한 일반적인 정보를 제공 할 수 있습니다.

물리 엔진은 기본적으로 수치 적분기입니다. 그것들은 운동 학적 방정식에 대한 정확한 해석 솔루션을 산출하지는 않지만 오히려 수치 적으로 각 시간 단계에서 속도를 합산하여 위치를 생성합니다. (그리고 속도를 산출하기 위해 가속도/힘을 수치 적으로 요약합니다.)

발견 한 숫자에서 Bullet Physics는 Euler Method을 사용하여 정수를 계산하는 것으로 보입니다. 이것은 적분을 계산하기위한 가장 정확하지 않은 방법 중 하나이지만 이해하기 쉽고 계산하기가 가장 간단한 방법 중 하나입니다.

속도가 일정하기 때문에 속도가 정확하지만 속도가 일정하지 않기 때문에 위치가 정확하지 않기 때문에 속도가 정확합니다.

글 머리 기호 물리학은 신뢰할 수 없거나 잘못되지 않았습니다. 정확하지 않은 근사값을 사용하고 있습니다. 아마도 복잡한 장면에서 실시간 결과를 계산하는 성능을 가지기 위해서 일 것이다.

+0

대단히 감사합니다! 나는 그 점을 알고있다. 그러나 이것이 Bullet 또는 다른 물리 엔진을 사용하는 경우 "수치 부정확성"을 겪어야 함을 의미합니까? 특히 Bullet Physics에서이 수치 부정확성을 줄이기 위해 사용할 수있는 솔루션이 있습니까? paddy가 제안한 해결책과 마찬가지로 테스트를 마친 후에도 작동하지 않는다고 판명되었습니다. – Langping

+0

@ Langping : 시간 단계를 줄이면 오류의 크기가 줄어들지 만 시간이 지남에 따라 여전히 드리프트가 발생합니다. 정확한 결과를 원한다면 실시간 게임보다는 과학/엔지니어링 애플리케이션을 목표로하는 다른 물리 엔진을 살펴볼 것을 제안합니다. 일반적으로 게임 물리 엔진은 안정적인 결과를 목표로하지만 (즉, 폭발이 없음) 물리적 정확도를 목표로하지는 않습니다. 예를 들어, 프로젝트 크로노 (Project Chrono)는 다른 정확도를 가진 [다양한 통합 자] (http://api.chrono.projectchrono.org/classchrono_1_1_ch_timestepper.html)를 제공합니다. – Mankarse

+0

Mankarse에 감사드립니다. 제게는 더 명확 해집니다! – Langping

0

대부분의 물리 엔진 (Bullet 포함)은 semi-implicit Euler 통합을 사용하며 1 차 정확도입니다. 자유 낙하 방정식은 2 차 항이고 (y = y0 + vy0 * t - 0.5 * g * t^2, t^2 항을 가짐) 따라서 반 암묵적 오일러는 오차를 유발할 것입니다.

일반적으로 물리 엔진이 매우 정확할 것으로 기대하지는 않습니다 (많은 가정 및 근사가 만들어지고 있음). 그러나, 당신이 필요로하는 것에 따라 그들은 현실의 수용 가능한 모델이 될 수 있습니다.