Функция совместимости для gluLookAt

Я только что получил новый компьютер и теперь должен запустить мою демонстрационную программу с SDL2 / OpenGL. Я использовал программу, чтобы опробовать различные методы, и использовал gluLookAt (который, очевидно, больше не должен использоваться или даже никогда не должен был использоваться).

Теперь я ищу способ заменить метод gluLookAt путем построения матрицы преобразования, делая то же самое, что и gluLookAt. Я наткнулся этот утверждая, что можно использовать замену gluLookAt (ответ — не вопрос).

Моя реализация выглядит так (я полагаю, j ^ k означает перекрестное произведение j и k — поправьте меня, если я ошибаюсь):

//Compat method: gluLookAt deprecated
void util_compat_gluLookAt(GLfloat eyeX, GLfloat eyeY, GLfloat eyeZ, GLfloat lookAtX, GLfloat lookAtY, GLfloat lookAtZ, GLfloat upX, GLfloat upY, GLfloat upZ) {
Vector3f up (upX, upY, upZ);
Vector3f lookAt (-lookAtX, -lookAtY, -lookAtZ);
Vector3f eye (eyeX, eyeY, eyeZ);
Vector3f i = up ^ lookAt;
Matrix4x4 mat (new GLfloat[16]
{i.getX(), upX,    lookAt.getX(),  0,
i.getY(),  upY,    lookAt.getY(),  0,
i.getZ(),  upZ,    lookAt.getZ(),  0,
0,     0,      0,          1});
Vector3f translate = mat * (Vector3f()-eye); // Not yet correctly implemented: Negative of vector eye ([0,0,0]-[eyeX,eyeY,eyeZ])
mat.setItem(3,0,translate.getX());
mat.setItem(3,1,translate.getX());
mat.setItem(3,2,translate.getX());
glMultMatrixf(mat.transpose().getComponents());
}

Кто сделал что-то не так — мой источник информации или я? И как я могу это исправить?
ПРИМЕЧАНИЕ: я не буду использовать это в моем реальном проекте, но мне все еще нужно это для моей демонстрационной программы, которая также будет проверена на предмет оценки.

1

Решение

У меня просто была идея реализовать метод совместимости gluLookAt, такой как gluLookAt, реализованный в более старой версии Mesa3D 🙁glu.c Mesa3D 3.2)

Теперь это выглядит как показано ниже и работает:

//Compat method: gluLookAt deprecated
void util_compat_gluLookAt(GLfloat eyeX, GLfloat eyeY, GLfloat eyeZ, GLfloat lookAtX, GLfloat lookAtY, GLfloat lookAtZ, GLfloat upX, GLfloat upY, GLfloat upZ) {
Vector3f x, y, z;
z = Vector3f(eyeX-lookAtX, eyeY-lookAtY, eyeZ-lookAtZ).normalize();
y = Vector3f(upX, upY, upZ);
x = y ^ z;
y = z ^ x;
x = x.normalize();
y = y.normalize();
// mat is given transposed so OpenGL can handle it.
Matrix4x4 mat (new GLfloat[16]
{x.getX(), y.getX(),   z.getX(),   0,
x.getY(),  y.getY(),   z.getY(),   0,
x.getZ(),  y.getZ(),   z.getZ(),   0,
-eyeX,     -eyeY,      -eyeZ,      1});
glMultMatrixf(mat.getComponents());
}

Я знаю, что это способ, которым OpenGL не используется сегодня, но каким-то образом все учебные пособия, кажется, используют gluLookAt и, следовательно, передать существование камеры в OpenGL. Я все еще должен избавиться от этой точки зрения о OpenGL сам …

3

Другие решения


По вопросам рекламы [email protected]