Функция OpenGL LookAt: произвольный вектор вверх? - PullRequest
6 голосов
/ 03 ноября 2010

Я пытаюсь понять функцию glLookAt.

Требуется 3 тройки. Первое - это положение глаза, второе - это точка, на которую смотрит глаз. Эта точка появится в центре моего окна просмотра, верно? Третий - вектор «вверх». Я понимаю значение вектора «вверх», если он перпендикулярен вектору от глаза до точки зрения. Вопрос в том, разрешено ли указывать другие векторы для up, и, если да, в чем тогда смысл?

Ссылка на графическое подробное объяснение gluPerstpective, glLookAt и glFrustum также будет высоко ценится. Официальная документация OpenGL не предназначена для новичков.

Обратите внимание, что я понимаю значение вектора повышения, когда он перпендикулярен вектору глаза -> объекта. Вопрос в том, что означает (если есть), если это не так. Я не могу понять это с помощью игры с параметрами.

Ответы [ 6 ]

11 голосов
/ 03 ноября 2010

Он работает до тех пор, пока он «достаточно перпендикулярен» вектору вверх. Важна плоскость между вектором вверх и вектором взгляда.

Если эти два будут выровнены, направление вверх будет более или менее случайным (в зависимости от очень маленьких битов в ваших значениях), так как небольшая регулировка этого значения будет указывать выше / влево / вправо от просмотра вектор.

Если у них достаточно большой угол разделения (в 32-битной математике с плавающей запятой), это будет хорошо работать. Этот угол обычно не должен быть больше градуса или около того, поэтому они могут быть очень близки. Но если разница уменьшается до нескольких битов, каждый измененный бит приведет к огромным прямым изменениям.

Это сводится к числовой точности.

(я уверен, что есть больше математических терминов и определений для этого, но прошло уже несколько лет с тех пор, как колледж ..:)

последнее слово: Если векторы параллельны, то направление вверх полностью не определено, и вы получите вырожденную матрицу вида.

3 голосов
/ 03 ноября 2010

Вектор вверх позволяет openGL знать, как работает ваша камера.

Подумайте в реальном мире, если вам нужны точки в пространстве, вы можете провести линию от одного к другому. Затем вы можете выровнять объект, например камеру, так, чтобы он указывал от одного к другому. Но у вас нет возможности узнать, как ваш объект должен вращаться вокруг этой оси, которую делает линия. Вектор вверх указывает, в каком направлении должна стоять камера.

в большинстве случаев ваш вектор повышения будет (0,1,0), что означает, что камера будет вращаться так же, как вы обычно держите камеру, или если вы держите голову прямо. если вы установите свой вектор подъема (1,0,0), это будет все равно, что держать голову на боку, поэтому от основания головы до макушки она направлена ​​вправо. Вы по-прежнему смотрите из одной и той же точки (более или менее) в ту же точку, но ваше «вверх» изменилось. Вектор взгляда (0, -1,0) заставил бы камеру быть вверх ногами, как если бы вы делали ручную стойку.

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

Эта картинка может вам помочь http://images.gamedev.net/features/programming/oglch3excerpt/03fig11.jpg

Eidt

Перпендикулярно или нет.

Я понимаю, что вы сейчас спрашиваете. Например, если вы (10,10,10) смотрите (0,0,0), результирующий вектор для направления вашего взгляда будет (-10, -10, -10) вектором, перпендикулярным этому, не имеет значения для цели Вы подняли вектор glLookAt, если вы хотите, чтобы представление было ориентировано так, чтобы вы были как обычный человек, просто немного смотрящий вниз, просто установите вектор на (0,1,0). На самом деле, если вы не хотите иметь возможность прокручивать камера, вам не нужно, чтобы это было лучше.

2 голосов
/ 03 ноября 2010

На этом сайте у вас есть отличный учебник

http://www.xmission.com/~nate/tutors.html

http://users.polytech.unice.fr/~buffa/cours/synthese_image/DOCS/www.xmission.com/Nate/tutors.html

Загрузите исполняемые файлы и вы можете изменить значения параметровв функцию glLookAt и посмотрите, что происходит "в режиме реального времени".

1 голос
/ 03 ноября 2010

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

Учитывая, что у вас есть нормаль плоскости обзора, N (направление взгляда) и вектор вверх (который не должен быть параллелен N), UV вы рассчитываете фактический вектор вверх, который будет использоваться при преобразовании камеры первым вычисляя вектор V = UV - (N * UV) N. V в свою очередь используется для вычисления фактического вектора повышения, используемого путем создания вектора, перпендикулярного как N, так и V, как U = N x V.

0 голосов
/ 03 ноября 2010

Выйдите на улицу, посмотрите на луну. Горизонт находится на дне. Наклоните голову влево, горизонт поворачивается вправо. Вектор вверх - это ориентация вашей головы.

0 голосов
/ 03 ноября 2010

Да.Это произвольно, что позволяет вам «вращать» камеру, т.е. выглядеть так, как будто сцена вращается вокруг оси глаза.

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