cione-comp-lib
Version:
`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`
66 lines (65 loc) • 2.24 kB
JavaScript
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 };