studiocms
Version:
Astro Native CMS for AstroDB. Built from the ground up by the Astro community.
27 lines (26 loc) • 995 B
JavaScript
import { Box3, Vector3 } from "three";
function fitModelToViewport(model, camera, threeModules) {
const ThreeBox3 = threeModules?.Box3 || Box3;
const ThreeVector3 = threeModules?.Vector3 || Vector3;
if (typeof model.updateWorldMatrix === "function") {
model.updateWorldMatrix(true, true);
} else if (typeof model.updateMatrixWorld === "function") {
model.updateMatrixWorld(true);
}
const box = new ThreeBox3().setFromObject(model);
const center = box.getCenter(new ThreeVector3());
const size = box.getSize(new ThreeVector3());
model.position.x += model.position.x - center.x;
model.position.y += model.position.y - center.y;
model.position.z += model.position.z - center.z;
const maxDim = Math.max(size.x, size.y, size.z);
const fov = camera.fov * (Math.PI / 180);
let cameraZ = Math.abs(maxDim / 2 / Math.tan(fov / 2));
cameraZ *= 2.5;
camera.position.z = cameraZ;
camera.updateProjectionMatrix();
return cameraZ;
}
export {
fitModelToViewport
};