import { LeviarObject } from '../LeviarObject.js'; import type { World } from '../World.js'; import type { LeviarObjectOptions } from '../types.js'; export interface CameraAttribute { /** * 카메라의 원근 투영 초점 거리. * 카메라와 오브젝트 사이의 transform.position.z의 차이가 focalLength일때 1:1 스케일로 렌더링됩니다. * @default 100 */ focalLength?: number; } export declare class Camera = Record> extends LeviarObject { /** @internal */ __world?: World; constructor(options?: LeviarObjectOptions); /** * 캔버스의 x, y 좌표(0 ~ width, 0 ~ height)를 카메라 기준의 월드 좌표로 변환합니다. * @param x 캔버스 좌측 상단을 0으로 하는 x 좌표 * @param y 캔버스 좌측 상단을 0으로 하는 y 좌표 * @param targetZ (선택) 투영하고자 하는 월드 공간의 Z 좌표. 지정하지 않으면 카메라의 fov가 1:1이 되는 심도(camZ + focalLength)로 계산됩니다. */ canvasToWorld(x: number, y: number, targetZ?: number): { x: number; y: number; z: number; }; /** * 캔버스의 x, y 좌표를 카메라 기준의 로컬 좌표계로 변환합니다. * 결과값은 카메라 내부의 자식(child)으로 배치할 때의 좌표입니다. * @param x 캔버스 좌측 상단을 0으로 하는 x 좌표 * @param y 캔버스 좌측 상단을 0으로 하는 y 좌표 * @param targetZ (선택) 투영하고자 하는 로컬 공간의 Z 좌표. 지정하지 않으면 카메라 초점 거리(focalLength)로 계산됩니다. */ canvasToLocal(x: number, y: number, targetZ?: number): { x: number; y: number; z: number; }; /** * targetZ 깊이에 있는 대상이 화면에서 value 크기만큼 보이려면 * 실제 크기가 얼마가 되어야 하는지 원근 비율을 수학적으로 계산해 반환합니다. * @param targetZ 목표 Z 좌표 * @param value 기준 크기 (화면에 보여질 목표 크기) */ calcDepthRatio(targetZ: number, value: number): number; }