LeCodesdocs

Camera

Камера сцены, доступная как scene.camera. Это Node, поэтому вся поверхность трансформа работает — position, eulerAngles, lookAt, forward. Сверх этого она предоставляет чтение проекции и помощники для лучей экран→мир для пикинга.

Ты её не конструируешь: каждая Scene создаёт свою камеру (оверлеи разделяют камеру родителя). В ARScene камерой управляет трекинг устройства — читай её, не размещай.

Обзор

TypeScript
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)
})

Проекция

TypeScript
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 — это дальность видимости сцены; поднимай её для открытых миров. У теней своя (более короткая) дальность, поэтому большая дистанция видимости ничего не стоит в резкости теней.

В файле сцены те же три живут в блоке камеры:

TypeScript
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).

Лучи экран → мир

TypeScript
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.

Note

помощника worldToScreen нет — обратная проекция доступна только сыро, через projectionMatrix + worldMatrix камеры.

Подводные камни

TypeScript
// ✗ двигать камеру в ARScene — трекинг перезаписывает её каждый кадр
arScene.camera.position = [0, 2, 4]
// ✓ двигай вместо этого МИР: подвесь контент под scene.root и размести его

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

  • Scene — откуда берётся камера; оверлеи её разделяют.
  • Node — унаследованная поверхность трансформа (position, lookAt, forward).
  • 3D-физика и формы — рейкаст лучей, которые ты строишь здесь.
  • Ray, Plane и NoiseRay, возвращаемый getRay.