我有一个简单的相机类在directx 11中工作,允许向前和向左和向右旋转。我正在尝试实施扫射但遇到一些问题。
当没有相机旋转时,扫射工作,所以当相机从0,0,0开始。但是在向任一方向旋转相机后,它似乎以一个角度或倒置或只是一些奇怪的东西进行扫描。
以上是上传到Dropbox的视频,显示了此行为。 https://dl.dropboxusercontent.com/u/2873587/IncorrectStrafing.mp4
这是我的相机课程。我有预感,它与相机位置的计算有关。我在strafe中尝试了各种不同的计算,它们似乎都遵循相同的模式和相同的行为。此外,m_camera_rotation表示Y旋转,因为投球尚未实现。
#include "camera.h"
camera::camera(float x, float y, float z, float initial_rotation) {
m_x = x;
m_y = y;
m_z = z;
m_camera_rotation = initial_rotation;
updateDXZ();
}
camera::~camera(void)
{
}
void camera::updateDXZ() {
m_dx = sin(m_camera_rotation * (XM_PI/180.0));
m_dz = cos(m_camera_rotation * (XM_PI/180.0));
}
void camera::Rotate(float amount) {
m_camera_rotation += amount;
updateDXZ();
}
void camera::Forward(float step) {
m_x += step * m_dx;
m_z += step * m_dz;
}
void camera::strafe(float amount) {
float yaw = (XM_PI/180.0) * m_camera_rotation;
m_x += cosf( yaw ) * amount;
m_z += sinf( yaw ) * amount;
}
XMMATRIX camera::getViewMatrix() {
updatePosition();
return XMMatrixLookAtLH(m_position, m_lookat, m_up);
}
void camera::updatePosition() {
m_position = XMVectorSet(m_x, m_y, m_z, 0.0);
m_lookat = XMVectorSet(m_x + m_dx, m_y, m_z + m_dz, 0.0);
m_up = XMVectorSet(0.0, 1.0, 0.0, 0.0);
}
答案 0 :(得分:0)
由于我实施相机系统需要数小时的挫折,我建议它与你的视图矩阵没有正交标准化有关。这是一种奇特的说法 - 矩阵中表示的三个矢量不保持1的长度(标准化),也不保持正交(彼此成90度)。
表示旋转的视图矩阵的3x3部分表示3个向量,用于描述视图在任何给定时间的当前x,y和z轴。由于浮动值不精确引起的错误的四舍五入,这三个矢量可以伸展,收缩和发散以引起各种头痛。
因此,一般策略是每旋转一次,如果旋转也会重新正规化,另外还有一件事 - 当扫射或向后/向后移动时,使用视图/外观向量的当前值来改变位置,用于后向/前向和右向量用于扫射
e.g
//deltaTime for all of these examples is the amount of time elapsed since the last
//frame of your game loop - this ensures smooth movement, or you could fix your
//timestep - Glen Fielder did a great article on that please google for it!
void MoveForward(float deltaTime)
{
position += (deltaTime * lookAtVector);
}
void MoveBackwards(float deltaTime)
{
position -= (deltaTime * lookAtVector);
}
void StrafeLeft(float deltaTime)
{
position -= (deltaTime * rightVector);
}
//do something similar for StrafeRight but use a +=
无论如何,只需旋转视图和右向量,可以按如下方式重新编写类
class Camera
{
Vector3 rightVec,lookVec,position;
void Rotate(float deltaTime)
}
你明白了吗?这是一个粗略的例子,只是为了让你思考。