Я недавно прикрепил твердое тело к камере в своей трехмерной игре, чтобы она могла столкнуться с окружающей средой. К настоящему времени движение мыши непосредственно вращает твердое тело.
#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°
, Это помогает игроку оставаться ориентированным. В противном случае он сможет повернуть камеру выше над головой и увидеть мир позади себя с ног на голову. В отличие от реального человека, пытающегося это сломать ему шею.
Я позволяю Пуля Физика хранить вращения для меня в кватернионах, таким образом, высота тона не сохраняется напрямую. Как я могу зажать шаг твердого тела?
Я придумал решение. Вместо того, чтобы фиксировать вращение жесткого корпуса камеры, я фиксирую, сколько вращения применяется раньше. Поэтому я отслеживаю общее вертикальное движение мыши. На самом деле, я храню общее движение мыши с прикладной чувствительностью.
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
// ...
}
Вы можете найти дальнейший код камеры в другой ответ на мой собственный вопрос.
Других решений пока нет …