Функция совместимости для 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());
}

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


person s3lph    schedule 30.06.2014    source источник
comment
или даже никогда не должны были быть использованы ... почему бы и нет? glu имел массу полезных функций.   -  person    schedule 01.07.2014
comment
Я специально имел в виду gluLookAt. Это полезно - да, но передает идею камеры, которой нет в OpenGL. Из-за этого сейчас сложнее понять, как правильно использовать матрицы преобразования. (По крайней мере для меня)   -  person s3lph    schedule 01.07.2014
comment
конечно, камера существует, по умолчанию она находится в (0,0,0) и смотрит вниз по положительной оси z. попробуйте нарисовать без настройки каких-либо других матриц вида-проекции (или установите их все на идентичность), и вы поймете, что я имею в виду (кстати, это называется гомогенным пространством клипа...).   -  person    schedule 02.07.2014


Ответы (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...

person s3lph    schedule 30.06.2014
comment
Под всеми уроками я полагаю, вы имеете в виду NeHe? Этот сайт очень устарел и практически бесполезен, вам следует избегать его. Я обнаружил, что arc Synthesis.org/gltut гораздо полезнее. - person Dan; 01.07.2014
comment
Вы можете избавиться от glTranslate, включив -eyeX, -eyeY, -eyeZ в нижнюю строку вашей матрицы. - person Aumnayan; 02.07.2014
comment
Имеет смысл... Спасибо за примечание... Я добавлю это. - person s3lph; 03.07.2014