@playcanvas/blocks
Version:
High level abstract 3D primitives for React
49 lines • 1.58 kB
JavaScript
import { BoundingBox, Vec3 } from 'playcanvas';
import { lerp, MyQuat } from './math';
const v = new Vec3();
// stores a camera pose
class Pose {
position = new Vec3();
rotation = new MyQuat();
distance = 1;
constructor(other = null) {
if (other) {
this.copy(other);
}
}
copy(pose) {
this.position.copy(pose.position);
this.rotation.copy(pose.rotation);
this.distance = pose.distance;
return this;
}
lerp(a, b, t) {
this.position.lerp(a.position, b.position, t);
this.rotation.lerp(a.rotation, b.rotation, t);
this.distance = lerp(a.distance, b.distance, t);
return this;
}
fromLookAt(position, target) {
this.position.copy(position);
this.rotation.fromLookAt(position, target);
this.distance = position.distance(target);
return this;
}
calcTarget(target) {
this.rotation.transformVector(Vec3.FORWARD, v);
target.copy(v).mulScalar(this.distance).add(this.position);
}
}
const computeStartingPose = (gsplat, fov) => {
const bbox = gsplat?.instance?.meshInstance?.aabb ?? new BoundingBox();
const sceneSize = bbox.halfExtents.length() * 1.5;
const distance = sceneSize / Math.sin(fov / 180 * Math.PI * 0.5);
const position = new Vec3(2, 1, 2).normalize().mulScalar(distance).add(bbox.center).toArray();
const target = bbox.center.toArray();
return {
position,
target
};
};
export { Pose, computeStartingPose };
//# sourceMappingURL=pose.js.map