jsketcher/modules/scene/scaleHelper.js
2022-08-15 23:47:20 -07:00

47 lines
No EOL
1.3 KiB
JavaScript

import {Object3D, Vector3} from 'three';
import DPR from '../dpr';
export function viewScaleFactor(sceneSetup, origin, SIZE_PX, SIZE_MODEL) {
const container = sceneSetup.container;
const viewHeight = container.clientHeight;
const camera = sceneSetup.camera;
if (camera.isOrthographicCamera) {
return viewHeight / (camera.top - camera.bottom) / camera.zoom * 2 * DPR * SIZE_PX / SIZE_MODEL;
} else {
const p = new Vector3().copy(origin);
const cp = new Vector3().copy(camera.position);
const z = p.sub(cp).length();
const tanHFov = Math.atan((camera.fov / 2) / 180 * Math.PI);
const fitUnits = tanHFov * z * 2;
const modelTakingPart = SIZE_MODEL / fitUnits;
const modelActualSizePx = viewHeight * modelTakingPart;
return SIZE_PX / modelActualSizePx;
}
}
export class ConstantScaleGroup extends Object3D {
sizePx;
sizeModel;
getOrigin;
constructor(sceneSetup, sizePx, sizeModel, getOrigin) {
super();
this.sceneSetup = sceneSetup;
this.sizePx = sizePx;
this.sizeModel = sizeModel;
this.getOrigin = getOrigin;
}
updateMatrix() {
// let {origin: o, x, y, z} = this.csys;
//
const k = viewScaleFactor(this.sceneSetup, this.getOrigin(), this.sizePx, this.sizeModel);
this.scale.set(k,k,k);
super.updateMatrix();
}
}