Bullet Physics-リジッドボディから直接光線を投射する(一人称カメラ)
Bulletを使用して一人称カメラを実装しました。これはカプセル形状の剛体です。Bulletを使用して数日しか経っていませんが、物理エンジンは初めてです。私はそれbtRigidBody::setLinearVelocity()を移動するために使用し、それは世界と完全に衝突します。唯一の問題は、Y値が自由に移動することです。これは、ボディを移動する前に、並進ベクトルのY値をゼロに設定することで一時的に解決しました。これは、高所から落下する場合を除いて、すべての場合に機能します。 体が背の高いオブジェクトから落ちた場合でも、移動ベクトルのY値がゼロに設定されているため、移動を停止して地面に落ちるまで速度は設定されます。これを解決するには、ボディからレイをダウンキャストしてワールドのY値を決定し、その値とカメラボディのY値の差を確認して、次の場合は動きを無効にするか、速度を遅くします違いは十分に大きいです。 光線を投射し、光線が当たった世界のY値を特定するだけで、少し行き詰まりました。私はこのコールバックを実装しました: struct AllRayResultCallback : public btCollisionWorld::RayResultCallback{ AllRayResultCallback(const btVector3& rayFromWorld, const btVector3& rayToWorld) : m_rayFromWorld(rayFromWorld), m_rayToWorld(rayToWorld), m_closestHitFraction(1.0){} btVector3 m_rayFromWorld; btVector3 m_rayToWorld; btVector3 m_hitNormalWorld; btVector3 m_hitPointWorld; float m_closestHitFraction; virtual btScalar addSingleResult(btCollisionWorld::LocalRayResult& rayResult, bool normalInWorldSpace) { if(rayResult.m_hitFraction < m_closestHitFraction) m_closestHitFraction = rayResult.m_hitFraction; m_collisionObject = rayResult.m_collisionObject; if(normalInWorldSpace){ m_hitNormalWorld = rayResult.m_hitNormalLocal; } else{ …