feat: improve focus

This commit is contained in:
2025-05-24 19:37:25 +02:00
parent 59ae76e817
commit acfe4bed97

View File

@@ -17,24 +17,27 @@ const Room = () => {
const room = useLoader(FBXLoader, "/room.fbx"); const room = useLoader(FBXLoader, "/room.fbx");
const [focus, setFocus] = useState<string | null>(null); const [focus, setFocus] = useState<string | null>(null);
const [cameraData, setCameraData] = useState<{ const cameraPosition = useRef<Vector3 | null>(null);
position: Vector3; const cameraTarget = useRef<Vector3>(new Vector3(0, 1, 0));
target: Vector3;
} | null>(null);
const { camera } = useThree(); const { camera } = useThree();
useFrame(() => { useFrame(() => {
if (!controls.current) return; if (!controls.current) return;
if (cameraData) { if (cameraPosition.current) {
camera.position.lerp(cameraData.position, 0.09); camera.position.lerp(cameraPosition.current, 0.09);
controls.current.target.lerp(cameraData.target, 0.09); if (camera.position.distanceTo(cameraPosition.current) < 0.012) {
if (!focus) {
controls.current.enableZoom = true;
controls.current.enableRotate = true;
}
if (camera.position.distanceTo(cameraData.position) < 0.01) { cameraPosition.current = null;
setCameraData(null);
} }
} }
controls.current.target.lerp(cameraTarget.current, 0.1);
}); });
const handleClick = (e: ThreeEvent<MouseEvent>) => { const handleClick = (e: ThreeEvent<MouseEvent>) => {
@@ -48,22 +51,18 @@ const Room = () => {
e.object.getWorldPosition(objectPos); e.object.getWorldPosition(objectPos);
e.object.getWorldDirection(objectDir); e.object.getWorldDirection(objectDir);
setCameraData({ cameraPosition.current = objectPos
position: objectPos.clone().add(objectDir.multiplyScalar(-0.65)), .clone()
target: objectPos, .add(objectDir.multiplyScalar(-0.65));
}); cameraTarget.current = objectPos;
controls.current.enableZoom = false; controls.current.enableZoom = false;
controls.current.enableRotate = false; controls.current.enableRotate = false;
setFocus(e.object.name); setFocus(e.object.name);
} else if (focus) { } else if (focus) {
controls.current.enableZoom = true; cameraPosition.current = new Vector3(3, 3, -3);
controls.current.enableRotate = true; cameraTarget.current = new Vector3(0, 1, 0);
setCameraData({
position: new Vector3(3, 3, -3),
target: new Vector3(0, 1, 0),
});
setFocus(null); setFocus(null);
} }
@@ -80,7 +79,6 @@ const Room = () => {
target={[0, 1, 0]} target={[0, 1, 0]}
maxPolarAngle={Math.PI / 2} maxPolarAngle={Math.PI / 2}
enablePan={false} enablePan={false}
onStart={() => setCameraData(null)}
/> />
<mesh onClick={handleClick}> <mesh onClick={handleClick}>