Changes
Co-authored-by: Reifonas <211114984+Reifonas@users.noreply.github.com>
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
import * as THREE from 'three';
|
||||
|
||||
/**
|
||||
* Shared bus between the main 3D viewer and the floating ViewCube widget.
|
||||
* - mainCameraRef / mainControlsRef: written by ModelViewer each frame
|
||||
* - requestView(dir): asks the main camera to animate to a canonical view
|
||||
* along the given world-space direction (unit vector pointing FROM target
|
||||
* TO camera). e.g. (0,1,0) = top view, (0,0,1) = front.
|
||||
*/
|
||||
export const mainCameraRef: { current: THREE.Camera | null } = { current: null };
|
||||
// OrbitControls instance — typed loosely to avoid drei type churn
|
||||
export const mainControlsRef: { current: any | null } = { current: null };
|
||||
|
||||
export interface ViewAnim {
|
||||
active: boolean;
|
||||
startPos: THREE.Vector3;
|
||||
endPos: THREE.Vector3;
|
||||
startUp: THREE.Vector3;
|
||||
endUp: THREE.Vector3;
|
||||
t: number;
|
||||
duration: number;
|
||||
}
|
||||
|
||||
export const viewAnim: ViewAnim = {
|
||||
active: false,
|
||||
startPos: new THREE.Vector3(),
|
||||
endPos: new THREE.Vector3(),
|
||||
startUp: new THREE.Vector3(0, 1, 0),
|
||||
endUp: new THREE.Vector3(0, 1, 0),
|
||||
t: 0,
|
||||
duration: 0.5,
|
||||
};
|
||||
|
||||
export function requestView(dir: THREE.Vector3) {
|
||||
const cam = mainCameraRef.current;
|
||||
const controls = mainControlsRef.current;
|
||||
if (!cam || !controls) return;
|
||||
const target: THREE.Vector3 = controls.target ?? new THREE.Vector3();
|
||||
const distance = cam.position.distanceTo(target);
|
||||
const d = dir.clone().normalize();
|
||||
const endPos = target.clone().add(d.multiplyScalar(distance));
|
||||
// Up vector: keep Y up unless we're looking straight up/down
|
||||
const up = new THREE.Vector3(0, 1, 0);
|
||||
if (Math.abs(dir.y) > 0.99) {
|
||||
up.set(0, 0, dir.y > 0 ? -1 : 1);
|
||||
}
|
||||
viewAnim.startPos.copy(cam.position);
|
||||
viewAnim.endPos.copy(endPos);
|
||||
viewAnim.startUp.copy(cam.up);
|
||||
viewAnim.endUp.copy(up);
|
||||
viewAnim.t = 0;
|
||||
viewAnim.active = true;
|
||||
}
|
||||
Reference in New Issue
Block a user