카테고리 보관물: 게임개발

게임개발

레이 캐스트 자동차 바퀴가 옆으로 미끄러지는 것을 어떻게 방지합니까? 움직임을 막는 것입니다. 예를 들어, 경사면에 내

저는 이 기사 를 참고로 하여 비현실적인 자동차 물리 엔진을 학습 연습으로 작성했습니다 .

지형과 올바르게 충돌하고 각 바퀴에 올바른 서스펜션 힘을 가하는 자동차가 있습니다. 다음 문제는 바퀴의 측면 움직임을 막는 것입니다. 예를 들어, 경사면에 내 차를 떨어 뜨린다면 경사면을 따라 옆으로 미끄러 져 미끄러지지 않고 옆으로 미끄러지는 것을 멈추지 않습니다 (어떤 마찰도 없습니다).

연결된 기사에 따르면 “측력”을 전진 력과 결합하여 적용해야하지만 측력 계산 방법에 대해 설명합니다.

각 휠에 대한 충돌 정보 (교차 노멀 등)와 자동차의 강체에 대한 정보를 고려할 때 측면 운동을 방지하기 위해 강체에 적용 할 적절한 측면 힘을 어떻게 계산할 수 있습니까?



답변

그 측면 힘은 자동차의 전진 운동과 관련하여 도로 법선의 수평 요소입니다. 도로는 모멘텀에서 트랙을 바깥 쪽 코너로 밀지 않고 트랙에서 날아 가지 않고 더 빠른 속도로 코너링을 촉진하기 위해 논의하는 것처럼 자금이 공급됩니다. 뱅킹은 타이어가 자유롭게 회전하지 않고 희망적으로 저항 할 수있는 방향으로 뒤로 밀립니다. 뱅킹이 충분히 가파르거나, 무게 중심이 충분히 높거나 속도가 느리면 차 자체가 바퀴 역할을하여 단순히 넘어 질 것입니다.

타이어는 조향 범위가 제한되어 있습니다. 타이어가 그런 식으로 회전하지 않기 때문에 세로 축 (앞에서 뒤로)에 수직으로 작용하는 힘은 부분적으로 저항됩니다. 중력 및 전진 속도에서 도로에 대해 옆으로 작용하는 힘을 계산 한 다음 타이어가이 마찰을 일부 제거한 후 남은 힘을 계산할 수 있습니다. 나머지 힘이 자동차를 도로로 밀어 넣는 힘을 극복하기에 충분히 큰 경우, 자동차는 미끄러지거나 미끄러질 것입니다.

다음은이를 설명하고 여기 (마찰이 있거나없는)에 대해 설명 합니다 .

   

수평으로 작용하는 힘이 여기서 특히 중요하다. 휴식시 (중력으로 인한 힘만), 마찰 계수가 예외적으로 낮지 않으면 ( 예 : 얼음 도로) 자동차는 수직으로 진행하는 경사면을 아래로 미끄러지지 않습니다 .


답변

Andon의 대답은 나에게 해결책을주지 못했지만 확실히 올바른 길로 인도했습니다!

일단 바퀴가 자신의 평면에 있다고 생각하기 시작하면 (중심은 중심에서 튀어 나와있는 벡터입니다-나는 이것을 바퀴의 “정상”이라고 부릅니다) 측면 힘은 단지 필요한 벡터라는 것을 깨달았습니다 이 비행기에 자동차의 속도를 ‘푸시’하십시오. 이 벡터는 단순히 바퀴의 “정상”에 속도와 “정상”사이의 내적인 스칼라를 곱한 값입니다.

완벽하게 작동하는 코드는 다음과 같습니다.

            // Now calculate the side force. Get the linear velocity
            auto vel = car->body()->linear_velocity();
            auto side_force = car->wheel_right_axis(i, closest_normal);

            // Find the length of the vector necessary to nullify the horizontal movement
            auto dot = kmVec3Dot(&vel, &side_force);

            // Scale the right vector to that length
            kmVec3Scale(&side_force, &side_force, -dot);

위의 코드에서 “closest_normal”은 바퀴가 충돌 한 지형의 법선으로, 바퀴의 “정상”을 계산할 때 ‘위’벡터로 사용됩니다.


답변