Вывод (glu)lookAt

Я пытаюсь изучить (современный) OpenGL, и я полностью сбит с толку о различных преобразованиях...

Матрица просмотра меня запутала, поэтому мне нужно кое-что прояснить.

Вот что я понял о (обычном) конвейере.

  1. Вершины задаются в мировом пространстве, которые масштабируются, переводятся, вращаются и т. Д. В требуемые позиции с использованием матрицы моделирования
  2. (Здесь я начинаю путаться) Мы можем (необязательно) расположить виртуальную камеру в требуемом месте, используя функцию "lookAt" (gluLookAt). Я следил за выводом матрицы здесь: http://www.youtube.com/watch?v=s9FhcvjM7Hk. Я понимал до того момента, когда профессор вычисляет вектор "наблюдения". Он говорит, что вектор взгляда = глаз - центр. Теперь здесь я начинаю заблудиться. Мой первый инстинкт заключается в том, что вектор должен быть центром глаза. Предположим, что вектор центра представлен как (0,0,0), а вектор глаза - (0,0,5). Чтобы смотреть на объект, камера должна указывать на центр - глаз = (0,0,-5). Тем не менее, профессор заявляет, что мы хотим переместить центр-глаз в направлении -z (что это значит?). Поэтому глазной центр даст взгляд на направление. Я запутался в этом. Далее он добавляет, что в OpenGL есть камера в начале координат (0,0,-1). Теперь это я совершенно не понимаю. Я понимаю, что трансформация просмотра - это не что иное, как применение обратного преобразования к объектам. Я немного поэкспериментировал и обнаружил, что когда я нарисовал треугольник с z-значением 1(и абсолютно без преобразований вида / проекции модели), он все равно был нарисован на экране. Тем не менее, я не ожидал бы, что это будет так, поскольку камера находится в начале координат.

Теперь, чтобы подвести итог...

  • Почему взор = центр глаза?
  • Что это за камера, которая находится в начале координат и смотрит на z=-1?

Любые объяснения / указатели?

2 ответа

Решение

Когда вы визуализируете треугольник, координаты вершин интерпретируются следующим образом:

  • Координата x будет влиять на горизонтальное положение в области просмотра. -1 - левый край, +1 - правый край.
  • Координата Y будет влиять на вертикальное положение в области просмотра. -1 - нижний край, +1 - верхний.
  • Координата z будет влиять на информацию о глубине. -1 - это положение в плоскости камеры (рядом), а +1 - в дальней плоскости. Это значение обычно используется для записи в буфер глубины.

Вот почему ваш простой пример отображает видимый треугольник в дальней плоскости.

Теперь давайте перейдем к просмотру трансформации. Преобразование будет построено из четырех векторов. Изображение (1, 0, 0), изображение (0, 1, 0), изображение (0, 0, 1) и вектор перевода. Однако, поскольку преобразование вида является обратным преобразованием, результирующая матрица должна быть инвертирована.

Вы правы, что направление обзора center - eye, Однако это не то, что нам нужно для матрицы. Нам нужно изображение (0, 0, 1). Обычно программы OpenGL используют правую систему координат. В этой системе камера смотрит в отрицательное z-направление. Так center - eye на самом деле изображение (0, 0, -1). Изображение (0, 0, 1) тогда просто eye - center, Это то, что вам нужно.

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

При использовании виртуальной камеры обычно определяют пространство глаза. Это определение может быть произвольным, но есть некоторые широко распространенные соглашения (и старый матричный стек GL определил или предпочел некоторые соглашения). gluLookAt указано для следующего соглашения:

  1. камера находится в начале координат
  2. камера смотрит в отрицательном направлении z, +x - это правая ось, а + y - это направление вверх (поэтому мы имеем правую систему координат)

Вы должны знать, что world space не имеет значения при рендеринге. Все, что имеет значение, это относительное расположение объектов относительно виртуальной камеры / глаза (и именно поэтому старый стек матрицы GL имеет комбинированный ModelView матрица, а не две отдельные матрицы для Model а также View transfroms). Использование мирового пространства, в котором размещены все объекты, и указание виртуальной камеры в этом пространстве просто более интуитивно понятно. И это то, что gluLookAt должен делать. Если вы оставите view Матрица в Идентичности, это как если бы ваша камера находилась в мировом пространстве, смотря в направлении -z. Таким образом, чтобы получить эффект перемещения камеры к определенной точке зрения, это то же самое, что и перемещение всех объектов в этом мировом пространстве в обратном направлении. То же самое верно для вращений. А также gluLookAt просто настроит ротацию и перевод. Посмотрите на мой предыдущий ответ оgluLookAt для некоторых деталей.

Другие вопросы по тегам