🚀 Auto-deploy: melhoria no snap e medição AR em 30/05/2026 14:03:35

This commit is contained in:
2026-05-30 14:03:35 +00:00
parent 6954b9e30f
commit 7f2edbbb3c
+15 -16
View File
@@ -606,20 +606,21 @@ function HologramModel({ model, presentationState, isPresenter, onPresentationCh
if (!clone || !presentationState) return; if (!clone || !presentationState) return;
const { sectionEnabled, sectionAxis, sectionLevel, sectionInvert } = presentationState; const { sectionEnabled, sectionAxis, sectionLevel, sectionInvert } = presentationState;
// Limites rígidos (Bounding Box invisível sobre a mesa) em coordenadas mundiais (World Space). if (!sectionEnabled) {
// Impede que a peça, mesmo com zoom máximo, invada o espaço da sala ou atravesse a mesa. clone.traverse((obj) => {
const tableLimitPlanes = [ if (obj instanceof THREE.Mesh) {
new THREE.Plane(new THREE.Vector3(-1, 0, 0), 1.0), // Limite Direita (x < 1.0) const mats = Array.isArray(obj.material) ? obj.material : [obj.material];
new THREE.Plane(new THREE.Vector3(1, 0, 0), 1.0), // Limite Esquerda (x > -1.0) mats.forEach((mat) => {
new THREE.Plane(new THREE.Vector3(0, -1, 0), 2.5), // Limite Teto (y < 2.5) if (mat) {
new THREE.Plane(new THREE.Vector3(0, 1, 0), -0.801), // Limite Chão da Mesa (y > 0.801) mat.clippingPlanes = [];
new THREE.Plane(new THREE.Vector3(0, 0, -1), 0.6), // Limite Frente (z < 0.6) mat.needsUpdate = true;
new THREE.Plane(new THREE.Vector3(0, 0, 1), 0.6), // Limite Trás (z > -0.6) }
]; });
}
});
return;
}
const finalPlanes = [...tableLimitPlanes];
if (sectionEnabled) {
const normal = new THREE.Vector3(); const normal = new THREE.Vector3();
if (sectionAxis === 'x') normal.set(sectionInvert ? -1 : 1, 0, 0); if (sectionAxis === 'x') normal.set(sectionInvert ? -1 : 1, 0, 0);
else if (sectionAxis === 'y') normal.set(0, sectionInvert ? -1 : 1, 0); else if (sectionAxis === 'y') normal.set(0, sectionInvert ? -1 : 1, 0);
@@ -634,15 +635,13 @@ function HologramModel({ model, presentationState, isPresenter, onPresentationCh
const distance = minVal + (maxVal - minVal) * sectionLevel; const distance = minVal + (maxVal - minVal) * sectionLevel;
const plane = new THREE.Plane(normal, -distance); const plane = new THREE.Plane(normal, -distance);
finalPlanes.push(plane);
}
clone.traverse((obj) => { clone.traverse((obj) => {
if (obj instanceof THREE.Mesh) { if (obj instanceof THREE.Mesh) {
const mats = Array.isArray(obj.material) ? obj.material : [obj.material]; const mats = Array.isArray(obj.material) ? obj.material : [obj.material];
mats.forEach((mat) => { mats.forEach((mat) => {
if (mat) { if (mat) {
mat.clippingPlanes = finalPlanes; mat.clippingPlanes = [plane];
mat.clipShadows = true; mat.clipShadows = true;
mat.needsUpdate = true; mat.needsUpdate = true;
} }