regioes anatomicas2

Signed-off-by: Rodrigo Bertoldo de Sousa Martins <rodrigo@martinsevieira.adv.br>
This commit is contained in:
Rodrigo Bertoldo de Sousa Martins committed 2026-09-18 11:35:45 -03:00
1 parent 998b7d8ac3
commit 1d875ace2c
2 files changed
+36 -7

No files matched your search

+28 -6
View File
@@ -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();
+8 -1
View File
@@ -224,8 +224,15 @@ export default function PlanesPage() {
</button>
<Canvas dpr={[1, 1.5]} camera={{ position: [1.8, 1.3, 2.2], fov: 45 }}>
<color attach="background" args={["#0b1220"]} />
<ambientLight intensity={0.6} />
<ambientLight intensity={0.5} />
<directionalLight position={[2, 3, 2]} intensity={1} />
{/* 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) */}
<directionalLight position={[-2.5, 1, -1.5]} intensity={0.35} color="#a8c4ff" />
{/* luz suave por baixo, só pra clarear a sombra do queixo/pescoço
sem competir com a luz principal de cima */}
<directionalLight position={[0, -1.5, 2.5]} intensity={0.15} />
<Mannequin />