Я запутался в повороте камеры вокруг своей оси y.Я использую графическую библиотеку OpenGL, поэтому на экране появляется -z.Вот мой код:
if (KEY_DOWN(F_WindowInfo.KeyStates['Q']))
{
float Yaw = -1.0f;
m3 RotationMatrix;
RotationMatrix.Rc[0][0] = Math_Cosine(Math_DegToRad(Yaw));
RotationMatrix.Rc[0][2] = Math_Sine(Math_DegToRad(Yaw));
RotationMatrix.Rc[1][1] = 1.0f;
RotationMatrix.Rc[2][0] = -Math_Sine(Math_DegToRad(Yaw));
RotationMatrix.Rc[2][2] = Math_Cosine(Math_DegToRad(Yaw));
F_WindowInfo.Camera->ForwardVector =
Math_Normalize(&(RotationMatrix * F_WindowInfo.Camera->ForwardVector));
}
if (KEY_DOWN(F_WindowInfo.KeyStates['E']))
{
float Yaw = 1.0f;
m3 RotationMatrix;
RotationMatrix.Rc[0][0] = Math_Cosine(Math_DegToRad(Yaw));
RotationMatrix.Rc[0][2] = Math_Sine(Math_DegToRad(Yaw));
RotationMatrix.Rc[1][1] = 1.0f;
RotationMatrix.Rc[2][0] = -Math_Sine(Math_DegToRad(Yaw));
RotationMatrix.Rc[2][2] = Math_Cosine(Math_DegToRad(Yaw));
F_WindowInfo.Camera->ForwardVector =
Math_Normalize(&(RotationMatrix * (F_WindowInfo.Camera->ForwardVector)));
}
F_WindowInfo.Camera->ViewMatrix = Math_LookAtMatrix(&F_WindowInfo.Camera->Position,
&(F_WindowInfo.Camera->Position + F_WindowInfo.Camera->ForwardVector),
&F_WindowInfo.Camera->UpVector);
и функция Math_LookAtMatrix ():
m4
Math_LookAtMatrix(v3* Eye, v3* Target, v3* Up)
{
v3 ZAxis = Math_Normalize(&(*Target - *Eye));
v3 XAxis = Math_Normalize(&Math_CrossProduct(&ZAxis, Up));
v3 YAxis = Math_CrossProduct(&XAxis, &ZAxis);
m4 Result;
Result.Rc[0][0] = XAxis.x;
Result.Rc[0][1] = YAxis.x;
Result.Rc[0][2] = ZAxis.x;
Result.Rc[1][0] = XAxis.y;
Result.Rc[1][1] = YAxis.y;
Result.Rc[1][2] = ZAxis.y;
Result.Rc[2][0] = -XAxis.z;
Result.Rc[2][1] = -YAxis.z;
Result.Rc[2][2] = -ZAxis.z;
Result.Rc[3][0] = -Math_InnerProduct(&XAxis, Eye);
Result.Rc[3][1] = -Math_InnerProduct(&YAxis, Eye);
Result.Rc[3][2] = Math_InnerProduct(&ZAxis, Eye);
Result.Rc[3][3] = 1.0f;
return Result;
}
Обратите внимание, что ForwardVector, UpVector и Position - все 3 вектора измерения, а RotationMatrix - 3x3matrix.
ForwardVector начинается с (0.0f, 0.0f, -1.0f)
Upvector is (0.0f, 1.0f, 0.0f)
Проблема, которую я испытываюИмея в виду, что вращение, которое я сейчас делаю, создает впечатление, что мир движется вокруг мировой оси Y, а не камера, которая просто вращается вокруг своей локальной оси Y.Может кто-нибудь, пожалуйста, дайте мне знать, что я делаю неправильно?
РЕДАКТИРОВАТЬ: я считаю, что моя функция lookAtMatrix неверна, я удалил - знаки из Result.Rc [3] [0] и Result.Rc [3][1] и получил Q и E движение, которое я изначально хотел.Теперь ось X только назад.