Я только что получил новый компьютер и теперь должен запустить мою демонстрационную программу с 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());
}
Кто сделал что-то не так — мой источник информации или я? И как я могу это исправить?
ПРИМЕЧАНИЕ: я не буду использовать это в моем реальном проекте, но мне все еще нужно это для моей демонстрационной программы, которая также будет проверена на предмет оценки.
У меня просто была идея реализовать метод совместимости 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 сам …