sistema tegumentar
This commit is contained in:
1 parent
7bc99e8a6f
commit
c422ccb05e
2 files changed
+220
-10
No files matched your search
@@ -52,13 +52,25 @@ for (const [systemSlug, items] of bySystem) {
|
||||
const scene = doc.createScene(systemSlug);
|
||||
doc.getRoot().setDefaultScene(scene);
|
||||
|
||||
const material = doc
|
||||
.createMaterial(systemSlug)
|
||||
.setBaseColorFactor(hexToRgb(systemColors[systemSlug] ?? "#cccccc"))
|
||||
// Cada item pode pedir uma cor própria (opts.color) pra se distinguir dos
|
||||
// demais (ex: glândula amarela, vaso vermelho/azul, pelo castanho) em vez
|
||||
// de todo o sistema sair de uma cor só — cache por hex evita recriar
|
||||
// material repetido.
|
||||
const materialCache = new Map();
|
||||
function materialFor(hex) {
|
||||
if (materialCache.has(hex)) return materialCache.get(hex);
|
||||
const mat = doc
|
||||
.createMaterial(hex)
|
||||
.setBaseColorFactor(hexToRgb(hex))
|
||||
.setRoughnessFactor(0.6)
|
||||
.setMetallicFactor(0.05);
|
||||
materialCache.set(hex, mat);
|
||||
return mat;
|
||||
}
|
||||
const defaultHex = systemColors[systemSlug] ?? "#cccccc";
|
||||
|
||||
for (const item of items) {
|
||||
const material = materialFor(item.color ?? defaultHex);
|
||||
const geo = buildGeometry(item.shape);
|
||||
const posAccessor = doc
|
||||
.createAccessor()
|
||||
|
||||
@@ -1,7 +1,15 @@
|
||||
// Gera manifest-tegumentar.json: o Z-Anatomy-Sample não inclui camadas de
|
||||
// pele (epiderme/derme/hipoderme), então para o sistema tegumentar seguimos
|
||||
// usando geometria esquemática simples (ver data-pipeline/README rodapé).
|
||||
// Todos os outros sistemas vêm de malhas reais — veja scripts/extract-manifest.mjs.
|
||||
// pele (epiderme/derme/hipoderme) nem seus anexos (folículo piloso, glândulas
|
||||
// etc.) — são estruturas microscópicas, nenhum dataset de corpo inteiro as
|
||||
// modela como malha. Por isso o sistema tegumentar usa um "bloco" esquemático
|
||||
// (corte transversal de pele, como o diagrama clássico do Netter/Sobotta),
|
||||
// construído com geometria paramétrica simples (caixas/esferas/cilindros —
|
||||
// ver scripts/geometry.mjs e scripts/build-seed-models.mjs).
|
||||
//
|
||||
// Como as outras estruturas do sistema tegumentar ficam ocultas quando só
|
||||
// esse sistema está visível, ativar "Tegumentar" sozinho na barra de camadas
|
||||
// já isola e centraliza a câmera neste bloco (ver computeVisibleBoundingBox
|
||||
// em Scene.tsx) — funciona como um "zoom didático" na pele.
|
||||
import { writeFileSync } from "node:fs";
|
||||
import { fileURLToPath } from "node:url";
|
||||
import path from "node:path";
|
||||
@@ -24,13 +32,203 @@ function add(system, slug, namePt, nameEn, region, shape, position, opts = {}) {
|
||||
shape,
|
||||
position,
|
||||
rotation: opts.rotation ?? [0, 0, 0],
|
||||
color: opts.color,
|
||||
});
|
||||
}
|
||||
|
||||
const TX = ["Sistema Tegumentar"];
|
||||
add("tegumentar", "epiderme", "Epiderme", "Epidermis", [...TX, "Membro Superior", "Antebraço"], { type: "box", w: 0.09, h: 0.2, d: 0.005 }, [0.24, 0.85, 0.035], { description: "Camada mais externa da pele, avascular." });
|
||||
add("tegumentar", "derme", "Derme", "Dermis", [...TX, "Membro Superior", "Antebraço"], { type: "box", w: 0.09, h: 0.2, d: 0.01 }, [0.24, 0.85, 0.028], { description: "Camada intermediária, rica em vasos, nervos e anexos cutâneos." });
|
||||
add("tegumentar", "hipoderme", "Hipoderme (Tecido Subcutâneo)", "Hypodermis (Subcutaneous Tissue)", [...TX, "Membro Superior", "Antebraço"], { type: "box", w: 0.09, h: 0.2, d: 0.015 }, [0.24, 0.85, 0.018], { description: "Camada mais profunda, rica em tecido adiposo." });
|
||||
const TX = ["Sistema Tegumentar", "Corte Transversal da Pele"];
|
||||
|
||||
// Centro do "bloco" de pele (coordenadas do mundo, mesma escala do corpo
|
||||
// Z-Anatomy — colado na face do antebraço). x/y = plano da superfície da
|
||||
// pele; z = profundidade (z maior = mais externo/superficial).
|
||||
const CX = 0.24;
|
||||
const CY = 0.85;
|
||||
const Z_SURFACE = 0.0375; // topo da epiderme = superfície da pele
|
||||
|
||||
// Cilindros/caixas nascem com o eixo longo em Y; ROT_Z gira esse eixo para
|
||||
// Z (perpendicular à pele, "entrando" no corpo) — usado por pelo, folículo,
|
||||
// ducto sudoríparo e a alça capilar, que atravessam as camadas na vertical.
|
||||
const ROT_Z = [Math.PI / 2, 0, 0];
|
||||
|
||||
// ---- As 3 camadas da pele ----
|
||||
add(
|
||||
"tegumentar", "epiderme", "Epiderme", "Epidermis", [...TX],
|
||||
{ type: "box", w: 0.09, h: 0.2, d: 0.005 }, [CX, CY, 0.035],
|
||||
{
|
||||
color: "#e0a96d",
|
||||
description:
|
||||
"Camada mais externa e avascular da pele, formada por epitélio pavimentoso estratificado queratinizado; sua função é a principal barreira contra perda de água, atrito, micro-organismos e raios UV (com a ajuda da melanina).",
|
||||
},
|
||||
);
|
||||
add(
|
||||
"tegumentar", "derme", "Derme", "Dermis", [...TX],
|
||||
{ type: "box", w: 0.09, h: 0.2, d: 0.01 }, [CX, CY, 0.028],
|
||||
{
|
||||
color: "#c97b4a",
|
||||
description:
|
||||
"Camada de tecido conjuntivo rica em colágeno e elastina, vasos sanguíneos, terminações nervosas e os anexos cutâneos (folículos pilosos, glândulas); sustenta a epiderme e dá à pele resistência e elasticidade.",
|
||||
},
|
||||
);
|
||||
add(
|
||||
"tegumentar", "hipoderme", "Hipoderme (Tecido Subcutâneo)", "Hypodermis (Subcutaneous Tissue)", [...TX],
|
||||
{ type: "box", w: 0.09, h: 0.2, d: 0.015 }, [CX, CY, 0.018],
|
||||
{
|
||||
color: "#f2d4a3",
|
||||
description:
|
||||
"Camada mais profunda, rica em tecido adiposo; isola termicamente, absorve impactos e serve de reserva de energia — não é tecnicamente parte da pele, mas a conecta aos músculos e ossos subjacentes.",
|
||||
},
|
||||
);
|
||||
|
||||
// ---- Complexo pilossebáceo (pelo + folículo + músculo eretor + glândula sebácea) ----
|
||||
const HX = CX - 0.015, HY = CY + 0.03;
|
||||
const HAIR_TILT = [Math.PI / 2 + 0.3, 0.2, 0];
|
||||
|
||||
add(
|
||||
"tegumentar", "pelo", "Pelo (Haste Capilar)", "Hair Shaft", [...TX, "Complexo Pilossebáceo"],
|
||||
{ type: "cylinder", rt: 0.0006, rb: 0.001, h: 0.02 }, [HX, HY, Z_SURFACE + 0.01],
|
||||
{
|
||||
color: "#4a3527",
|
||||
rotation: HAIR_TILT,
|
||||
description:
|
||||
"Porção do pelo visível acima da superfície da pele, formada por células queratinizadas mortas; sua cor vem da melanina produzida no bulbo piloso.",
|
||||
},
|
||||
);
|
||||
add(
|
||||
"tegumentar", "foliculo-piloso", "Folículo Piloso", "Hair Follicle", [...TX, "Complexo Pilossebáceo"],
|
||||
{ type: "cylinder", rt: 0.0022, rb: 0.0022, h: 0.03 }, [HX, HY, 0.0225],
|
||||
{
|
||||
color: "#8a6a52",
|
||||
rotation: HAIR_TILT,
|
||||
description:
|
||||
"Invaginação da epiderme para dentro da derme/hipoderme que envolve e forma a raiz do pelo; suas células-tronco também participam da regeneração da epiderme após lesões.",
|
||||
},
|
||||
);
|
||||
add(
|
||||
"tegumentar", "bulbo-piloso", "Bulbo Piloso", "Hair Bulb", [...TX, "Complexo Pilossebáceo"],
|
||||
{ type: "sphere", r: 0.003 }, [HX - 0.006, HY + 0.012, 0.008],
|
||||
{
|
||||
color: "#6b4c38",
|
||||
description:
|
||||
"Base dilatada do folículo, na hipoderme; contém a papila dérmica (com vasos que nutrem o pelo) e a matriz germinativa, onde o pelo é produzido por divisão celular.",
|
||||
},
|
||||
);
|
||||
add(
|
||||
"tegumentar", "musculo-eretor-do-pelo", "Músculo Eretor do Pelo", "Arrector Pili Muscle", [...TX, "Complexo Pilossebáceo"],
|
||||
{ type: "box", w: 0.0012, h: 0.014, d: 0.003 }, [HX + 0.004, HY - 0.006, 0.0295],
|
||||
{
|
||||
color: "#b5433a",
|
||||
rotation: [1.05, 0, 0],
|
||||
description:
|
||||
"Pequeno músculo liso ligado obliquamente ao folículo; ao se contrair (frio, medo), eleva o pelo e comprime a glândula sebácea — é o responsável pela 'pele arrepiada' (piloereção).",
|
||||
},
|
||||
);
|
||||
add(
|
||||
"tegumentar", "glandula-sebacea", "Glândula Sebácea", "Sebaceous Gland", [...TX, "Complexo Pilossebáceo"],
|
||||
{ type: "sphere", r: 0.004 }, [HX + 0.007, HY - 0.01, 0.031],
|
||||
{
|
||||
color: "#f2c14e",
|
||||
description:
|
||||
"Glândula anexa ao folículo piloso que secreta sebo — mistura oleosa que lubrifica o pelo e a pele e ajuda a impermeabilizá-la; sua obstrução está por trás da acne.",
|
||||
},
|
||||
);
|
||||
|
||||
// ---- Glândula sudorípara (écrina) + ducto + poro ----
|
||||
const SX = CX + 0.02, SY = CY - 0.02;
|
||||
add(
|
||||
"tegumentar", "glandula-sudoripara", "Glândula Sudorípara (Écrina)", "Eccrine Sweat Gland", [...TX, "Glândula Sudorípara"],
|
||||
{ type: "sphere", r: 0.005 }, [SX, SY, 0.014],
|
||||
{
|
||||
color: "#4f7cff",
|
||||
description:
|
||||
"Porção secretora enovelada, na derme profunda/hipoderme; produz o suor (água + eletrólitos), principal mecanismo de termorregulação do corpo por evaporação.",
|
||||
},
|
||||
);
|
||||
add(
|
||||
"tegumentar", "ducto-sudoriparo", "Ducto Sudoríparo", "Sweat Duct", [...TX, "Glândula Sudorípara"],
|
||||
{ type: "cylinder", rt: 0.0012, rb: 0.0012, h: 0.0235 }, [SX, SY, 0.0258],
|
||||
{
|
||||
color: "#7ba6ff",
|
||||
rotation: ROT_Z,
|
||||
description:
|
||||
"Canal que conduz o suor da glândula, atravessando a derme e a epiderme, até a superfície da pele.",
|
||||
},
|
||||
);
|
||||
add(
|
||||
"tegumentar", "poro-sudoriparo", "Poro Sudoríparo", "Sweat Pore", [...TX, "Glândula Sudorípara"],
|
||||
{ type: "sphere", r: 0.0012 }, [SX, SY, Z_SURFACE + 0.0005],
|
||||
{
|
||||
color: "#a9c6ff",
|
||||
description: "Abertura do ducto sudoríparo na superfície da epiderme, por onde o suor é liberado.",
|
||||
},
|
||||
);
|
||||
|
||||
// ---- Plexo vascular dérmico ----
|
||||
const VX = CX - 0.03, VY = CY - 0.05;
|
||||
add(
|
||||
"tegumentar", "arteriola-dermica", "Arteríola Dérmica", "Dermal Arteriole", [...TX, "Plexo Vascular Dérmico"],
|
||||
{ type: "cylinder", rt: 0.0012, rb: 0.0012, h: 0.014 }, [VX - 0.003, VY, 0.026],
|
||||
{
|
||||
color: "#c1121f",
|
||||
rotation: ROT_Z,
|
||||
description: "Ramo arterial que leva sangue oxigenado ao plexo de capilares da derme, nutrindo a pele (a epiderme em si não tem vasos).",
|
||||
},
|
||||
);
|
||||
add(
|
||||
"tegumentar", "venula-dermica", "Vênula Dérmica", "Dermal Venule", [...TX, "Plexo Vascular Dérmico"],
|
||||
{ type: "cylinder", rt: 0.0012, rb: 0.0012, h: 0.014 }, [VX + 0.003, VY, 0.026],
|
||||
{
|
||||
color: "#3457d5",
|
||||
rotation: ROT_Z,
|
||||
description: "Ramo venoso que drena o sangue do plexo capilar dérmico de volta à circulação.",
|
||||
},
|
||||
);
|
||||
add(
|
||||
"tegumentar", "alca-capilar-dermica", "Alça Capilar Dérmica", "Dermal Capillary Loop", [...TX, "Plexo Vascular Dérmico"],
|
||||
{ type: "cylinder", rt: 0.0006, rb: 0.0006, h: 0.006 }, [VX, VY, 0.032],
|
||||
{
|
||||
color: "#e0464f",
|
||||
rotation: ROT_Z,
|
||||
description: "Alça de capilares que sobe até as papilas dérmicas, logo abaixo da epiderme, levando nutrientes e oxigênio para a base da epiderme por difusão.",
|
||||
},
|
||||
);
|
||||
|
||||
// ---- Corpúsculos sensoriais ----
|
||||
add(
|
||||
"tegumentar", "corpusculo-de-meissner", "Corpúsculo de Meissner", "Meissner's Corpuscle", [...TX, "Receptores Sensoriais"],
|
||||
{ type: "sphere", r: 0.0022 }, [CX + 0.03, CY + 0.06, 0.0335],
|
||||
{
|
||||
color: "#34d399",
|
||||
description:
|
||||
"Receptor sensorial encapsulado logo abaixo da epiderme; detecta toque leve e vibrações de baixa frequência — muito numeroso na ponta dos dedos e nos lábios.",
|
||||
},
|
||||
);
|
||||
add(
|
||||
"tegumentar", "corpusculo-de-pacini", "Corpúsculo de Pacini", "Pacinian Corpuscle", [...TX, "Receptores Sensoriais"],
|
||||
{ type: "sphere", r: 0.006 }, [CX + 0.03, CY - 0.06, 0.012],
|
||||
{
|
||||
color: "#22d3ee",
|
||||
description:
|
||||
"Grande receptor sensorial encapsulado em camadas (como uma cebola), na hipoderme; detecta pressão profunda e vibrações de alta frequência.",
|
||||
},
|
||||
);
|
||||
|
||||
// ---- Tecido adiposo da hipoderme ----
|
||||
const FX = CX - 0.02, FY = CY - 0.075;
|
||||
const FAT_OFFSETS = [
|
||||
[0, 0], [0.008, 0.004], [-0.006, 0.006], [0.003, -0.007],
|
||||
];
|
||||
FAT_OFFSETS.forEach(([dx, dy], i) => {
|
||||
add(
|
||||
"tegumentar", `adipocito-${i + 1}`, `Lóbulo de Tecido Adiposo ${i + 1}`, `Adipose Tissue Lobule ${i + 1}`,
|
||||
[...TX, "Tecido Adiposo"],
|
||||
{ type: "sphere", r: 0.006 }, [FX + dx, FY + dy, 0.015],
|
||||
{
|
||||
color: "#f7e08c",
|
||||
description:
|
||||
"Grupo de adipócitos (células de gordura) da hipoderme; armazena energia, isola termicamente e amortece impactos mecânicos.",
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
writeFileSync(
|
||||
path.resolve(__dirname, "manifest-tegumentar.json"),
|
||||
|
||||
Reference in new issue
Block a user