Camera
Камера сцены, доступная как scene.camera. Это Node, поэтому вся поверхность
трансформа работает — position, eulerAngles, lookAt, forward. Сверх этого она предоставляет
чтение проекции и помощники для лучей экран→мир для пикинга.
Ты её не конструируешь: каждая Scene создаёт свою камеру (оверлеи разделяют
камеру родителя). В ARScene камерой управляет трекинг устройства — читай её,
не размещай.
Обзор
scene.camera.position = [0, 2, 4]
scene.camera.lookAt([0, 0.5, 0])
scene.addEventListener('touchstart', ev => {
const ray = scene.camera.getRay(ev.clientX, ev.clientY)
const hit = Physics.raycast(ray.origin, ray.dir)
if (hit) console.log('tapped', hit.node?.name)
})Проекция
camera.fov // вертикальное поле зрения, ГРАДУСЫ — задаётся (по умолчанию 60)
camera.near // ближняя плоскость отсечения, задаётся (по умолчанию 0.01)
camera.far // дальняя плоскость отсечения = дальность видимости, задаётся (по умолчанию 1000)
camera.setProjection({ fov: 45, far: 5000 }) // любое подмножество, один вызов
camera.horizontalFov // горизонтальное поле зрения, градусы (только чтение, выводится из fov + аспекта)
camera.displaySize // [ширина, высота] 3D-вьюпорта, px (только чтение)
camera.projectionMatrix // Float32Array(16), живая — хост обновляет её на месте при ресайзе/смене fovСоотношение сторон остаётся за хостом: ты задаёшь объектив, хост держит аспект при каждом ресайзе.
Ничто ближе near и дальше far не рисуется, так что far — это дальность видимости сцены;
поднимай её для открытых миров. У теней своя (более короткая) дальность, поэтому большая дистанция
видимости ничего не стоит в резкости теней.
В файле сцены те же три живут в блоке камеры:
camera: { position: [0, 6, 12], target: [0, 0, 0], fov: 45 } // блок верхнего уровня
nodes: { cam: { camera: { fov: 45, far: 5000 } } } // …или УЗЕЛ-камера (он побеждает)Хосты, вышедшие раньше вызова проекции, держат фиксированные умолчания — установка там инертна, но не ошибка. См.
docs/parity/MATRIX.md(gl-camera-projection).
Лучи экран → мир
camera.getViewDirection(screenX, screenY): Vec3 // направление луча в мире через экранную точку
camera.getRay(screenX, screenY): Ray // origin = camera.worldPosition, dir = направление взглядаЭкранные координаты — логические px — то же пространство, что ev.clientX / ev.clientY.
getRay напрямую сочетается с Physics.raycast для пикинга по тапу; Ray
описан в ray-plane-noise.
помощника worldToScreen нет — обратная проекция доступна только сыро, через projectionMatrix +
worldMatrix камеры.
Подводные камни
// ✗ двигать камеру в ARScene — трекинг перезаписывает её каждый кадр
arScene.camera.position = [0, 2, 4]
// ✓ двигай вместо этого МИР: подвесь контент под scene.root и размести егоСмотрите также
- Scene — откуда берётся камера; оверлеи её разделяют.
- Node — унаследованная поверхность трансформа (
position,lookAt,forward). - 3D-физика и формы — рейкаст лучей, которые ты строишь здесь.
- Ray, Plane и Noise —
Ray, возвращаемыйgetRay.