Поворот камеры вокруг собственной оси Y - PullRequest
0 голосов
/ 27 февраля 2019

Я запутался в повороте камеры вокруг своей оси 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 только назад.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...