Что такое ортографическая камера

Что такое ортографическая камера

Ортографическая камера

Эта страница представляет OrthographicCamera класс и его использование. Ортографическая камера используется в 2D средах только там, где она реализует параллельную (ортографическую) проекцию и где нет масштабного фактора для конечного изображения, несмотря на местонахождения объекта в мире.

Описание

Класс Camera работает как очень простая камера реального мира. В отношении камеры можно:

  • Перемещать и вращать камеру вокруг
  • Увеличивать и уменьшать масштаб
  • Изменить область просмотра
  • Делать проецирование/обратное проецирование в и из координат окна/пространства мира.

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

Следующее небольшое приложение демонстрирует использование простой OrthographicCamera камеры для перемещения вокруг плоского мира. Чтобы представить мир (карту), его представляет плоская квадратная Mesh с текстурой на поверхности. Картой является большой квадрат (1024×1024 пикселей) и окно просмотра 480×320 пикселей.

Окно просмотра это прямоугольная область видимая в любой момент из игрового мира. Если увеличить масштаб, то тем менее получиться прямоугольная область. Так как размер экрана не меняется, окно просмотра масштабируется до фактического разрешения.

Выше описанный класс это Libgdx приложение, которое будет использовать ортографическую камеру для перемещения вокруг мира. Опять же, миром является квадрат 1024×1024 пикселей. Для его представления, использована квадратная плоскость того же размера. Ортографическая камера позволяет легко работать с пикселями, даже если OpenGL это не нравится. Потому что нет Z оси, мы можно спокойно определить на мир, как 1024 единиц в ширину и длину. Если для текстуры используется изображение 1024×1024 и полигональная сетка тоже 1024×1024 единиц в ширину и длину, то мы используем идеальную проекцию пикселя.

Для окна просмотра будут использованы жестко заданные ширина и высота.

  1. С помощью OrthographicCamera экземпляра, мы будет контролировать взгляд на мир.
  2. Текстурное изображение мы будем показывать в роли карты (мира).
  3. Полигональная сетка, простой квадрат, к которому будет применена текстура.
  4. Прямоугольник представляющие окно просмотра
  5. Скорость в углах, с которой камера вращается при каждым вызовом визуализации.

Все устанавливается в onCreate методе.

  1. Устанавливает текущую скорость вращения в 0,5 градуса.
  2. Создает квадратную полигональную сетку. Первый параметр сообщает libgdx сделать сетку статической. Второй параметр сообщает, что сетка будет содержать 4 вершины (квадрат). Третий параметр представляет собой количество индексов, которые будут использоваться. Квадратных состоит из 2 треугольников и каждый треугольник имеет 3 вершины, таким образом, 2 * 3 = 6. Четвертый параметр сообщает о том, что позиция сетки описывается тремя значениями (x, y, z). Пятый параметр устанавливает значение равное 2 для атрибута позиции текстуры.
  3. Создает текстуру из sc_map.png файла. Загрузите текстуру и добавьте ее в assets/src директорию.
  4. Устанавливает массив вершин для полигональной сетки. Первые три элемента являются x, y, z координатами, а следующие два описывают текстурные координаты для этой вершины. Обратите внимание, что Z координата равна 0 , так как мы в 2D. Здесь 4 вершины.
  5. Установка индексов для вершин, что в результате был квадрат.
  6. Создание OrthographicCamera . Два параметра определяют ширину и высота окна просмотра, который будет создан. Мы будем использовать размер окна приложения.
  7. Установка исходного положения камеры в центр экрана. Помните, что (0,0) находится в левом нижнем углу, поэтому начальное положение камеры будет нижней левой часть мира.
  8. Создание прямоугольника с левой нижней точкой (0,0), имеющего ширину и высоту заданную константами (эквивалентными размер окна).

Настройка выполнена. Камера была создана и расположена (указывает) в нижнем левом углу мира.

  1. Управляет камерой через обновление ее позиции, масштаба, вращения, основанного на нажатие различных клавиш.
  2. Получает OpenGL экземпляре. Должна быть версия 1, так как версия 2 не поддерживается для OrthographicCamera .
  3. Очищает экран (фактически буфер цвета).
  4. Устанавливает окно просмотра для OpenGL контекста, чтобы использовать окно просмотра, которое мы определили во время создания. В данный момент мы не обрабатываем изменение размеров.
  5. Обновляет камеры, очень важный шаг. Так как матрица проекции была изменена в handleInput методе, то этим просто сообщается камере о необходимости пересчитать матрицу проекции и отсечения для камеры.
  6. Устанавливает текущею проекцию и матрицу вида модели камеры. Вызывается после обновления.
  7. Выбирается активная текстура.
  8. Включается возможность наложения текстур.
  9. Привязка текстуры к контексту.
  10. Визуализация полигональной сетки с картой.
Читайте также:  Что такое боязнь камеры

Метод handleInput() просто опрашивает пользовательский ввод, если были нажаты определенные клавиши, то камера изменяется соответствующим образом.

Клавиши управления перемещаю камеру, Q и A увеличивают и уменьшают масштаб, W и E вращают камеру. Здесь есть несколько механизмов защиты, которые не позволяют камере выходить за границы мира.

Основным приложением для начальной загрузки обработчика является LWJGL приложение.

В результате получается следующее приложение:

Большую часть времени нет нужны иметь доступ к свойствам камеры, так как наиболее распространенные сценарии покрыты следующими методами:

Методы и описание
lookAt(float x, float y, float z)

Пересчитывает направление камеры, чтобы камера смотрела на точку, определенную координатами по всем осям. Ось Z игнорируется для 2D.

translate(float x, float y, float z)

Перемещает камеру на заданное значение по каждой оси. Обратите внимание, что ось Z игнорируется для OrthographicCamera .

rotate(float angle, float axisX, float axisY, float axisZ)

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

Пересчитывает матрицы проекции и вида камера, а так же плоскость отсечения.

apply(GL10 gl)

Устанавливает текущую матрицу проекции и вида модели камеры. Нужно вызывать после update() метода и принимается как параметр экземпляр OpenGL 1.0 или 1.1. В настоящее время отсутствует поддержка для версии OpenGL 2.0.

Источник

Русские Блоги

ортогональная проекционная камера three.js

Ортогональная проекционная камера и перспективная проекционная камера

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

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

(а) перспективная проекция, (б) ортогональная проекция

Итак, нужна ли вашей программе орфографическая камера?

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

Orthographic Camera более интуитивно понятна в настройке, и ее конструктор:

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

Чтобы поддерживать вертикальное и горизонтальное соотношение камеры, необходимо обеспечить (right — left) и (top — bottom) Соотношение такое же, как и у ширины холста к высоте.

near и far Оба относятся к положению камеры в плоскости глубины, и камера не должна захватывать объекты позади нее, поэтому оба значения должны быть положительными. Чтобы камера не игнорировала объекты на сцене, поскольку они расположены слишком близко или слишком далеко, как правило, near Устанавливается на меньшее значение, far Значение установлено на большое значение, а конкретное значение зависит от положения объекта на сцене.

Пример показывает,

Ниже мы объясним настройку ортогональной проекционной камеры на конкретном примере.

Основные настройки

Создайте длину ребра в начале координат как 1 Куб, чтобы сравнить с эффектом перспективы, здесь мы используем wireframe Вместо твердого материала, чтобы увидеть края за кубом:

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

Соотношение сторон

Здесь наша ширина холста 400px Высота 300px , Горизонтальное расстояние камеры 4 Вертикальное расстояние 3 Таким образом, соотношение сторон остается прежним. Чтобы проверить эффект при изменении соотношения сторон, мы уменьшаем горизонтальное расстояние камеры до 2 :

В результате горизонтальное направление растягивается:

[+] Посмотреть оригинал

Положение камеры

Далее, давайте посмотрим на влияние положения камеры на результаты рендеринга. В предыдущем примере мы установили камеру на (0, 0, 5) Положение, и поскольку камера по умолчанию расположена лицом к отрицательной оси Z, вы можете увидеть куб в начале координат. Теперь, если мы переместим камеру вправо 1 Единицы измерения:

В результате объект кажется движущимся влево:

[+] Посмотреть оригинал

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

Итак, при настройке ортогональной проекционной камеры, вам нужно убедиться, left и right Это противоположное число? Если нет, то какой эффект это даст? Ниже мы изменим исходные параметры (-2, 2, 1.5, -1.5, 1, 10) Изменить на (-1, 3, 1.5, -1.5, 1, 10) То есть установите громкость просмотра справа:

[+] Посмотреть оригинал

Внимательные читатели обнаружили, что это эквивалентно ранее полученному эффекту при перемещении камеры вправо.

Посмотри на мир под другим углом

До сих пор мы использовали камеру для наблюдения вдоль отрицательного направления оси z, поэтому мы видим только квадрат. Теперь мы хотим попытаться посмотреть на этот куб. Мы научились устанавливать положение камеры, поэтому давайте установим ее на (4, -3, 5) Департамент:

Но теперь камера смотрит в отрицательном направлении оси z, поэтому куб не виден, только черный. Мы можем пройти lookAt Функция указывает направление, в котором она смотрит на источник:

Тогда мы можем посмотреть на куб:

[+] Посмотреть оригинал

Источник

Русские Блоги

Ортографическая проекционная камера Three.js OrthographicCamera и перспективная проекционная камера PerspectiveCamera

Ортографическая камераOrthographicCameraИ перспективная проекционная камераPerspectiveCamera

Базовый класс Camera

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

Трехмерные сцены для различных приложений требуют разных методов проецирования.Например, ортогональная проекция (параллельная проекция) часто используется в областях механического и промышленного дизайна, а перспективная проекция (центральная проекция) часто используется в больших игровых сценах. Чтобы реализовать различные методы проецирования 3D-сцен, three.js инкапсулирует API WebGL и связанные алгоритмы и предоставляет ортогональную камеру.OrthographicCameraИ перспективная проекционная камераPerspectiveCamera。

Простое объяснение ортогональной проекции и перспективной проекции

Ниже приводится краткое введение в алгоритм проецирования ортогональной проекционной камеры и перспективной проекционной камеры. Для новичков вы можете произвести впечатление. Если вы хотите узнать больше, вы можете изучить графику или прочитать файлы в каталоге src с официальным исходным кодом threejs. OrthographicCamera.js с участием PerspectiveCamera.js

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

Для ортогональной проекции угол, под которым расположена прямая линия, отличается, а длина проекции на поверхности проекции иная; для перспективной проекции результат проекции связан не только с углом геометрии, но также и с расстоянием. Человеческий глаз наблюдает мир как перспективу Например, проекция: чем дальше вы видите железную дорогу, тем меньше ширина между двумя путями. Независимо от ортогональной проекции или перспективной проекции, three.js инкапсулирует связанные алгоритмы проекции. Вам нужно только выбрать разные методы проекции в соответствии с различными сценариями приложения. использовать OrthographicCamera Когда объект камеры, three.js автоматически вычисляет результат проекции геометрии в соответствии с алгоритмом ортогональной проекции; используйте PerspectiveCamera Когда объект камеры, three.js автоматически вычисляет результат проекции геометрии в соответствии с алгоритмом перспективной проекции.

Ортографический объект камерыOrthographicCamera

Параметры (атрибуты) имея в виду
left Левая граница области рендеринга
right Правая граница области рендеринга
top Верхняя граница области рендеринга
bottom Нижняя граница области рендеринга
near Атрибут near указывает, как далеко от камеры начать рендеринг. Обычно устанавливается очень маленькое значение. Значение по умолчанию 0,1
far Атрибут far указывает, как далеко от камеры нужно отсечь рендеринг. Если заданное значение слишком мало, часть сцены не будет видна. Значение по умолчанию 1000


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

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

Конструктор OrthographicCamera Параметры ( left,right,top,bottom,near,far) По сути, это инкапсуляция матрицы проекции WebGL, ширина width ,высота height Чем больше размер, тем больше координаты положения вершин 3D-модели, и сеточная модель за пределами видимой области будет обрезана и больше не будет отображаться на экране. Вы также можете увидеть параметры left против right , параметр top против bottom Противоположны друг другу, цель этого — lookAt Заостренный объект можно отобразить в середине холста.

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

Конструктор PerspectiveCamera формат

параметр имея в виду По умолчанию
fov fov представляет собой поле зрения. Так называемое поле зрения — это диапазон углов, которые можно увидеть. Человеческий глаз может видеть поле зрения примерно 180 градусов. Угол обзора должен быть установлен в соответствии с конкретным приложением. Как правило, игра устанавливается от 60 до 90 градусов. 45
aspect аспект представляет собой соотношение сторон окна рендеринга. Если на веб-странице есть только один полноэкранный холст и только одно окно на холсте, то значение аспекта — это соотношение сторон клиентской области окна веб-страницы. window.innerWidth/window.innerHeight
near Атрибут near указывает, как далеко от камеры начать рендеринг. Обычно устанавливается очень маленькое значение. 0.1
far Атрибут far указывает, как далеко от камеры нужно отключать рендеринг. Если заданное значение слишком мало, некоторые сцены не будут видны. 1000

Положение камеры .posiiotn с участием .lookAt (прицельная позиция камеры)

камераCameraБазовый классObject3D, Объект камеры Camera Имеет атрибуты местоположения .posiiotn , Через атрибут местоположения .posiiotn Вы можете установить положение камеры.

.lookAt() Метод используется для указания координатного положения объекта камеры, .lookAt() Параметр метода — трехмерный векторный объект, представляющий координаты положенияVector3,так что .lookAt() Параметры метода можно закодировать new THREE.Vector3(x,y,z) Настроить. В реальной разработке вы хотите, чтобы камера указывала на какой объект, а затем возвращала атрибут позиции этого объекта. .posiiotn , Например, в приведенном выше коде scene.position , То есть вернуть координаты положения сцены, если поставить scene.position Положение определенного объекта модели сетки mesh.position , mesh.position Представляет локальные координаты положения сетки модели сетки. Положение точки наблюдения через камеру и .lookAt() Местоположение метода может использоваться для расчета угла съемки камеры, что по сути является расчетом матрицы обзора объекта камеры. .matrixWorldInverse 。

Для перспективной проекции положение камеры и lookAt Чем меньше расстояние между указанными точками наблюдения, тем больше увеличение трехмерной модели в сцене. Точнее говоря, диапазон, в котором может снимать перспективная проекционная камера, меньше, и сцена Scene Часть параметров камеры за пределами диапазона ограничений будет обрезана, например, при изменении приведенного выше кода. camera.position.set(100,200,200); за (20,20,20) , По результатам теста вы обнаружите, что геометрия куба отображается увеличенной, а лишняя область обрезана.

Размещение камеры

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

Источник

Поделиться с друзьями
СервисКлимат
Adblock
detector