Угол поворота зажима твердого тела

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

#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°, Это помогает игроку оставаться ориентированным. В противном случае он сможет повернуть камеру выше над головой и увидеть мир позади себя с ног на голову. В отличие от реального человека, пытающегося это сломать ему шею.

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

0

Решение

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

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

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

-1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector