2010-11-03 2 views
6

Я пытаюсь понять функцию glLookAt.OpenGL LookAt функция: есть ли вектор вверх?

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

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

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

+0

Спасибо вам большое. Каждый ответ содержит немного полезной информации. И на мой вопрос ответили. Спасибо –

ответ

10

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

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

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

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

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

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

+0

Спасибо. Не могли бы вы посмотреть мой комментарий к ответу thecoshman? Это то, что вы имеете в виду? –

+0

То, что он говорит, это то, что если ваш вектор вверх (0,1,0) и вы решили выровнять глаз и объект, чтобы нормальный объект eye-> (или очень близко к нему) (0,1,0) вы обнаружите, что камера может вращаться или поворачиваться до неопределенного угла. Я обнаружил, что на практике, что этого не происходит, я никогда не выравниваю два достаточно, чтобы попасть в эту проблему. – thecoshman

+0

@Armen: Правильно. И поскольку эта проекция становится меньше (поскольку вектор up и lookat становится colinear) направление проекции (что важно) резко изменится с небольшими изменениями в любом векторе. Только тогда у вас появятся проблемы. – Macke

0

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

+0

Я имею в виду, что я знаю, что он произволен до тех пор, пока он перпендикулярен оси глаза, но как насчет того, когда это не так? Я до сих пор не представляю смысл ... –

2

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

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

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

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

+0

Спасибо! Это действительно помогло! –

+0

И как всегда со связанным контентом: «Ошибка 404 - Документ не найден» – Kromster

+1

@KromStern, спасибо, что указали это. Я обновил ответ с помощью новой ссылки. – bruno

3

Расширенный вектор позволяет 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). Фактически, если вы не хотите, чтобы вы могли качать камера, вам это не нужно, чтобы быть больше.

+0

Большое спасибо, но я до сих пор не понимаю, что происходит, если вектор вверх не перпендикулярен вектору от глаза к объекту. –

+0

Предположим, что A - плоскость, перпендикулярная вектору вектора глаз->. Вы говорите, что имеет значение только проекция на плоскость A вектора возраста? –

+0

erm ... позвольте мне подумать здесь. Да, я думаю. Все, что я могу сказать наверняка, - это то, что объекты глаз-> объекты действительно круто поднимаются или опускаются, тот же самый вектор до сих пор работает. Мне не нужно обрабатывать то, что перпендикулярно моему вектору взгляда, если это необходимо openGL, тогда он работает для него сам (для вас) – thecoshman

-4

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

+0

Где бы я ни наклонял голову, вектор вверх по-прежнему будет перпендикулярен самому себе -> лунному вектору.Мой вопрос - это то, что происходит, когда это не так. –

+0

Не знаете, почему вы хотите усложнить ситуацию, но, конечно, он вычисляет нормальный. Он только выйдет из-под контроля, когда вектор вверх соответствует вектору вида. –

1

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^