Почему мой объект исчезает после использования gluLookat для OpenGL ES 2.0? - PullRequest
2 голосов
/ 03 июля 2010

Я собираю простую игру для iPhone и пытаюсь реализовать эффект перемещения камеры вокруг GLView.

Я рисую около ста объектов, используя glDrawArrays с указателями вершин и цветов.После этого я хочу переместить камеру вправо на 1 единицу.Это фрагмент кода, который у меня есть в моем методе drawView.Я изменяю режим матрицы на стек проекции, а затем возвращаюсь в режим просмотра модели после завершения манипулирования проектом (возможно, я ошибаюсь, я новичок в OpenGL).

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glTranslatef(1.0, 0.0, 0.0);
glMatrixMode(GL_MODELVIEW);

Вв любом случае, результат определенно не ожидается.Происходит то, что я вижу свои объекты очень кратко (возможно, для кадра), а затем они исчезают.То же самое происходит, если я уберу glTranslatef в блоке выше.

Что я делаю не так?

Заранее спасибо!

До

alt text

После

alt text

Ответы [ 2 ]

6 голосов
/ 04 июля 2010

Один из запутанных аспектов OpenGL для начинающих - это различие между тем, что происходит в матрице проекции, и тем, что происходит в матрице вида модели (и зачем вам они оба нужны?)

Матрица проекцииотвечает за преобразование координат ваших вершин в точки в двухмерной системе координат (он разбивает мир на ваш виртуальный фильм - область просмотра).Матрица проекции определяет только поведение вашей камеры (например: это должен быть широкоугольный объектив, или телеобъектив, или полностью ортогональный, как архитектурные косые рисунки?).

Матрица вида модели нас другой стороны, отвечает за указание, куда в трехмерном пространстве попадают ваши вершины.Так, например, чтобы указать, где находится рука персонажа по отношению к телу персонажа, или где этот персонаж по отношению к миру, вы захотите изменить матрицу вида модели.Важно, в частности, отметить, что изменения в положении и ориентации камеры относятся к матрице вида модели (это часть «вида»)

Причина, по которой она путается, заключается в том, что наВ конце дня вершины, которые вы даете OpenGL, умножаются на матрицу вида модели, а затем на матрицу проекции.То есть, учитывая матрицу вида модели M, матрицу проекции P и вершину v, конечная координата вершины определяется как P M v.Это означает, что некоторые преобразования работают независимо от того, какую матрицу вы используете.Вы должны быть осторожны с этим - когда вы перейдете к более изощренным методам OpenGL, вы столкнетесь с ситуациями, в которых использование правильных матриц будет иметь значение.

Однако пока вы не дойдете до этой точки, позвольте мне дать вамхорошее эмпирическое правило.Пока вы не привыкнете к различию между двумя матрицами, используйте только glOrtho или glFrustum на матрицах проекций (gluPerspective и их друзья тоже в порядке).Все остальные вызовы (glTranslate, glScale, glRotate и т. Д.) Относятся к классу вещей, которые вы должны делать с матрицей просмотра модели.

4 голосов
/ 04 июля 2010

Вы, вероятно, хотите прочитать http://www.opengl.org/resources/faq/technical/viewing.htm (особенно раздел 8.080).

Используйте что-то вроде следующего:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// setup your projection matrix here, e.g. with glFrustum or gluPerspective
glFrustum(...)
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(...) // with your gluLookAt parameters, of course
glTranslatef(1.0, 0.0, 0.0);
// your drawing code here

Просто для пояснения: gluLookAt создает матрицу, которая должна быть умножена на матрицу вида модели. Если вы используете порядок вызовов функций, предложенный выше, все должно работать как положено. Надеюсь, это поможет.

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