LeCodesdocs

Scene

3D-мир: набор для отрисовки, Camera, источники света и окружение. Открытие сцены поднимает 3D-движок хоста — рендерит и получает события указателя только активная сцена. Для AR-сессии с камерой используй ARScene (подкласс).

Обзор

TypeScript
const scene = new Scene({ skybox: '#202030', bloom: true })
scene.add(
  Light.sun({ shadowsQuality: 2 }),
  Mesh.box({ material: Material.lit({ color: '#e33' }), position: [0, 0.5, -2] }),
)
scene.camera.position = [0, 1.5, 2]
scene.open()

scene.addEventListener('click', ev => {
  console.log('hit', ev.target?.name ?? 'nothing')
})

Создание

TypeScript
new Scene(options?: {
  ibl?: boolean                    // окружающий свет на основе изображения; по умолчанию true
  environmentIntensity?: number    // интенсивность IBL; по умолчанию 20000
  bloom?: boolean                  // пост-обработка bloom; по умолчанию false
  bloomIntensity?: number          // сила bloom; по умолчанию 0.2 (только с bloom: true)
  skybox?: ColorInput              // сплошной фон / цвет очистки
  antialias?: boolean              // 4× MSAA; по умолчанию false
})

Освещение задаётся явно: IBL по умолчанию даёт каждой сцене окружающий свет (поставь ibl: false, если освещаешь всё сам); добавь Light.sun() для прямого света и теней.

Note

опции доступны только в конструкторе, кроме фона (сеттер scene.skybox = …) и сглаживания (setAntialias). Рантайм-переключателя для ibl или bloom нет.

Добавление и удаление узлов

TypeScript
scene.add(...nodes: Node[]): this
scene.remove(...nodes: Node[]): this

Регистрирует узлы в наборе отрисовки этой сцены. Это отличается от родительстваnode.add(child) строит иерархию (см. Node); scene.add(node) помещает его в мир.

Открытие и закрытие

TypeScript
scene.open(): void        // стать активной сценой (закрывает любую другую)
scene.close(): void       // разобрать 3D-вид
Scene.active              // статик: активная сейчас Scene или null

Активна одновременно только одна сцена; open() на второй сцене заменяет первую. После close() Scene.activenull (если это была активная). ARScene.open()async — см. ARScene.

Оверлеи

TypeScript
scene.createOverlay(options?: SceneOptions): Scene

Вторая сцена, рисуемая поверх этой и разделяющая её камеру — 3D-слой HUD, всегда рендерящийся поверх контента родителя. Принимает те же опции, что конструктор; добавляй в неё узлы как в любую сцену. Она рендерится вместе с родителем — не вызывай open() на ней отдельно.

warmRender

TypeScript
scene.warmRender(): Promise<void>

Рендерит сцену один раз, чтобы шейдеры скомпилировались и ресурсы загрузились до показа. Если первый видимый кадр дёргается, сделай await scene.warmRender() на экране загрузки, затем open(). (ARScene.open() делает это автоматически.)

Ручки рендера

TypeScript
scene.skybox = '#87ceeb'                                  // цвет фона (только запись)
scene.setAntialias(enabled: boolean, scale = 4): void     // MSAA вкл/выкл + число сэмплов
scene.occlusionMaterial: Material                         // окклюзионный материал сцены (только чтение)
scene.setMaterialGlobalParameter(i, x, y, z, w): void     // общий для сцены vec4-слот i, читается кастомными шейдерами

occlusionMaterial — экземпляр Material; задавай его юниформы как у любого другого.

Note

occlusionMaterial гейтится хостом: веб-вьювер его не реализует (обращение бросает). Используй только на AR-способных нативных хостах.

События указателя на уровне сцены

TypeScript
scene.addEventListener('click', (ev: ClickEvent<Node | null>) => void): void
scene.addEventListener('touchstart', (ev: TouchStartEvent<Node | null>) => void): void
scene.removeEventListener(channel, callback): void

Слушатели сцены срабатывают на каждый тап по активной сцене; ev.target — задетый Node (с телом-пикером Shape) или null при промахе. Отдельные узлы тоже могут слушать — см. события Node и События указателя и жесты.

Смотрите также

  • ARScene — AR-сессия: async-открытие, якоря, управление размещением.
  • Camerascene.camera: fov, экранные лучи.
  • LightLight.sun() для прямого света + теней поверх окружающего IBL.
  • Node — трансформ, иерархия, события.
  • Material — что предоставляют occlusionMaterial и материалы мешей.