2013-05-05 3 views
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 хранить вращения для меня в кватернионах, поэтому тангаж не сохраняется непосредственно. Как я могу зажать шаг жесткого тела?

ответ

-1

Я придумал решение. Вместо того, чтобы зажимать вращение жесткого тела камеры, я зажимаю, сколько вращений применяется раньше. Поэтому я отслеживаю общее вертикальное движение мыши. Фактически, я сохраняю общее движение мыши с применяемой чувствительностью.

float Overallpitch = 0.0f; 

При подаче переданного значения рыскания приведет к общему шагу, чтобы превысить или deceed заданного предела, я просто применить как много из него по мере необходимости прикасаться к пределу.

#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 
    // ... 
} 

Вы можете найти дополнительный код камеры в another answer на мой собственный вопрос.