threepipe
Version:
A modern 3D viewer framework built on top of three.js, written in TypeScript, designed to make creating high-quality, modular, and extensible 3D experiences on the web simple and enjoyable.
64 lines • 2.8 kB
JavaScript
import { Vector3 } from 'three';
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
const offset2 = new Vector3();
const targetDeltaX = new Vector3();
const targetDeltaY = new Vector3();
const targetDeltaZ = new Vector3();
const targetDelta = new Vector3();
const panOffset2 = new Vector3();
let scaleOffset = 1;
const upVec = new Vector3(0, 1, 0);
export class OrbitControls2 extends OrbitControls {
constructor(object, domElement) {
super(object, domElement);
this.throttleUpdate = 60;
this.targetOffset = new Vector3(0, 0, 0);
const sup = this.update;
this.update = () => this._update(sup);
}
_update(sup) {
this.target.add(this.targetOffset);
offset2.copy(this.object.position).sub(this.target);
scaleOffset = offset2.length();
panOffset2.copy(this.target);
const ret = sup();
panOffset2.sub(this.target); // get the panOffset of this frame from OrbitControls
// if (panOffset2.length() > 0.0001)
// console.log(panOffset2.toArray())
// console.log(offset2.clone().normalize().cross(upVec))
offset2.copy(this.object.position).sub(this.target);
// panOffset2.multiplyScalar(-1)
// panOffset3.x = panOffset3.z
// console.log(panOffset3.z)
scaleOffset /= offset2.length();
this.target.add(panOffset2);
this.object.position.copy(this.target).add(offset2);
offset2.normalize();
targetDeltaX.crossVectors(upVec, offset2).normalize();
targetDeltaY.crossVectors(offset2, targetDeltaX).normalize();
targetDeltaZ.crossVectors(targetDeltaX, targetDeltaY).normalize().negate();
if (targetDeltaX.length() > 0.1) // check if not 0
this.object.up.crossVectors(offset2.clone().normalize(), targetDeltaX);
if (this.enablePan) {
targetDelta.set(0, 0, 0)
.addScaledVector(targetDeltaX, panOffset2.x)
.addScaledVector(targetDeltaY, panOffset2.y)
.addScaledVector(targetDeltaZ, panOffset2.z);
this.targetOffset.add(targetDelta);
this.targetOffset.multiplyScalar(1. / scaleOffset);
}
targetDelta.set(0, 0, 0)
.addScaledVector(targetDeltaX, -this.targetOffset.x)
.addScaledVector(targetDeltaY, -this.targetOffset.y)
.addScaledVector(targetDeltaZ, -this.targetOffset.z);
// console.log(targetDelta)
this.object.lookAt(targetDelta.add(this.target));
this.object.updateMatrixWorld();
if (this.object.isCamera) {
this.object.updateProjectionMatrix();
}
this.target.sub(this.targetOffset);
return ret;
}
}
//# sourceMappingURL=OrbitControls2.js.map