regioes anatomicas2
Signed-off-by: Rodrigo Bertoldo de Sousa Martins <rodrigo@martinsevieira.adv.br>
This commit is contained in:
1 parent
998b7d8ac3
commit
1d875ace2c
2 files changed
+36
-7
No files matched your search
@@ -29,14 +29,36 @@ export function Mannequin() {
|
|||||||
|
|
||||||
const normalized = useMemo(() => {
|
const normalized = useMemo(() => {
|
||||||
const clone = scene.clone(true);
|
const clone = scene.clone(true);
|
||||||
// O arquivo real vem com um material por região (a cor "arco-íris" que
|
// O FBX original do Z-Anatomy tem "espinhos" de anotação (linhas
|
||||||
// demos pro sistema de Regiões Anatômicas no Atlas) — aqui queremos só
|
// apontando pra um rótulo, usadas no app de origem) misturados na
|
||||||
// uma silhueta neutra, então trocamos TUDO por um material de pele
|
// malha — o pipeline já marca isso como excluído (`userData.excluded`)
|
||||||
// único, compartilhado (a mesma instância em todo mesh, sem custo
|
// e o visualizador principal do Atlas (SystemModel.tsx) já esconde
|
||||||
// extra de draw call por isso).
|
// 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) => {
|
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 box = new THREE.Box3().setFromObject(clone);
|
||||||
const size = new THREE.Vector3();
|
const size = new THREE.Vector3();
|
||||||
|
|||||||
@@ -224,8 +224,15 @@ export default function PlanesPage() {
|
|||||||
</button>
|
</button>
|
||||||
<Canvas dpr={[1, 1.5]} camera={{ position: [1.8, 1.3, 2.2], fov: 45 }}>
|
<Canvas dpr={[1, 1.5]} camera={{ position: [1.8, 1.3, 2.2], fov: 45 }}>
|
||||||
<color attach="background" args={["#0b1220"]} />
|
<color attach="background" args={["#0b1220"]} />
|
||||||
<ambientLight intensity={0.6} />
|
<ambientLight intensity={0.5} />
|
||||||
<directionalLight position={[2, 3, 2]} intensity={1} />
|
<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 />
|
<Mannequin />
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user