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

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

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

  

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

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

82 голоса | спросил danijar 28 +04002012-10-28T14:25:46+04:00312012bEurope/MoscowSun, 28 Oct 2012 14:25:46 +0400 2012, 14:25:46

9 ответов


70

Почему?

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

  

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

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

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

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

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

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

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

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

  

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

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

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

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

Точка зрения. Перспектива важна в 3D-проектах. Без перспективы 3D-мир не выглядит реальным.

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

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

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

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

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

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

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

<p> Когда зритель наблюдает за этим объектом на экране, 3D-объект «проецируется» в двумерную позицию, описываемую как xP и yP, которая ссылается на двумерную систему координат экрана (плоскость проекции). </p>

<p> Чтобы поместить эти значения в математическую формулу, я буду использовать трехмерную систему координат для мировых координат, где ось x указывает вправо, y указывает вверх и положительные z точек внутри экрана. Трехмерное происхождение относится к местоположению глаза зрителя. Таким образом, стекло экрана находится на плоскости, ортогональной (под прямыми углами) к оси z, при некотором z, которую я назову zProj. </p>

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

<blockquote>  <p> xP ​​= K1 * xW /zW <br>
  yP = K2 * yW /zW </p>
</blockquote>

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

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

<p> Это деление на z - это знаменитая «перспектива». </p>

<p> Теперь рассмотрим, что объект в 3D-сцене определяется как ряд вершин. Таким образом, применяя этот вид преобразования ко всем вершинам геометрии, вы эффективно гарантируете, что объект будет уменьшаться, когда он будет дальше от точки наблюдения. </p>

<p> <strong> Другие важные случаи </strong> </p>

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

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

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

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

<p> <strong> Понимание пространства мира и пространства просмотра </strong> </p>

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

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

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

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

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

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

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

<p> <img src =

ответил Md Mahbubur Rahman 28 +04002012-10-28T15:32:43+04:00312012bEurope/MoscowSun, 28 Oct 2012 15:32:43 +0400 2012, 15:32:43
26

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

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

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

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

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

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

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

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

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

ответил Sean Middleditch 28 +04002012-10-28T16:34:01+04:00312012bEurope/MoscowSun, 28 Oct 2012 16:34:01 +0400 2012, 16:34:01
10

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

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

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

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

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

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

ответил Maximus Minimus 28 +04002012-10-28T18:54:06+04:00312012bEurope/MoscowSun, 28 Oct 2012 18:54:06 +0400 2012, 18:54:06
5

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

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

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

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

ответил Sean Harmer 28 +04002012-10-28T18:59:09+04:00312012bEurope/MoscowSun, 28 Oct 2012 18:59:09 +0400 2012, 18:59:09
4

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

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

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

ответил Aki Suihkonen 28 +04002012-10-28T18:36:09+04:00312012bEurope/MoscowSun, 28 Oct 2012 18:36:09 +0400 2012, 18:36:09
4

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

Однако, когда вы начинаете вводить определение видимости в микс, LAST, что вы хотите сделать, это перевести весь мир вокруг камеры. Вместо этого, в большинстве случаев (особенно в классическом случае с фиксированными BSP или т. П.) Вы будете использовать позицию камеры в мире, чтобы запросить структуры видимости, чтобы определить, какие вещи, вероятно, будут видны, а затем только перевести THOSE вещи в координатное пространство камеры.

ответил fluffy 29 +04002012-10-29T09:10:29+04:00312012bEurope/MoscowMon, 29 Oct 2012 09:10:29 +0400 2012, 09:10:29
2

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

ответил CoolProgrammer 3 62012vEurope/Moscow11bEurope/MoscowSat, 03 Nov 2012 19:28:00 +0400 2012, 19:28:00
2

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

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

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

ответил Joe Plante 1 Maypm13 2013, 17:39:17
2

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

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

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

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

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

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

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

ответил Pasha 25 Mayam13 2013, 00:41:48

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132