Компонент Camera: типы проекций, fov, near/far, viewport

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

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

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

Для настройки перспективной проекции в компоненте Camera используется свойство fov (field of view), которое определяет угол поля зрения камеры. Чем выше значение fov, тем шире угол обзора, и наоборот. Обычные значения для поля зрения находятся в диапазоне от 30 до 90 градусов, в зависимости от конкретной задачи и типа сцены.

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

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

В ортографической проекции в PlayCanvas также используется свойство fov, однако оно принимает значение, которое ограничивает видимый диапазон в координатах, но не влияет на искажение размеров объектов. Вместо этого есть другие параметры, которые могут быть полезны, такие как left, right, top, bottom, определяющие границы видимой области сцены.

Параметры камеры: fov, near/far

Свойства fov, near и far имеют важное значение для определения, как камера будет взаимодействовать с окружающим миром.

Свойство fov

Параметр fov (field of view) отвечает за угол обзора камеры. Для перспективной проекции это значение определяет, насколько широко будет охватывать область просмотра сцены. Это значение обычно устанавливается в диапазоне от 30 до 90 градусов, в зависимости от того, как сильно нужно “растянуть” сцену или какие объекты в ней должны быть видны.

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

Свойства near и far

Свойства near и far описывают пределы видимости камеры в 3D-пространстве. Эти параметры задают минимальное (near) и максимальное (far) расстояния от камеры, на которых объекты будут видны.

  • near — это ближайшая точка, до которой объекты всё ещё могут быть видны. Все объекты, расположенные ближе, чем заданное значение near, будут обрезаны. Это значение важно для предотвращения визуальных артефактов, таких как “выпадение” объектов за пределы камеры.
  • far — это дальняя точка, за которой объекты будут обрезаны. Все объекты, находящиеся за этой точкой, не будут отображаться.

При установке значений для near и far важно учитывать, что чем меньшие значения вы зададите для near, тем точнее камера будет отображать объекты, расположенные очень близко. Однако слишком маленькое значение может привести к визуальным проблемам, таким как “пересечение” объектов в пространстве.

В PlayCanvas важно правильно выбирать диапазоны для этих параметров, чтобы избежать артефактов на экране, таких как «зажатые» или искажённые объекты.

Параметр viewport

В PlayCanvas компонент Camera также управляет параметром viewport, который задаёт область экрана, на которой будет отображаться сцена. Этот параметр может быть полезен для разделения экрана на несколько частей (например, для мини-карт или для создания многокамерных сцен).

Свойство viewport принимает объект с четырьмя параметрами:

  • x — смещение по оси X (в долях от ширины экрана).
  • y — смещение по оси Y (в долях от высоты экрана).
  • width — ширина области просмотра (также в долях от общей ширины экрана).
  • height — высота области просмотра (в долях от общей высоты экрана).

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

camera.viewport = new pc.Vec4(0, 0.5, 0.5, 0.5);

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

Пример настройки камеры

Для настройки камеры в PlayCanvas, учитывая все вышеописанные параметры, можно использовать следующий код:

var cameraEntity = new pc.Entity();
cameraEntity.addComponent('camera', {
    fov: 60, // угол обзора
    near: 0.1, // минимальное расстояние видимости
    far: 1000, // максимальное расстояние видимости
    aspectRatio: canvas.width / canvas.height, // пропорции экрана
    viewport: new pc.Vec4(0, 0, 1, 1) // область просмотра
});

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

Заключение

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