물리 엔진에서 작은 물체를 어떻게 처리해야합니까?


13

주사위 던지기를 위해 3D 물리 엔진을 만들고 있습니다. 지금까지 주사위는 1x1x1m이고 중력은 9.82m / s ^ 2입니다. 주사위가 조금 느리게 보이는 방식으로 모든 것에 반응하기 때문에 이것은 물론 현실적으로 보이지 않습니다.

이 문제를 해결하기 위해 주사위를 옆으로 약 0.02m로 만들기 위해 모든 크기를 변경하려고했습니다. 이로 인해 내 질량과 역 관성 행렬이 매우 큰 값을 얻게되어 수치 적 불안정성을 초래합니다.

이것을 처리하는 가장 좋은 경로는 무엇입니까? 주사위가 1x1x1이되도록 작용 규모를 유지하고 작용력의 질량이나 크기 만 변경할 수 있습니까? 아니면 다른 것을 조정해야합니까?

우주선이나 무언가와 같은 매우 큰 육체로 게임을 만들면 같은 문제가 발생할 수 있다고 생각합니다.


나는 여기에 전문가가 아니지만 코드가 없으면 문제가 무엇인지 어떻게 알 수 있습니까? Box2D도 같은 문제가 있기 때문에 아마도 틀렸을 것입니다.
jcora


1
예, 그것을 처리하는 일반적인 방법이있을 것이라고 생각했습니다. 내가 알 수 있듯이 이것은 코드 문제가 아니라 숫자 정밀도 문제입니다. 내가 겪고있는 것은 내 문제를 해결하기위한 코드 스 니펫이 아니라 문제에 대한 접근 방식에 대한 설명입니다.
Mikael Högström

부동 소수점 정밀도를 의미합니까?
jcora

어떤 의미에서는 그렇습니다. 충돌 처리에 사용하는 관성 행렬의 역수는 매우 큰 값을 얻습니다. 피벗 요소가 큰 값을 가져오고 추가 작업이 많지 않아 실제로 조건이 좋지는 않지만 시뮬레이션이 신속하게 제어를 벗어남에 따라 수치 정밀도에 문제가 있어야합니다.
Mikael Högström

답변:


1

넌 할 수있어

  • 중력 상수를 증가 시킵니까? 게임은 종종 2 * 9.81 m / s ^ 2를 사용합니다. 내가 어디서 읽었는지 기억할 수 없지만 게임은 일반적으로 무의미한 단위를 사용합니다. 상수가 무엇이든간에 (게임을 즐겁게하십시오). 현실적인 상수를 사용하면 물리학이 느리고 부유하게 보입니다.
  • 더 빠른 속도로 시뮬레이션을 실행하십시오. 고정 된 시간 간격을 사용하는 경우 애니메이션 속도가 증가합니다.
  • 고정밀 플로트를 사용 하시겠습니까?

두 번째 포인트는 아무 것도하지 않고 시뮬레이션을 더 매끄럽게 만들거나 시뮬레이션이 너무 빨리 실행되면 중단 할 수도 있습니다. 차이는 항상 0이며 아무것도 작동하지 않습니다). 그는 또한 고정밀 플로트에서 메모리를 낭비하고 싶지 않을 수도 있습니다.
jcora

1
게임은 종종 이중 중력을 사용합니까? 누가 그래?
GameDev-er

속도 나 정확도를 바꿀 수는 없지만 중력을 바꾸려고합니다.
Mikael Högström

중력을 일정하게 변경하면 주사위의 속도가 빨라져 모든 것이 더 작은 규모라는 느낌이 듭니다. 이렇게하면 프레임 간 가속을 처리하기 위해 마이크로 콜리 전이 있어도 동작이 더 불안해집니다. 나는 단지 그것을 조정해야 할 것 같다 :)
Mikael Högström

4

작은 숫자 값으로 문제가 발생하는 경우 모든 것을 축소하는 것이 좋습니다. "실제"측정 단위를 사용하지 않을 수도 있지만 엔진 내에서만 의미가있는 "일반"단위 만 사용할 수도 있습니다.

첫 번째 옵션 인 축소는 기본 측정 단위로 밀리미터 또는 센티미터를 사용해야합니다. 그러면 큐브의 크기에 정밀도 손실이 발생하지 않습니다.

두 번째 해결책은 기본적으로 동일하지만 실제 단위에 대해 생각할 필요는 없습니다.

또한 큐브의 질량 만 바꾸는 것이 어떻습니까?


내가 가지고있는 유일한 힘 생성기는 중력 / 가속도계 기반의 질량 변화가 행동을 변화시키지 않습니다. 작은 물체에 더 큰 질량을 부여하고 반대 질량을 1에 더 가깝게하여 수치 적 불안정성을 줄이면서 다른 방법으로 제안을 사용할 수 있습니다. 그래도 중력 상수를 늘리는 것과 같은 문제가 발생합니다.
Mikael Högström


0

최종 해결책을 문제에 공유해야한다고 생각했습니다. 제안 된 바와 같이 중력 상수를 증가 시키면 실제로 주사위가 더 빠르게 움직여 정확한 스케일의 인상을줍니다. 그러나 이것은 미세 수신 거부 문제가 증가했습니다. 완벽하게 해결하지는 못했지만 문제를 완화시키는 미세 충돌을 추가했습니다. 이 문제는 "작은"객체의 경우에만 문제가되며, 반대의 문제가 발생하고 매우 큰 객체 (우주선 또는 이와 유사한 것)를 시뮬레이션하려는 경우 마이크로 수신 거부 문제가 전혀 발생하지 않으며 그 해결책.

그래서 나는 너무 많은 "마이크로 수신 거부"를 가지지 않고 가질 수있는 최고 수준의 중력을 발견했습니다. 그런 다음 전화에서 간단한 흔들림 감지를 사용하여 가속도계 판독 값의 큰 변화에 반응하고 이러한 흔들림이 감지되면 모든 물체에 충격을가했습니다. 완벽하지는 않지만 전화가 흔들릴 때 주사위가 빠르게 움직 이도록 설정하면 "작은"주사위의 인상을 줄 것입니다. 그것은 약간의 해킹이지만 수행해야합니다 :) 작동중인 엔진 의 클립 이 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.