🚀 Auto-deploy: melhoria no snap e medição AR em 30/05/2026 14:03:35
This commit is contained in:
+29
-30
@@ -606,43 +606,42 @@ 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)
|
}
|
||||||
];
|
});
|
||||||
|
}
|
||||||
const finalPlanes = [...tableLimitPlanes];
|
});
|
||||||
|
return;
|
||||||
if (sectionEnabled) {
|
|
||||||
const normal = new THREE.Vector3();
|
|
||||||
if (sectionAxis === 'x') normal.set(sectionInvert ? -1 : 1, 0, 0);
|
|
||||||
else if (sectionAxis === 'y') normal.set(0, sectionInvert ? -1 : 1, 0);
|
|
||||||
else if (sectionAxis === 'z') normal.set(0, 0, sectionInvert ? -1 : 1);
|
|
||||||
|
|
||||||
// Ajusta a distância baseado no bounding box original e no nível do corte
|
|
||||||
const box = new THREE.Box3().setFromObject(clone);
|
|
||||||
const size = new THREE.Vector3();
|
|
||||||
box.getSize(size);
|
|
||||||
const minVal = sectionAxis === 'x' ? box.min.x : sectionAxis === 'y' ? box.min.y : box.min.z;
|
|
||||||
const maxVal = sectionAxis === 'x' ? box.max.x : sectionAxis === 'y' ? box.max.y : box.max.z;
|
|
||||||
const distance = minVal + (maxVal - minVal) * sectionLevel;
|
|
||||||
|
|
||||||
const plane = new THREE.Plane(normal, -distance);
|
|
||||||
finalPlanes.push(plane);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const normal = new THREE.Vector3();
|
||||||
|
if (sectionAxis === 'x') normal.set(sectionInvert ? -1 : 1, 0, 0);
|
||||||
|
else if (sectionAxis === 'y') normal.set(0, sectionInvert ? -1 : 1, 0);
|
||||||
|
else if (sectionAxis === 'z') normal.set(0, 0, sectionInvert ? -1 : 1);
|
||||||
|
|
||||||
|
// Ajusta a distância baseado no bounding box original e no nível do corte
|
||||||
|
const box = new THREE.Box3().setFromObject(clone);
|
||||||
|
const size = new THREE.Vector3();
|
||||||
|
box.getSize(size);
|
||||||
|
const minVal = sectionAxis === 'x' ? box.min.x : sectionAxis === 'y' ? box.min.y : box.min.z;
|
||||||
|
const maxVal = sectionAxis === 'x' ? box.max.x : sectionAxis === 'y' ? box.max.y : box.max.z;
|
||||||
|
const distance = minVal + (maxVal - minVal) * sectionLevel;
|
||||||
|
|
||||||
|
const plane = new THREE.Plane(normal, -distance);
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user