Spaces:
Running
Running
| import { CameraData } from "./CameraData"; | |
| import { Object3D } from "../core/Object3D"; | |
| import { Vector3 } from "../math/Vector3"; | |
| import { Vector4 } from "../math/Vector4"; | |
| class Camera extends Object3D { | |
| private _data: CameraData; | |
| screenPointToRay: (x: number, y: number) => Vector3; | |
| // The constructor now accepts an optional initialPosition. | |
| constructor(cameraData?: CameraData, initialPosition?: Vector3) { | |
| super(); | |
| this._data = cameraData ? cameraData : new CameraData(); | |
| this._position = initialPosition ? initialPosition : new Vector3(1, 1, 5); | |
| this.update = () => { | |
| this.data.update(this.position, this.rotation); | |
| }; | |
| this.screenPointToRay = (x: number, y: number) => { | |
| const clipSpaceCoords = new Vector4(x, y, -1, 1); | |
| const inverseProjectionMatrix = this._data.projectionMatrix.invert(); | |
| const cameraSpaceCoords = clipSpaceCoords.multiply(inverseProjectionMatrix); | |
| const inverseViewMatrix = this._data.viewMatrix.invert(); | |
| const worldSpaceCoords = cameraSpaceCoords.multiply(inverseViewMatrix); | |
| const worldSpacePosition = new Vector3( | |
| worldSpaceCoords.x / worldSpaceCoords.w, | |
| worldSpaceCoords.y / worldSpaceCoords.w, | |
| worldSpaceCoords.z / worldSpaceCoords.w, | |
| ); | |
| const direction = worldSpacePosition.subtract(this.position).normalize(); | |
| return direction; | |
| }; | |
| } | |
| get data() { | |
| return this._data; | |
| } | |
| } | |
| export { Camera }; | |