gluLookAt альтернатива не работает - PullRequest
4 голосов
/ 20 мая 2010

Я пытаюсь вычислить матрицу lookat самостоятельно, вместо того, чтобы использовать gluLookAt (). Моя проблема в том, что моя матрица не работает. использование тех же параметров на gluLookAt работает, однако.

мой способ создания матрицы lookat:

Vector3 Eye, At, Up; //these should be parameters =)

Vector3 zaxis = At - Eye;           zaxis.Normalize();
Vector3 xaxis = Vector3::Cross(Up, zaxis);  xaxis.Normalize();
Vector3 yaxis = Vector3::Cross(zaxis, xaxis);   yaxis.Normalize();

float r[16] = 
{
    xaxis.x,    yaxis.x,    zaxis.x,    0,
    xaxis.y,    yaxis.y,    zaxis.y,    0,
    xaxis.z,    yaxis.z,    zaxis.z,    0,
    0,          0,          0,          1,
};
Matrix Rotation;
memcpy(Rotation.values, r, sizeof(r));

float t[16] = 
{
     1,      0,      0,     0,
     0,      1,      0,     0,
     0,      0,      1,     0,
    -Eye.x, -Eye.y, -Eye.z, 1,
};
    Matrix Translation;
    memcpy(Translation.values, t, sizeof(t));


View = Rotation * Translation; // i tried reversing this as well (translation*rotation)

Теперь, когда я пытаюсь использовать эту матрицу, вызывая glMultMatrixf, в моем движке ничего не появляется, хотя при использовании тех же значений eye, lookat и up для gluLookAt работает отлично, как я уже говорил.

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glMultMatrixf(View);

проблема должна быть где-то в коде, который я выложил здесь, я знаю, что проблема не в моих классах Vector3 / Matrix, потому что они отлично работают при создании матрицы проекции.

1 Ответ

3 голосов
/ 14 августа 2010

Я полагаю, у вас правосторонняя система координат (по умолчанию в OpenGL) Попробуйте следующий код. Я думаю, что вы забыли нормализоваться и вы должны поместить "-zaxis" в матрицу

Vector3 Eye, At, Up; //these should be parameters =)

Vector3 zaxis = At - Eye; zaxis.Normalize();
Up.Normalize();
Vector3 xaxis = Vector3::Cross(Up, zaxis);  xaxis.Normalize();
Vector3 yaxis = Vector3::Cross(zaxis, xaxis);   yaxis.Normalize();

float r[16] = 
{
    xaxis.x,    yaxis.x,    -zaxis.x,    0,
    xaxis.y,    yaxis.y,    -zaxis.y,    0,
    xaxis.z,    yaxis.z,    -zaxis.z,    0,
    0,          0,          0,          1,
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...