0

最近、3D ゲームのカメラに剛体を取り付けて、環境と衝突できるようにしました。ここまでで、マウスの動きは剛体を直接回転させます。

#include <BULLET/btBulletDynamicsCommon.h>

void Rotate(float Pitch, float Yaw, float Roll, float Speed)
{
    // get current rotation
    btTransform transform = body->getWorldTransform();
    btQuaternion rotation = transform.getRotation();

    // create orientation vectors
    btVector3 up(0, 1, 0);
    btVector3 lookat = quatRotate(rotation, btVector3(0, 0, 1));
    btVector3 forward = btVector3(lookat.getX(), 0, lookat.getZ()).normalize();
    btVector3 side = btCross(up, forward);

    // rotate camera with quaternions created from axis and angle
    rotation = btQuaternion(up,      Amount.getY()) * rotation;
    rotation = btQuaternion(side,    Amount.getX()) * rotation;
    rotation = btQuaternion(forward, Amount.getZ()) * rotation;

    // set new rotation
    transform.setRotation(rotation);
    body->setWorldTransform(transform);
}

-80°カメラのピッチをからの範囲でクランプしたいと思い80°ます。これは、プレイヤーが方向を維持するのに役立ちます。そうでなければ、彼はカメラを頭上で回転させて、自分の背後にある世界を上下逆さまに見ることができます. 対照的に、これを試みる実在の人物は首を折るでしょう。

Bullet Physicsにクォータニオンで回転を保存させたので、ピッチは直接保存されません。剛体のピッチを固定するにはどうすればよいですか?

4

1 に答える 1

-1

私は解決策を思いつきました。カメラの剛体の回転をクランプする代わりに、以前に適用された回転量をクランプします。したがって、マウスの垂直方向の移動の合計を追跡します。実際には、感度を適用してマウスの動き全体を保存します。

float Overallpitch = 0.0f;

渡されたヨー値を適用すると、全体的なピッチが特定の制限を超えるか下回る場合は、制限に触れるのに必要なだけ適用します。

#include <BULLET/btBulletDynamicsCommon.h>

void Rotate(float Pitch, float Yaw, float Roll, float Sensitivity)
{
    // apply mouse sensitivity
    Yaw   *= Sensitivity;
    Pitch *= Sensitivity;
    Roll  *= Sensitivity;

    // clamp camera pitch
    const float clamp = 1.0f;
    if     (Overallpitch + Pitch >  clamp) Pitch =  clamp - Overallpitch;
    else if(Overallpitch + Pitch < -clamp) Pitch = -clamp - Overallpitch;
    Overallpitch += Pitch;

    // apply rotation to camera quaternion
    // ...
}

私自身の質問に対する別の回答で、さらなるカメラコードを見つけることができます。

于 2013-05-07T10:09:53.487 に答える