🚀 Auto-deploy: melhoria no snap e medição AR em 02/06/2026 21:35:17

This commit is contained in:
2026-06-02 21:35:17 +00:00
parent 230e373f8a
commit 002682e6f3
+19 -14
View File
@@ -30,9 +30,19 @@ export function ControllerLocomotion({ rigRef }: Props) {
const fwdPushed = useRef(false); const fwdPushed = useRef(false);
const raycaster = useRef(new THREE.Raycaster()); const raycaster = useRef(new THREE.Raycaster());
const [arcLine] = useState(() => {
const geom = new THREE.BufferGeometry();
const mat = new THREE.LineBasicMaterial({
color: '#06b6d4',
transparent: true,
opacity: 0.8,
});
const line = new THREE.Line(geom, mat);
line.visible = false;
return line;
});
// Refs visuais // Refs visuais
const arcLineRef = useRef<THREE.Line>(null);
const lineGeomRef = useRef<THREE.BufferGeometry>(null);
const reticleRef = useRef<THREE.Mesh>(null); const reticleRef = useRef<THREE.Mesh>(null);
// Estados temporários do teletransporte // Estados temporários do teletransporte
@@ -42,7 +52,7 @@ export function ControllerLocomotion({ rigRef }: Props) {
useFrame((_state, _dt, frame: XRFrame | undefined) => { useFrame((_state, _dt, frame: XRFrame | undefined) => {
const rig = rigRef.current; const rig = rigRef.current;
if (!rig || !session || !frame) { if (!rig || !session || !frame) {
if (arcLineRef.current) arcLineRef.current.visible = false; arcLine.visible = false;
if (reticleRef.current) reticleRef.current.visible = false; if (reticleRef.current) reticleRef.current.visible = false;
return; return;
} }
@@ -146,12 +156,10 @@ export function ControllerLocomotion({ rigRef }: Props) {
lastTeleportHitModel.current = hitModel; lastTeleportHitModel.current = hitModel;
// Atualiza a geometria do arco // Atualiza a geometria do arco
if (lineGeomRef.current && arcLineRef.current) { arcLine.geometry.setFromPoints(points);
lineGeomRef.current.setFromPoints(points); arcLine.geometry.attributes.position.needsUpdate = true;
lineGeomRef.current.attributes.position.needsUpdate = true; arcLine.geometry.computeBoundingSphere();
lineGeomRef.current.computeBoundingSphere(); arcLine.visible = true;
arcLineRef.current.visible = true;
}
// Atualiza o retículo // Atualiza o retículo
if (reticleRef.current) { if (reticleRef.current) {
@@ -200,7 +208,7 @@ export function ControllerLocomotion({ rigRef }: Props) {
} }
// Oculta feixe e retículo // Oculta feixe e retículo
if (arcLineRef.current) arcLineRef.current.visible = false; arcLine.visible = false;
if (reticleRef.current) reticleRef.current.visible = false; if (reticleRef.current) reticleRef.current.visible = false;
} }
}); });
@@ -208,10 +216,7 @@ export function ControllerLocomotion({ rigRef }: Props) {
return ( return (
<> <>
{/* Arco parabólico premium */} {/* Arco parabólico premium */}
<line ref={arcLineRef as any} visible={false}> <primitive object={arcLine} />
<bufferGeometry ref={lineGeomRef} />
<lineBasicMaterial color="#06b6d4" linewidth={3.5} transparent opacity={0.8} />
</line>
{/* Retículo de pouso */} {/* Retículo de pouso */}
<mesh ref={reticleRef} visible={false} rotation={[-Math.PI / 2, 0, 0]}> <mesh ref={reticleRef} visible={false} rotation={[-Math.PI / 2, 0, 0]}>