* solve a couple of scene scale bugs * Some cam fixes (#1520) * rotate and zoom basics working * intergrate mouse guards, and add pan * implement orthographic camera again * implement switch to perspective camera again * migrate dollyzoom * make pan robust for differnt FOV and orthographic cam * tween to quaternion and default plane selection working with quirks * fix pan It the up and right was derived from the camera's up, which is a static [0,0,1] not the camera's current cameras real up, which aligns itself as best to [0,0,1] but is not that especially when looking straight up or down, and the pan felt very awkward in these vertical look sintuations * fix raycastRing to use new camera * fix tween to quaternion for camera lock situations And get all playwright tests passing * fix up CamToggle, even thought this component is not setup properly to use react properties from our scene class * add animation to cameras back in * first big clean up of sceneInfra * move more cam stuff out of sceneInfra * clean up mouse guard logic * clean up camera change callbacks * fix some sitations where animation to xy doesn't work great * needs to take the target into consideration * last bits of clean up * more clean up * make vitest happ * fix up remaining interaction guards * make scrolling less sensative for trackpads * remove debug cube * fix snapshot tests
43 lines
1.0 KiB
TypeScript
43 lines
1.0 KiB
TypeScript
import { compareVec2Epsilon2 } from 'lang/std/sketch'
|
|
import {
|
|
GridHelper,
|
|
LineBasicMaterial,
|
|
OrthographicCamera,
|
|
PerspectiveCamera,
|
|
Group,
|
|
Mesh,
|
|
Quaternion,
|
|
Vector3,
|
|
} from 'three'
|
|
|
|
export function createGridHelper({
|
|
size,
|
|
divisions,
|
|
}: {
|
|
size: number
|
|
divisions: number
|
|
}) {
|
|
const gridHelperMaterial = new LineBasicMaterial({
|
|
color: 0xaaaaaa,
|
|
transparent: true,
|
|
opacity: 0.5,
|
|
depthTest: false,
|
|
})
|
|
const gridHelper = new GridHelper(size, divisions, 0x0000ff, 0xffffff)
|
|
gridHelper.material = gridHelperMaterial
|
|
gridHelper.rotation.x = Math.PI / 2
|
|
return gridHelper
|
|
}
|
|
|
|
export const orthoScale = (cam: OrthographicCamera | PerspectiveCamera) =>
|
|
0.55 / cam.zoom
|
|
|
|
export const perspScale = (cam: PerspectiveCamera, group: Group | Mesh) =>
|
|
(group.position.distanceTo(cam.position) * cam.fov) / 4000
|
|
|
|
export function isQuaternionVertical(q: Quaternion) {
|
|
const v = new Vector3(0, 0, 1).applyQuaternion(q)
|
|
// no x or y components means it's vertical
|
|
return compareVec2Epsilon2([v.x, v.y], [0, 0])
|
|
}
|