From 1d875ace2ced5fb8e4cdd95ec9b45e4059269629 Mon Sep 17 00:00:00 2001 From: Rodrigo Bertoldo de Sousa Martins Date: Fri, 18 Sep 2026 11:35:45 -0300 Subject: [PATCH] regioes anatomicas2 Signed-off-by: Rodrigo Bertoldo de Sousa Martins --- frontend/src/components/viewer/Mannequin.tsx | 34 ++++++++++++++++---- frontend/src/routes/PlanesPage.tsx | 9 +++++- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/frontend/src/components/viewer/Mannequin.tsx b/frontend/src/components/viewer/Mannequin.tsx index 1471099..3a42fc1 100644 --- a/frontend/src/components/viewer/Mannequin.tsx +++ b/frontend/src/components/viewer/Mannequin.tsx @@ -29,14 +29,36 @@ export function Mannequin() { const normalized = useMemo(() => { const clone = scene.clone(true); - // O arquivo real vem com um material por região (a cor "arco-íris" que - // demos pro sistema de Regiões Anatômicas no Atlas) — aqui queremos só - // uma silhueta neutra, então trocamos TUDO por um material de pele - // único, compartilhado (a mesma instância em todo mesh, sem custo - // extra de draw call por isso). + // O FBX original do Z-Anatomy tem "espinhos" de anotação (linhas + // apontando pra um rótulo, usadas no app de origem) misturados na + // malha — o pipeline já marca isso como excluído (`userData.excluded`) + // e o visualizador principal do Atlas (SystemModel.tsx) já esconde + // essas linhas há tempos, mas só faz isso quando sabe resolver cada + // nó pra uma Structure catalogada. Aqui a gente não tem esse catálogo + // (é só a silhueta, sem clique por estrutura), então escondemos + // direto por dois critérios: (1) o nó foi marcado excluído, ou (2) é + // um tipo que uma silhueta de pele nunca deveria ter de verdade + // (Line/LineSegments/Points — sempre são as tais linhas de anotação). + // Removemos de verdade (não só `visible = false`) porque + // `Box3.setFromObject` inclui objetos invisíveis no cálculo — uma + // linha comprida se projetando pra fora do corpo distorceria a caixa + // delimitadora (e a escala/centralização) mesmo escondida. Como é um + // clone descartável, mutar a árvore aqui é seguro. + const toRemove: THREE.Object3D[] = []; clone.traverse((obj) => { - if (obj instanceof THREE.Mesh) obj.material = SKIN_MATERIAL; + const renderable = obj as THREE.Object3D & { + isMesh?: boolean; + isLine?: boolean; + isLineSegments?: boolean; + isPoints?: boolean; + }; + if (obj.userData?.excluded || renderable.isLine || renderable.isLineSegments || renderable.isPoints) { + toRemove.push(obj); + return; + } + if (renderable.isMesh) (obj as THREE.Mesh).material = SKIN_MATERIAL; }); + for (const obj of toRemove) obj.parent?.remove(obj); const box = new THREE.Box3().setFromObject(clone); const size = new THREE.Vector3(); diff --git a/frontend/src/routes/PlanesPage.tsx b/frontend/src/routes/PlanesPage.tsx index 76a9868..e706437 100644 --- a/frontend/src/routes/PlanesPage.tsx +++ b/frontend/src/routes/PlanesPage.tsx @@ -224,8 +224,15 @@ export default function PlanesPage() { - + + {/* luz de preenchimento do lado oposto — sem ela a metade do + corpo virada pra longe da luz principal ficava achatada + demais (só a cor lisa do material, sem volume nenhum) */} + + {/* luz suave por baixo, só pra clarear a sombra do queixo/pescoço + sem competir com a luz principal de cima */} +