Scene
3D-мир: набор для отрисовки, Camera, источники света и окружение. Открытие
сцены поднимает 3D-движок хоста — рендерит и получает события указателя только активная сцена.
Для AR-сессии с камерой используй ARScene (подкласс).
Обзор
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')
})Создание
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() для прямого света и теней.
опции доступны только в конструкторе, кроме фона (сеттер scene.skybox = …) и сглаживания
(setAntialias). Рантайм-переключателя для ibl или bloom нет.
Добавление и удаление узлов
scene.add(...nodes: Node[]): this
scene.remove(...nodes: Node[]): thisРегистрирует узлы в наборе отрисовки этой сцены. Это отличается от родительства — node.add(child)
строит иерархию (см. Node); scene.add(node) помещает его в мир.
Открытие и закрытие
scene.open(): void // стать активной сценой (закрывает любую другую)
scene.close(): void // разобрать 3D-вид
Scene.active // статик: активная сейчас Scene или nullАктивна одновременно только одна сцена; open() на второй сцене заменяет первую. После close()
Scene.active — null (если это была активная). ARScene.open() — async — см.
ARScene.
Оверлеи
scene.createOverlay(options?: SceneOptions): SceneВторая сцена, рисуемая поверх этой и разделяющая её камеру — 3D-слой HUD, всегда рендерящийся
поверх контента родителя. Принимает те же опции, что конструктор; добавляй в неё узлы как в любую
сцену. Она рендерится вместе с родителем — не вызывай open() на ней отдельно.
warmRender
scene.warmRender(): Promise<void>Рендерит сцену один раз, чтобы шейдеры скомпилировались и ресурсы загрузились до показа. Если первый
видимый кадр дёргается, сделай await scene.warmRender() на экране загрузки, затем open().
(ARScene.open() делает это автоматически.)
Ручки рендера
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; задавай его юниформы как у
любого другого.
occlusionMaterial гейтится хостом: веб-вьювер его не реализует (обращение бросает). Используй
только на AR-способных нативных хостах.
События указателя на уровне сцены
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 и
События указателя и жесты.