UNPKG

cione-comp-lib

Version:

`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`

66 lines (65 loc) 2.24 kB
import Node3D from "./Node.mjs"; import Matrix4 from "./math/Matrix4.mjs"; import Frustum from "./math/Frustum.mjs"; import Ray from "./math/Ray.mjs"; import vec4 from "./glmatrix/vec4.mjs"; import vec3 from "./glmatrix/vec3.mjs"; var Camera = Node3D.extend( function() { return { projectionMatrix: new Matrix4(), invProjectionMatrix: new Matrix4(), viewMatrix: new Matrix4(), frustum: new Frustum() }; }, function() { this.update(true); }, { update: function(force) { Node3D.prototype.update.call(this, force); Matrix4.invert(this.viewMatrix, this.worldTransform); this.updateProjectionMatrix(); Matrix4.invert(this.invProjectionMatrix, this.projectionMatrix); this.frustum.setFromProjection(this.projectionMatrix); }, setViewMatrix: function(viewMatrix) { Matrix4.copy(this.viewMatrix, viewMatrix); Matrix4.invert(this.worldTransform, viewMatrix); this.decomposeWorldTransform(); }, decomposeProjectionMatrix: function() { }, setProjectionMatrix: function(projectionMatrix) { Matrix4.copy(this.projectionMatrix, projectionMatrix); Matrix4.invert(this.invProjectionMatrix, projectionMatrix); this.decomposeProjectionMatrix(); }, updateProjectionMatrix: function() { }, castRay: function() { var v4 = vec4.create(); return function(ndc, out) { var ray = out !== void 0 ? out : new Ray(); var x = ndc.array[0]; var y = ndc.array[1]; vec4.set(v4, x, y, -1, 1); vec4.transformMat4(v4, v4, this.invProjectionMatrix.array); vec4.transformMat4(v4, v4, this.worldTransform.array); vec3.scale(ray.origin.array, v4, 1 / v4[3]); vec4.set(v4, x, y, 1, 1); vec4.transformMat4(v4, v4, this.invProjectionMatrix.array); vec4.transformMat4(v4, v4, this.worldTransform.array); vec3.scale(v4, v4, 1 / v4[3]); vec3.sub(ray.direction.array, v4, ray.origin.array); vec3.normalize(ray.direction.array, ray.direction.array); ray.direction._dirty = true; ray.origin._dirty = true; return ray; }; }() } ); var Camera$1 = Camera; export { Camera$1 as default };