Directx 11で動作する単純なカメラクラスがあり、前進と左右の回転が可能です。機銃掃射を実装しようとしていますが、いくつか問題があります。
機銃掃射は、カメラの回転がない場合、つまりカメラが 0, 0, 0 から始まる場合に機能します。しかし、カメラをいずれかの方向に回転させた後、斜めに機銃掃射したり、反転したり、奇妙なことをしたりするように見えます。
これは、この動作を示す Dropbox にアップロードされたビデオです。 https://dl.dropboxusercontent.com/u/2873587/IncorrectStrafing.mp4
そして、これが私のカメラクラスです。カメラ位置の計算に関係している気がします。機銃掃射でさまざまな計算を試しましたが、それらはすべて同じパターンと同じ動作に従うようです。また、ピッチングはまだ実装されていないため、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);
}