물리 엔진에서 물체의 "퍼핑"또는 지 터링을 어떻게 수정합니까?


11

속도를 변경하거나 임펄스를 적용하는 대신 겹치는 몸체의 위치를 ​​수정하여 충돌을 해결하는 간단한 물리 엔진이 있습니다. 속도는 영향이 이미 해결 된 후 또는 통합 부품 중에 만 변경됩니다.

힙의 맨 아래에있는 객체에 맨 위의 객체가 너무 많은 압력을 가하는 것 (암시 적으로 존재하며 알고리즘에 압력 모델링이 없음)에 문제가있어 바닥을 통해 밀려납니다. 기타

객체를 y 좌표로 정렬 하여이 문제를 해결하고 싶기 때문에 충돌이 상향식으로 해결되었습니다. 그러나 이제 엔진은 실제로 정지 상태 인 객체에 대해 이상한 터지는 동작을 보여줍니다 (gif 참조).

여기에 이미지 설명을 입력하십시오

소스 코드를 제공하지 않고이게 무엇일까요?


5
대체로 이것은 선형 방정식 시스템을 반복적 인 방식으로 (또는 구속 조건 / 조건 등에 따라 비선형 시스템으로) 해결하는 것과 유사합니다. 어느 쪽이든, 이러한 인공물은 수적으로 볼 수있는 올바른 것, 즉 수렴 과정의 중간 상태이기 때문입니다. 이것을 피하는 것은 매우 어렵고 많은 불쾌한 해킹을 암시 할 수 있습니다 (어쨌든 이것은 실제 생활에서 분자 수준에서 발생하며 실제 생활에서 가장 닮은 것이 있습니다). 상자 기반을 조사하여 임펄스 기반 역학에 대한 솔루션을 확인하는 것이 좋습니다.
teodron

@TravisG 문제를 어떻게 해결 했습니까? 매우 간단한 물리 엔진을 구현하려고 할 때 비슷한 문제를 겪고 있습니다.
cheesus

1
@cheeesus 내가 일한 지 오래되었지만 시간이 조금 더 걸리는 반복을 더 많이 사용했다고 생각합니다.
TravisG

답변:


5

위치 수정을 사용할 때 내가 찾은 한 가지 해결책은 몇 번의 반복이 있고 각 반복마다 강도를 변경하는 것입니다.

doPhysics();

int num_iterations = 5;
for(int iteration=0; iteration<num_iterations; ++iteration)
{
    float strength = float(iteration+1)/num_iterations;
    correctPositions(strength);
}

따라서 첫 번째 반복의 강도는 1 / num_iterations이고 마지막 반복의 강도는 1입니다. 이렇게하면 고정 된 강도로 동일한 반복 횟수를 사용하는 것보다 시뮬레이션이 더 부드럽고 안정적입니다.


2
좋은 해결책이지만 왜 효과가 있습니까?
Gustavo Maciel

5

당신의 문제는 당신이 당신의 몸에 "휴식"상태가 없다는 사실에 있습니다. 모든 물리 시스템에는 운동, 열 등의 에너지가 있습니다. 실제로, 단단한 물체는 약간 변형되고, 약간의 운동 에너지를 측정 할 수는 없지만 열로 변환합니다. 실제로는 완전히 견고한 물체가 없다는 점도 주목할 가치가 있습니다. 다이아몬드와 같이 밀도가 높은 물질조차 원자 사이에 공간이있어 원자 구조가 구부러지고 운동 에너지를 흡수합니다.

이를 적절하게하기 위해, 휴지기는 효과가있는 유일한 힘은 "정상적인 힘", 즉 신체가 서로 떠 다니는 것을 방지하는 힘이다. 그 수직력의 크기는 물체의 밀도와 물체가 서로 얼마나 멀리 침투했는지에 비례합니다.

물리 엔진은이 값을 "슬로프"라고합니다.

요령은 다음과 같습니다. 경사를 계산하고 몸체의 위치를 ​​수정하고 두 몸체의 상대 속도를 기준으로 수직력을 적용합니다. 신체 자체를 업데이트하는 동안 각 신체의 운동 에너지를 계산하십시오. 최소값 미만이면 충분한 크기의 힘이 가해질 때까지 몸을 잠들게하십시오. (보통 최소값의 두 배).


0

왜 "끈적 거리는"표면을 그들에게 붙이고 점차적으로 휴지 위치에 달라 붙게하고, 다른 물체가 충돌 할 때 약간의 에너지를 전달하여 움직이게하지만 끈적한 표면은이 에너지의 일부를 잃고 멈추게 할 것입니다 휴식 위치에서. gif에 마찰이없는 것 같습니다.

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