🚀 Auto-deploy: melhoria no snap e medição AR em 04/08/2026 21:26:18
This commit is contained in:
@@ -6,6 +6,7 @@ import {
|
||||
Grid,
|
||||
Environment,
|
||||
PerspectiveCamera,
|
||||
Text
|
||||
} from "@react-three/drei";
|
||||
import { XR, useXR } from "@react-three/xr";
|
||||
import { xrStore as store } from "@/stores/useXRStore";
|
||||
@@ -42,6 +43,35 @@ const CUBE_SIZE = 0.3;
|
||||
|
||||
type AlignPhase = 'IDLE' | 'WAIT_SURFACE' | 'WAIT_FACE2' | 'WAIT_EDGE';
|
||||
|
||||
// ===================================================================
|
||||
// COMPONENTE: AR HUD Messages (Mostra avisos flutuantes apenas no óculos)
|
||||
// ===================================================================
|
||||
const ARHudMessages = ({ alignPhase }: { alignPhase: AlignPhase }) => {
|
||||
const session = useXR((s) => s.session);
|
||||
if (!session) return null;
|
||||
|
||||
let msg = '';
|
||||
if (alignPhase === 'IDLE') msg = 'Livre! Clique na face do cubo para iniciar.';
|
||||
else if (alignPhase === 'WAIT_SURFACE') msg = 'Face gravada! Clique na mesa para apoiar.';
|
||||
else if (alignPhase === 'WAIT_FACE2') msg = 'Apoiado! Clique noutra face do cubo.';
|
||||
else if (alignPhase === 'WAIT_EDGE') msg = 'Ultimo passo! Clique na borda da mesa.';
|
||||
|
||||
return (
|
||||
<group position={[0, 1.3, -0.5]}>
|
||||
<Text
|
||||
fontSize={0.06}
|
||||
color="#fde047"
|
||||
anchorX="center"
|
||||
anchorY="middle"
|
||||
outlineWidth={0.005}
|
||||
outlineColor="#000000"
|
||||
>
|
||||
{msg}
|
||||
</Text>
|
||||
</group>
|
||||
);
|
||||
};
|
||||
|
||||
// ===================================================================
|
||||
// COMPONENTE: CuboControlado
|
||||
// ===================================================================
|
||||
@@ -174,10 +204,10 @@ const CubeControlado = ({
|
||||
allowScale={false}
|
||||
lockedActive={lockedRef.current}
|
||||
onSync={(deltaPos, deltaQuat, deltaScale) => {
|
||||
// Matriz atual do cubo
|
||||
// Matriz atual do cubo (IMPORTANTE: mesh default usa ordem XYZ)
|
||||
const mMesh = new THREE.Matrix4().compose(
|
||||
new THREE.Vector3(posRef.current.x, posRef.current.y, posRef.current.z),
|
||||
new THREE.Quaternion().setFromEuler(new THREE.Euler(rotRef.current.x, rotRef.current.y, rotRef.current.z, 'YXZ')),
|
||||
new THREE.Quaternion().setFromEuler(new THREE.Euler(rotRef.current.x, rotRef.current.y, rotRef.current.z, 'XYZ')),
|
||||
new THREE.Vector3(scaleRef.current, scaleRef.current, scaleRef.current)
|
||||
);
|
||||
|
||||
@@ -193,10 +223,10 @@ const CubeControlado = ({
|
||||
mCombined.decompose(finalPos, finalQuat, finalScale);
|
||||
|
||||
posRef.current.x = finalPos.x;
|
||||
posRef.current.y = Math.max(0.5, finalPos.y);
|
||||
posRef.current.y = Math.max(0.15, finalPos.y);
|
||||
posRef.current.z = finalPos.z;
|
||||
|
||||
const euler = new THREE.Euler().setFromQuaternion(finalQuat, 'YXZ');
|
||||
const euler = new THREE.Euler().setFromQuaternion(finalQuat, 'XYZ');
|
||||
rotRef.current.x = euler.x;
|
||||
rotRef.current.y = euler.y;
|
||||
rotRef.current.z = euler.z;
|
||||
@@ -509,6 +539,8 @@ const QuestCubeLab = () => {
|
||||
onEdgeClick={handleEdgeClick}
|
||||
/>
|
||||
|
||||
<ARHudMessages alignPhase={alignPhase} />
|
||||
|
||||
<Grid args={[20, 20]} cellSize={0.25} cellThickness={0.5} cellColor="#475569" sectionSize={1} sectionThickness={1} sectionColor="#94a3b8" fadeDistance={18} fadeStrength={1} infiniteGrid={false} position={[0, 0, 0]} />
|
||||
<mesh receiveShadow rotation={[-Math.PI / 2, 0, 0]} position={[0, -0.001, 0]}>
|
||||
<planeGeometry args={[20, 20]} />
|
||||
|
||||
Reference in New Issue
Block a user