Почему мы перемещаем мир вместо камеры?


87

Я слышал, что в игре OpenGL мы делаем так, чтобы игрок не двигался, а перемещал весь мир.

Например, вот выдержка из этого урока: OpenGL View matrix

В реальной жизни вы привыкли перемещать камеру, чтобы изменить вид определенной сцены, в OpenGL все наоборот. Камера в OpenGL не может двигаться и определяется как расположенная в точке (0,0,0) с отрицательным направлением Z. Это означает, что вместо перемещения и вращения камеры мир перемещается и вращается вокруг камеры, чтобы создать соответствующий вид.

Зачем мы это делаем?


1
Камера представляет собой не что иное, как проекционный вид. Таким образом, вы трансформируете мир, чтобы получить желаемую проекцию. Концепция странная, но на самом деле она имеет смысл ... в некотором роде ... я думаю
Сидар

@Sharethis, я улучшил свой ответ с лучшим объяснением. Добавлена ​​проекция перспективы с опцией математики и 3D-камеры (виртуальная камера). Может быть полезно для вас и других.
Г-н Махбубур Рахман

4
На самом деле это не так, поскольку обе операции (перемещение камеры или объектов в мире) симметричны, невозможно определить, какая операция была выполнена. Вы думаете о мире, движущемся вокруг камеры, но в то же время кто-то другой может визуализировать, как камера движется в обратном направлении относительно мира ... Хорошо, вы можете перемещать объекты относительно друг друга, поэтому один из способов может быть более интуитивным, но ни человек «неправ», оба способа визуализации ситуации хороши в разных ситуациях. Часто полезно подумать об обоих.
user3728501

Ответы:


72

Почему ?

Потому что камера представляет собой проекционный вид.

Но в случае 3D-камеры (виртуальная камера) камера перемещается вместо мира. Я сделал подробное объяснение позже этого ответа.

Понимание математически

Проекционный вид перемещается в пространстве и меняет свою ориентацию. Первое, на что нужно обратить внимание, это то, что желаемая проекция на экране не меняется в зависимости от направления просмотра.

По этой причине мы трансформируем другие вещи, чтобы получить желаемую проекцию.

Понимание от http://opengl.org

Чтобы создать видимость перемещения камеры, ваше приложение OpenGL должно переместить сцену с обратным преобразованием камеры. Что касается OpenGL, там нет камеры. Точнее говоря, камера всегда расположена в координате пространства глаза (0, 0, 0)

Понимание от http://open.gl

Также хочу поделиться следующими строками из части просмотра матрицы http://open.gl/transformations

Чтобы симулировать трансформацию камеры, вам на самом деле нужно трансформировать мир с помощью инверсии этого преобразования. Пример: если вы хотите переместить камеру вверх, вы должны переместить мир вниз.

Понимание с точки зрения

В реальном мире мы видим вещи так, как это называется «перспектива».

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

Это перспектива. Перспектива имеет решающее значение в 3D-проектах. Без перспективы трехмерный мир не выглядит реальным.

Хотя это может показаться естественным и очевидным, важно учитывать, что при создании 3D-рендеринга на компьютере вы пытаетесь симулировать 3D-мир на экране компьютера, который представляет собой 2D-поверхность.

Представьте, что за экраном компьютера находится настоящая своего рода 3D-сцена, и вы смотрите ее через «стекло» экрана вашего компьютера. Используя перспективу, ваша цель состоит в том, чтобы создать код, который визуализирует то, что «проецируется» на это «стекло» экрана, как если бы за экраном был настоящий трехмерный мир. Единственное предостережение в том, что этот трехмерный мир нереален ... это всего лишь математическое моделирование трехмерного мира.

Таким образом, при использовании 3D-рендеринга для симуляции сцены в 3D и последующего проецирования 3D-сцены на 2D-поверхность экрана этот процесс называется перспективной проекцией.

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

Перевод перспективы в математику

Просматривая иллюстрацию на следующем рисунке, представьте, что объект расположен в вашей 3D-сцене. В трехмерном мире положение объекта можно описать как xW, yW, zW, ссылаясь на трехмерную систему координат с началом координат в точке глаза. Вот где объект фактически расположен, в 3D-сцене за экраном.

введите описание изображения здесь

Когда зритель наблюдает за этим объектом на экране, трехмерный объект «проецируется» в двухмерную позицию, описанную как xP и yP, которая ссылается на двухмерную систему координат экрана (плоскость проекции).

Чтобы поместить эти значения в математическую формулу, я буду использовать трехмерную систему координат для мировых координат, где ось x направлена ​​вправо, y указывает вверх, а положительные точки z находятся внутри экрана. 3D-источник относится к местоположению глаза зрителя. Итак, стекло экрана находится на плоскости, перпендикулярной (под прямым углом) к оси z, при некотором z, который я назову zProj.

Вы можете рассчитать прогнозируемые позиции xP и yP, разделив мировые позиции xW и yW на zW, как показано ниже:

xP = K1 * xW / zW yP
= K2 * yW / zW

K1 и K2 - это константы, которые определяются геометрическими факторами, такими как соотношение сторон вашей проекционной плоскости (область просмотра) и «поле зрения» вашего глаза, которое учитывает степень широкоугольного обзора.

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

Это деление на z является известным «перспективным делением».

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

Другие важные случаи

  • В случае 3D-камеры (виртуальная камера) камера перемещается вместо мира.

Чтобы лучше понять 3D-камеры, представьте, что вы снимаете фильм. Вы должны создать сцену, которую вы хотите снять, и вам нужна камера. Чтобы получить отснятый материал, вы будете перемещаться по сцене с помощью камеры, снимая объекты на сцене под разными углами и точками зрения.

Тот же процесс съемки происходит с 3D-камерой. Вам нужна «виртуальная» камера, которая может перемещаться по «виртуальной» сцене, которую вы создали.

Два популярных стиля съемки включают в себя наблюдение за миром глазами персонажа (также известный как камера от первого лица) или наведение камеры на персонажа и удержание их в поле зрения (известный как камера от третьего лица).

Это основная предпосылка 3D-камеры: виртуальная камера, которую вы можете использовать для перемещения по 3D-сцене и рендеринга отснятого материала с определенной точки зрения.

Понимание пространства мира и вид пространства

Чтобы кодировать такое поведение, вы будете визуализировать содержимое трехмерного мира с точки зрения камеры, а не только с точки зрения мировой системы координат или с какой-либо другой фиксированной точки зрения.

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

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

Эта новая система ссылок называется «мировым пространством» (или глобальным пространством). Простым способом управления ею является привязка матрицы преобразования мира к каждому объекту.

Чтобы реализовать поведение 3D-камеры, вам нужно выполнить дополнительные шаги. Вы будете ссылаться на мир - не на происхождение мира, а на систему отсчета самой 3D-камеры.

Хорошая стратегия заключается в том, чтобы рассматривать камеру как трехмерный объект в трехмерном мире. Как и любой другой 3D-объект, вы используете матрицу «преобразования мира», чтобы поместить камеру в желаемое положение и ориентацию в 3D-мире. Эта матрица преобразования мира камеры преобразует объект камеры из исходного, смотрящего вперед вращения (вдоль оси z), в реальное положение мира (xc, yc, zc) и вращение мира.

На следующем рисунке показаны взаимосвязи между системой координат World (x, y, z) и системой координат View (camera) (x ', y', z ').

введите описание изображения здесь


5
Другие ответы есть. Вам не нужно редактировать их на свои собственные.
Джесси Дорси

1
@Noctrine, спасибо. Мне было неизвестно, как создать межстраничную ссылку.
Г-н Махбубур Рахман

«В следующем разделе вы будете использовать эту формулу перспективного проецирования в ActionScript, которую сможете использовать в своих проектах Flash 3D». Поскольку в первоначальном вопросе нет упоминания о проекте Flash 3D, это заставляет меня думать, что вы скопировали это откуда-то еще, и это хорошо, если вы цитируете свои источники.
Жиль

@ Жиль, прости за мою ошибку. Я отредактировал свой ответ. Я подготовил ответ, изучая несколько источников. И большое спасибо вам, как вы указали. :)
Md Mahbubur Rahman

Обратите внимание, что glMatrixMode()и некоторые другие функции, на которые есть ссылки: eng.utah.edu/~cs6360/Lectures/frustum.pdf и opengl.org/archives/resources/faq/technical/viewing.htm , устарели. Однако математическое описание остается правильным и полезным.
patryk.beza

28

Ответ Махбубара Р. Аамана совершенно правильный, и ссылки, которые он предоставляет, точно объясняют математику, но в случае, если вам нужен менее технический / математический ответ, я попробую другой подход.

Положение объектов в реальном мире и игровом мире определяется некоторой системой координат. Система координат придает смысл значениям позиции. Если я скажу вам, что я нахожусь на уровне «100,50», это вам не поможет, если вы не знаете, что означают эти цифры (мили, километры, широта и долгота и т. Д.). Если это декартовы координаты («нормальные» координаты), вам также необходимо знать, к какому началу они относятся; если я просто скажу «я в 100 футах к востоку», вам нужно знать «к востоку от чего », что называется началом координат.

Есть простой способ думать об этом. Вы можете сказать кому-нибудь: «Железнодорожная станция находится в 3 км к северу и в 1,5 км к востоку от юго-западного угла города». Вы также можете сказать кому-нибудь: «Железнодорожная станция находится в 1 миле к северу от того места, где я сейчас нахожусь». Обе координаты являются правильными и определяют местоположение одного и того же ориентира, но они измеряются от другого источника и, следовательно, имеют разные числовые значения.

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

Алгоритм, который фактически отображает отдельный треугольник на вашем экране, работает особым образом, и поэтому неудобно напрямую работать с мировыми координатами при рендеринге. Математика на самом деле не настроена на работу с информацией типа «объект находится на расстоянии 100 единиц справа от центра мира». Вместо этого математика хочет работать с «объект находится прямо перед камерой и на расстоянии 20 единиц». Следовательно, к математике рендеринга добавлен дополнительный шаг, чтобы занять позиции объектов мира и перевести их из в систему координат камеры.

Конечно, камера имеет положение и ориентацию. Таким образом, если объект находится в положении 20, 100, и камера находится в положении 10, 200, -30, положение объекта относительно камеры составляет 10 100, 80 (положение объекта минус положение камеры). Когда камера движется в игре, ее положение в мировых координатах меняется точно так, как вы ожидаете.

Обратите внимание, что объекты не перемещаются; они остаются там, где были раньше. Однако их позиция теперь выражается относительно другого начала координат. Мировые координаты объекта перемещаются только в том случае, если сам объект движется, но его координаты камеры также изменяются при каждом перемещении камеры, поскольку они относительно положения камеры.

Также обратите внимание, что описание из учебника, который вы цитируете, является упрощенным объяснением и не обязательно точным описанием того, что делает OpenGL. Я не думаю, что автор статьи не понял этого; автор просто попытался использовать упрощенную аналогию, которая в данном случае приводила к путанице, а не устраняла ее.

Если это поможет в дальнейшем понять, почему математика заботится о координатах камеры, попробуйте это упражнение: поднимите руки, сжимая вместе большие и указательные пальцы, чтобы сделать прямоугольник (назовем это «окном просмотра»), и осмотрите комнату, в которой вы находитесь. в. Найдите объект и посмотрите на него, затем осмотрите его, но не прямо на него. Когда вы сделаете это, спросите себя: «Где объект в моем окне просмотра?» Этот объект имеет определенную долготу и широту реального мира, которую вы можете использовать, чтобы точно определить его местоположение на Земле, но это ничего не говорит вам о том, что вы видите. Сказать, что «объект находится в левом верхнем углу моего окна просмотра и выглядит примерно в 2 метрах от вас», довольно много, однако. Вы создали систему координат относительно вашей головы и направления смотря что определяет где объект согласно твоему видению. Это в основном то, что необходимо для растеризатора треугольника в OpenGL / Direct3D, и это то, что математика требует, чтобы положение и ориентация объекта были преобразованы из их удобных мировых координат в координаты камеры.


Хотя математическое объяснение для меня ясное и понятное, это тоже отличное объяснение! Я считаю, что вы помогли многим другим с тем же вопросом.
Данияр

+1 за прояснение того, движется ли камера или мир - это просто функция системы координат, о которой вы говорите.
Дэвид Моулз

11

Просто добавив к двум другим (превосходным) ответам некоторые дальнейшие уточнения по вопросу, который коснулся Махбубур Р. Ааман: «камеры нет».

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

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

Теперь у вас есть два класса объектов, которые актуальны здесь: точка зрения и все в мире. Вы хотите переместить точку обзора ближе к некоторым объектам, но для этого движения конечный результат будет одинаковым независимо от того, перемещается ли представление ближе к объектам или объекты приближаются к виду. Все, что вы делаете, это изменяете расстояние между ними; поскольку текущее расстояние равно X, и вы хотите, чтобы новое расстояние было Y, не имеет значения, какое расстояние вы перемещаете, только если после перемещения новое расстояние равно Y. Таким образом, вы вообще не двигаетесь, вы меняешь дистанцию. (Я не хотел опередить Эйнштейна в этом ... честно!)

Но, тем не менее, поскольку камера не существует, единственное, что вы можете изменить расстояние, это объекты. Таким образом, вы изменяете расстояние между объектами и получается тот же результат. Так как все объекты в любом случае проходят трансформацию , это не более или менее дорого.

Более простое математическое объяснение может помочь больше. Давайте представим, что все координаты 1D - точка обзора находится в 0, ваши объекты - в 4, и вы хотите, чтобы точка обзора достигла 3. Это означает, что расстояние между ними изменится с 4 (4 - 0) до 1 (4 - 3). Но так как камера не существует, вы не можете изменить это 0; оно всегда будет равно 0. Таким образом, вместо добавления 3 к 0 (что вы не можете сделать) вы вычитаете 3 из 4 (что вы можете сделать) - объекты теперь равны 1, и конечный результат тот же - расстояние между Точка зрения и объекты 1.


Хотя камеры как таковой не существует, вы все равно можете рассчитать ее положение до преобразования. Однако в некоторых случаях (параллельная проекция без выравнивания по оси) вы получите более одной обычной координаты «на бесконечности» (положительной или отрицательной), которая менее полезна, чем матрица преобразования.
Мартин Сойка

7

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

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

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

Таким образом, в вашем приложении вы перемещаете камеру в мировых координатах, обновляете матрицу представления камеры, передаете новую матрицу представления в вершинный шейдер как единое целое или часть блока, визуализируете свою сцену.


5

Я бы сказал, что это ошибочная аналогия. По своей сути, «перемещение камеры» и «перемещение мира» - это в точности одна и та же математическая конструкция - просто о том, что о перемещении мира несколько проще думать концептуально, особенно когда речь идет об иерархических преобразованиях. По сути, вы перемещаете мир вокруг камеры только тем, что переводите мировые вершины в координатное пространство камеры - но это обратимое аффинное преобразование.

Однако, когда вы начинаете вносить определение видимости в микс, последнее, что вы хотите сделать, это перевести весь мир вокруг камеры. Вместо этого, в большинстве случаев (особенно в классическом случае с фиксированными BSP и т. П.) Вы будете использовать положение камеры в мире, чтобы запрашивать ваши структуры видимости, чтобы определить, какие объекты могут быть видны, а затем переводить ТОЛЬКО вещи в координатное пространство камеры.


4

Я не думаю, что утверждение категорически верно, так как в игре редко кто-то «перемещает» мировые координаты, но фактически изменяет координаты виртуальной камеры.

Что на самом деле делает концепция камеры, так это преобразование конечного усеченного поля зрения - это усеченная пирамида с 8 угловыми точками (или определяемая пересечением 6 плоскостей) в единичный куб, который представляет пространство клипа на последних этапах openGL рендеринг конвейера.

В этом смысле мир не перемещается, а только вычисляются мировые координаты в системе координат пространства клипа.


2

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


2

Здесь много хороших ответов. Я постараюсь не повторять ни одного из них. Иногда это проще представить с точки зрения камеры, например, как это делает Direct3D (примечание: не играл с большим количеством поста 9.0c)

«Перемещение мира», как в смысле Футурамы, о котором кто-то цитировал, - это очень хороший способ взглянуть на это («Двигатели вообще не двигают корабль. Корабль остается там, где он есть, а двигатели движут вселенную вокруг». Это!"). Это было на самом деле довольно часто для 2D-игр. У вас буквально был видовой экран, который вам было бы трудно отрегулировать, и иногда это была ваша видеопамять или окно пользовательского интерфейса. Если OpenGL делает это по тем или иным причинам, трудно сказать.

Вы, конечно, можете думать о 2D-движении с точки зрения камеры, и именно такой процесс мышления может облегчить определение эффектов.


1
Поздно, но хороший ответ тоже!
Данияр

Спасибо! Я всегда находил, что добавление к обсуждению на страницах, которые можно найти с помощью поисковой системы, очень ценится, особенно если информация полезна или интересна
Джо Планте

2

Кажется, здесь много недоразумений, начиная с авторов документации OpenGL ...

Позвольте мне быстро восстановить ваше здравомыслие: мир не движется , он остается на месте. Кто бы ни пытался реализовать мир как движение вокруг игрока, он быстро столкнется с проблемой в многопользовательском режиме. Не говоря уже о том, что обновление позиций миллионов (или миллиардов) объектов в мире на ходу каждого игрока приведет к довольно медленному игровому процессу ...

Итак, что на самом деле там происходит, и что там с цитатой?

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

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

Однако мир не действует в координатах игрока, он работает в мировых координатах. А там, где задействованы две системы координат, всегда есть способ преобразовать один вид координат в другой. В OpenGL это делается с использованием матрицы вида 4x4.

В конечном счете, когда игрок перемещается, мир остается неподвижным, в то время как игрок перемещается. Это в мировых координатах, способ хранения объектов в вашей игре. У игрока также есть связанная с ним камера обзора, и эта камера также перемещается по всему миру (несмотря на то, что, похоже, говорят документы OpenGL). Однако, чтобы показать мир на экране пользователя, координаты всех видимых объектов переводятся в систему координат игрока с использованием матрицы преобразования, а затем применяется дополнительная проекция для создания эффекта перспективы. В системе координат этого игрока мир фактически движется вокруг игрока. Но это просто крайне бесполезный и запутанный способ думать об этом.


« Начиная с авторов документов OpenGL » Правильно, потому что я уверен, что создатели OpenGL явно слишком глупы, чтобы понять разницу между представлением мира (о котором все заботятся OpenGL) и концептуальным представлением этого мира ( что не то, с чем OpenGL имеет дело).
Николь Болас

« Но это просто крайне бесполезный и запутанный способ думать об этом». Это также правда . И правда всегда полезнее лжи. Потому что рано или поздно эта ложь настигнет вас, и вам придется столкнуться с правдой.
Николь Болас
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.