Funkce a vlastnosti
Aspose.3D FOSS pro TypeScript je knihovna Node.js licencovaná pod MIT, určená pro načítání, vytváření a export 3D scén. Dodává se s kompletními definicemi typů TypeScript, jednou runtime závislostí (xmldom), a podporou šesti hlavních formátů 3D souborů. Tato stránka je hlavní referencí pro všechny oblasti funkcí a obsahuje spustitelné příklady kódu TypeScript pro každou z nich.
Instalace a nastavení
Nainstalujte balíček z npm pomocí jediného příkazu:
npm install @aspose/3dBalíček cílí na CommonJS a vyžaduje Node.js 18 nebo novější. Po instalaci ověřte, že vaše tsconfig.json obsahuje následující možnosti kompilátoru pro plnou kompatibilitu:
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"moduleResolution": "node",
"esModuleInterop": true,
"strict": true
}
}Importujte hlavní Scene třídu z kořene balíčku. Třídy možností specifické pro formát jsou importovány z jejich příslušných podcest:
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';Funkce a vlastnosti
Podpora formátů
Aspose.3D FOSS for TypeScript čte a zapisuje šest hlavních formátů 3D souborů. Detekce formátu je při načítání automatická na základě binárních magických čísel, takže není nutné explicitně uvádět zdrojový formát.
| Formát | Čtení | Zápis | Poznámky |
|---|---|---|---|
| OBJ (Wavefront) | Ano | Ano | Čte/zapisuje .mtl materiály; použijte ObjLoadOptions.enableMaterials pro import |
| glTF 2.0 | Ano | Ano | Formát textu JSON; materiály PBR |
| GLB | Ano | Ano | Binární glTF; nastaveno GltfSaveOptions.binaryMode = true |
| STL | Ano | Ano | Binární a ASCII; plně ověřený roundtrip |
| 3MF | Ano | Ano | 3D Manufacturing Format with color and material metadata |
| FBX | Ne* | Ne* | Importér/exportér existuje, ale automatické rozpoznání formátu není napojeno |
| COLLADA (DAE) | Ano | Ano | Měřítko jednotek, geometrie, materiály a animační klipy |
Načítání OBJ s materiály:
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const scene = new Scene();
const options = new ObjLoadOptions();
options.enableMaterials = true;
options.flipCoordinateSystem = false;
options.scale = 1.0;
options.normalizeNormal = true;
scene.open('model.obj', options);Ukládání do GLB (binární glTF):
import { Scene } from '@aspose/3d';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';
const scene = new Scene();
// ... build or load scene content
const opts = new GltfSaveOptions();
opts.binaryMode = true;
scene.save('output.glb', GltfFormat.getInstance(), opts);Scénový graf
Veškerý 3D obsah je uspořádán jako strom Node objektů s kořenem v scene.rootNode. Každý uzel může nést Entity (a Mesh, Camera, Light, nebo jiný SceneObject) a Transform který jej umisťuje relativně k jeho rodiči.
Klíčové třídy scénového grafu:
Scene: kontejner nejvyšší úrovně; obsahujerootNodeaanimationClipsNode: pojmenovaný uzel stromu schildNodes,entity,transform, amaterialsEntity: základní třída pro připojitelné objekty (Mesh,Camera,Light)SceneObject: základní třída sdílená meziNodeaEntityA3DObject: kořenová základní třída snamea kapsa vlastnostíTransform: lokální posunutí, rotace (Euler a Quaternion) a měřítko
Procházení grafu scény:
import { Scene, Node, Mesh } from '@aspose/3d';
const scene = new Scene();
scene.open('model.obj');
function visit(node: Node, depth: number = 0): void {
const indent = ' '.repeat(depth);
console.log(`${indent}Node: ${node.name}`);
if (node.entity) {
console.log(`${indent} Entity: ${node.entity.constructor.name}`);
}
for (const child of node.childNodes) {
visit(child, depth + 1);
}
}
visit(scene.rootNode);Programové vytváření hierarchie scény:
import { Scene, Node } from '@aspose/3d';
const scene = new Scene();
const parent = scene.rootNode.createChildNode('chassis');
const wheel = parent.createChildNode('wheel_fl');
wheel.transform.translation.set(0.9, -0.3, 1.4);Geometrie a Mesh
Mesh je primárním typem geometrie. Rozšiřuje Geometry a zpřístupňuje řídicí body (vrcholy), indexy polygonů a elementy vrcholů pro normály, UV a barvy vrcholů.
Klíčové třídy geometrie:
Mesh: polygonová síť scontrolPointsapolygonCountGeometry: základní třída se správou elementů vrcholůVertexElementNormal: per-vertex nebo per-polygon-vertex normályVertexElementUV: texturové souřadnice (jeden nebo více UV kanálů)VertexElementVertexColor: per-vertex barevná dataMappingMode: řídí, jak se data elementů mapují na polygony (ByControlPoint,ByPolygonVertex, atd.)ReferenceMode: řídí strategii indexování (Direct,IndexToDirect)VertexElementType: identifikuje sémantiku vrcholového elementuTextureMapping: enumerace texturových kanálů
Čtení dat mesh z načtené scény:
import { Scene, Mesh, VertexElementType } from '@aspose/3d';
const scene = new Scene();
scene.open('model.stl');
for (const node of scene.rootNode.childNodes) {
if (node.entity instanceof Mesh) {
const mesh = node.entity as Mesh;
console.log(`Mesh "${node.name}": ${mesh.controlPoints.length} vertices, ${mesh.polygonCount} polygons`);
const normals = mesh.getElement(VertexElementType.NORMAL);
if (normals) {
console.log(` Normal mapping: ${normals.mappingMode}`);
}
}
}Systém materiálů
Aspose.3D FOSS pro TypeScript podporuje tři typy materiálů pokrývající celý rozsah od starého Phong stínování po fyzikálně založené renderování:
LambertMaterial: difúzní barva a ambientní barva; mapuje na jednoduché materiály OBJ/DAEPhongMaterial: přidává spekulární barvu, lesk a emisivitu; výchozí typ materiálu OBJPbrMaterial: fyzicky založený model drsnosti/kovovosti; používá se pro import a export glTF 2.0
Čtení materiálů z načtené OBJ scény:
import { Scene, PhongMaterial, LambertMaterial } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const scene = new Scene();
const options = new ObjLoadOptions();
options.enableMaterials = true;
scene.open('model.obj', options);
for (const node of scene.rootNode.childNodes) {
for (const mat of node.materials) {
if (mat instanceof PhongMaterial) {
const phong = mat as PhongMaterial;
console.log(` Phong: diffuse=${JSON.stringify(phong.diffuseColor)}, shininess=${phong.shininess}`);
} else if (mat instanceof LambertMaterial) {
console.log(` Lambert: diffuse=${JSON.stringify((mat as LambertMaterial).diffuseColor)}`);
}
}
}Aplikace PBR materiálu při vytváření glTF scény:
import { Scene, Node, PbrMaterial } from '@aspose/3d';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';
const scene = new Scene();
const node = scene.rootNode.createChildNode('sphere');
const mat = new PbrMaterial();
mat.albedo = new Vector3(0.8, 0.2, 0.2); // albedo starts null, must assign
mat.metallicFactor = 0.0;
mat.roughnessFactor = 0.5;
node.material = mat;
const opts = new GltfSaveOptions();
opts.binaryMode = false;
scene.save('output.gltf', GltfFormat.getInstance(), opts);Matematické utility
Knihovna je dodávána s kompletním souborem 3D matematických typů, všechny plně typované:
Vector3: 3‑komponentový vektor; podporujeadd,subtract,scale,dot,cross,normalize,lengthVector4: 4‑komponentový vektor pro homogenní souřadniceMatrix4: 4×4 transformační matice smultiply,invert,transpose,decomposeQuaternion: rotační kvaternion sfromEulerAngles,toEulerAngles,slerp,normalizeBoundingBox: osově zarovnaná ohraničující krabice smin,max,center,size,mergeFVector3: jednopřesnostní variantaVector3použito v datech vrcholových elementů
Výpočet ohraničujícího boxu z vrcholů sítě:
import { Scene, Mesh, Vector3, BoundingBox } from '@aspose/3d';
const scene = new Scene();
scene.open('model.obj');
let box = new BoundingBox();
for (const node of scene.rootNode.childNodes) {
if (node.entity instanceof Mesh) {
for (const pt of (node.entity as Mesh).controlPoints) {
box.merge(new Vector3(pt.x, pt.y, pt.z));
}
}
}
console.log('Center:', box.center);
console.log('Extents:', box.size);Sestavení transformace z Eulerových úhlů:
import { Quaternion, Vector3, Matrix4 } from '@aspose/3d';
const rot = Quaternion.fromEulerAngle(0, Math.PI / 4, 0); // 45° around Y
const mat = new Matrix4();
mat.setTRS(new Vector3(0, 0, 0), rot, new Vector3(1, 1, 1));Systém animace
API animace modeluje klipy, uzly, kanály a sekvence klíčových snímků:
AnimationClip: pojmenovaná kolekce animačních uzlů; přístupná přesscene.animationClipsAnimationNode: sváže klip se scénovým uzlem podle názvuAnimationChannel: cílí na konkrétní vlastnost (např. translation X) v animačním uzluKeyFrame: jedna dvojice čas/hodnotaKeyframeSequence: uspořádaný seznamKeyFrameobjekty sInterpolationaExtrapolationnastaveníInterpolation: režim interpolace klíčových snímků:Linear,Constant,CubicExtrapolation: chování před/po rozsahu klíčových snímků:Constant,Cycle,Mirror
Čtení animačních dat z načtené scény:
import { Scene, AnimationClip, KeyframeSequence } from '@aspose/3d';
const scene = new Scene();
scene.open('animated.fbx');
for (const clip of scene.animationClips) {
console.log(`Clip: "${clip.name}"`);
for (const animNode of clip.nodes) {
console.log(` Node: ${animNode.name}`);
for (const channel of animNode.channels) {
const seq: KeyframeSequence = channel.keyframeSequence;
console.log(` Channel "${channel.name}": ${seq.keyFrames.length} keyframes`);
console.log(` Interpolation: ${seq.interpolation}`);
}
}
}Podpora streamů a bufferů
Použijte scene.openFromBuffer() k načtení 3D scény přímo z paměti Buffer. Toto je doporučený vzor pro serverless funkce, streamovací pipeline a zpracování aktiv načtených přes HTTP bez zápisu na disk.
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
import * as fs from 'fs';
// Load file into memory, then parse from buffer
const buffer: Buffer = fs.readFileSync('model.obj');
const scene = new Scene();
const options = new ObjLoadOptions();
options.enableMaterials = true;
scene.openFromBuffer(buffer, options);
for (const node of scene.rootNode.childNodes) {
if (node.entity) {
console.log(node.name, node.entity.constructor.name);
}
}Automatiké rozpoznání formátu z binárních magických čísel se použije při načítání z bufferu, takže soubory GLB, binární STL a 3MF jsou rozpoznány bez nutnosti zadávat parametr formátu.
Příklady použití
Příklad 1: Načíst OBJ a exportovat do GLB
Tento příklad načte soubor Wavefront OBJ s materiály a poté znovu exportuje scénu jako binární glTF (GLB) soubor vhodný pro použití na webu a ve herních enginech.
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';
function convertObjToGlb(inputPath: string, outputPath: string): void {
const scene = new Scene();
const loadOpts = new ObjLoadOptions();
loadOpts.enableMaterials = true;
loadOpts.flipCoordinateSystem = false;
loadOpts.normalizeNormal = true;
scene.open(inputPath, loadOpts);
// Report what was loaded
for (const node of scene.rootNode.childNodes) {
if (node.entity) {
console.log(`Loaded: ${node.name} (${node.entity.constructor.name})`);
}
}
const saveOpts = new GltfSaveOptions();
saveOpts.binaryMode = true; // write .glb instead of .gltf + .bin
scene.save(outputPath, GltfFormat.getInstance(), saveOpts);
console.log(`Exported GLB to: ${outputPath}`);
}
convertObjToGlb('input.obj', 'output.glb');Příklad 2: Round‑Trip STL s validací normál
Tento příklad načte binární STL soubor, vypíše informace o normálách pro každý vrchol a poté znovu exportuje scénu jako ASCII STL a ověří round‑trip.
import { Scene, Mesh, VertexElementNormal, VertexElementType } from '@aspose/3d';
import { StlLoadOptions, StlSaveOptions } from '@aspose/3d/formats/stl';
const scene = new Scene();
const loadOpts = new StlLoadOptions();
scene.open('model.stl', loadOpts);
let totalPolygons = 0;
for (const node of scene.rootNode.childNodes) {
if (node.entity instanceof Mesh) {
const mesh = node.entity as Mesh;
totalPolygons += mesh.polygonCount;
const normElem = mesh.getElement(VertexElementType.NORMAL) as VertexElementNormal | null;
if (normElem) {
console.log(` Normals: ${normElem.data.length} entries, mapping=${normElem.mappingMode}`);
}
}
}
console.log(`Total polygons: ${totalPolygons}`);
// Re-export as ASCII STL
const saveOpts = new StlSaveOptions();
saveOpts.binaryMode = false; // ASCII output
scene.save('output_ascii.stl', saveOpts);Příklad 3: Programově vytvořit scénu a uložit jako glTF
Tento příklad vytvoří scénu s PBR materiálem od nuly a uloží ji jako JSON glTF soubor.
import { Scene, Mesh, PbrMaterial, Vector4 } from '@aspose/3d';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';
const scene = new Scene();
const node = scene.rootNode.createChildNode('floor');
// Build a simple quad mesh (two triangles)
// controlPoints are Vector4 (x, y, z, w) where w=1 for positions
const mesh = new Mesh();
mesh.controlPoints.push(
new Vector4(-1, 0, -1, 1),
new Vector4( 1, 0, -1, 1),
new Vector4( 1, 0, 1, 1),
new Vector4(-1, 0, 1, 1),
);
mesh.createPolygon([0, 1, 2]);
mesh.createPolygon([0, 2, 3]);
node.entity = mesh;
// Apply a PBR material
const mat = new PbrMaterial();
mat.albedo = new Vector3(0.6, 0.6, 0.6); // albedo starts null, must assign
mat.metallicFactor = 0.0;
mat.roughnessFactor = 0.8;
node.material = mat;
// Save as JSON glTF
const opts = new GltfSaveOptions();
opts.binaryMode = false;
scene.save('floor.gltf', GltfFormat.getInstance(), opts);
console.log('Scene written to floor.gltf');Tipy a osvědčené postupy
- Použijte
ObjLoadOptions.enableMaterials = truekdykoli potřebujete materiálová data ze souborů .mtl. Bez toho bude seznam materiálů na každém uzlu prázdný. - Upřednostněte
binaryMode = truepro GLB při tvorbě aktiv pro webové nebo herní enginy. Binární GLB je jediný samostatný soubor a načítá se rychleji v prohlížečích a enginech než rozdělení JSON + .bin. - Použijte
openFromBuffer()v serverless prostředích aby se předešlo dočasnému souborovému I/O. Načtěte aktivum, předávejteBufferpřímo a zapište výstup do proudu nebo jiného bufferu. - Zkontrolovat
node.entitypřed přetypováním: ne všechny uzly nesou entitu. Vždy se chraňte pomocíinstanceofzkontrolujte před přístupemMesh-specifické vlastnosti, jako napříkladcontrolPoints. - Nastavit
normalizeNormal = truevObjLoadOptionskdyž vaše zdrojové soubory OBJ pocházejí z nedůvěryhodných zdrojů. To zabraňuje šíření degenerovaných normál do následných kroků renderování nebo validace. - Zachovat
strict: truev tsconfig.json: knihovna je vytvořena snoImplicitAnyastrictNullChecks. Zakázánístrictmaskuje skutečné typové chyby a podkopává hodnotu typovaného API. - Procházejte pomocí
childNodes, ne indexovou smyčkou:childNodesvlastnost vrací iterovatelný objekt; vyhněte se spoléhaní na číselné indexování pro budoucí kompatibilitu.
Běžné problémy
| Symptom | Pravděpodobná příčina | Opravit |
|---|---|---|
| Seznam materiálů je prázdný po načtení OBJ | enableMaterials není nastaveno | Nastavit options.enableMaterials = true |
| Soubor GLB obsahuje samostatný .bin sidecar | binaryMode výchozí nastavení false | Nastavit opts.binaryMode = true |
| Normály vrcholů chybí ve výstupu STL | Režim STL ASCII vynechává normály po jednotlivých plochách | Přepnout na binaryMode = true nebo vypočítat normály před exportem |
node.entity je vždy null | Procházení pouze rootNode, ne jeho potomky | Rekurzivně vstoupit do node.childNodes |
| Chyba TypeScript: vlastnost neexistuje | Starý @types vyrovnávací paměť | Spustit npm install @aspose/3d znovu; žádný samostatný @types balíček je potřeba |
openFromBuffer vyvolá chybu formátu | Formát nelze automaticky detekovat z magických | Předat explicitní třídu volby formátu jako druhý argument |
Často kladené otázky
Vyžaduje knihovna nějaké nativní doplňky nebo systémové balíčky? Ne. Aspose.3D FOSS pro TypeScript má jedinou runtime závislost: xmldom, což je čistý JavaScript a je instalováno automaticky pomocí npm. Neexistují žádné .node nativní doplňky ani systémové balíčky k instalaci.
Které verze Node.js jsou podporovány? Node.js 18, 20 a 22 LTS. Knihovna cílí na výstup CommonJS a interně používá jazykové funkce ES2020.
Mohu knihovnu použít v balíčku pro prohlížeč (webpack/esbuild)? Knihovna cílí na Node.js a používá Node.js fs a Buffer API. Balíčkování pro prohlížeč není oficiálně podporováno. Pro použití v prohlížeči načtěte scénu na serveru a výsledek (např. jako GLB) přeneste klientovi.
Jaký je rozdíl mezi GltfSaveOptions.binaryMode = true a false? binaryMode = false produkuje .gltf soubor JSON plus samostatný .bin binární bufferový sidecar. binaryMode = true produkuje jeden samostatný .glb soubor. Použijte true pro doručení produkčních aktiv.
Mohu načíst soubor z HTTP odpovědi, aniž bych jej uložil na disk? Ano. Načtěte odpověď jako Buffer (např. pomocí node-fetch nebo vestavěného fetch v Node 18+), pak zavolejte scene.openFromBuffer(buffer, options).
Je podpora FBX kompletní? Čtení a zápis FBX je podporován pro hierarchii scény, síťová a geometrická data, animační klipy a materiály. Velmi komplexní soubory FBX s vloženými médii mohou poskytovat částečné výsledky; vyzkoušejte s vaším konkrétním korpusem aktiv.
Podporuje knihovna TypeScript 4.x? Doporučuje se TypeScript 5.0+. TypeScript 4.7+ by měl v praxi fungovat, ale knihovna je testována a vyvíjena proti verzi 5.0+.
Shrnutí referenčního API
| Třída | Modul | Účel |
|---|---|---|
Scene | @aspose/3d | Kontejner scény na nejvyšší úrovni; open(), openFromBuffer(), save(), rootNode, animationClips |
Node | @aspose/3d | Uzel grafu scény; childNodes, entity, transform, materials, createChildNode() |
Entity | @aspose/3d | Základní třída pro objekty připojitelné ke scéně |
SceneObject | @aspose/3d | Základní třída sdílená mezi Node a Entity |
A3DObject | @aspose/3d | Kořenová základna s name a balíček vlastností |
Transform | @aspose/3d | Lokální posunutí, rotace a měřítko |
Mesh | @aspose/3d | Polygonová síť; controlPoints, polygonCount, createPolygon(), prvky vrcholů |
Geometry | @aspose/3d | Základní třída pro typy geometrie |
Camera | @aspose/3d | Entita kamery s úhlem zorného pole a nastavením projekce |
Light | @aspose/3d | Entita světla (bodové, směrové, kuželové) |
LambertMaterial | @aspose/3d | Difúzní + ambientní model osvětlení |
PhongMaterial | @aspose/3d | Phongovo osvětlení s odlesky a emisí |
PbrMaterial | @aspose/3d | Fyzikálně založený model drsnosti/kovovosti pro glTF |
Vector3 | @aspose/3d | 3-component double-precision vector |
Vector4 | @aspose/3d | 4-component vector for homogeneous math |
Matrix4 | @aspose/3d | 4×4 transformation matrix |
Quaternion | @aspose/3d | Rotace kvaternion |
BoundingBox | @aspose/3d | Osově zarovnaný ohraničující kvádr |
FVector3 | @aspose/3d | Jednopřesná varianta Vector3 |
VertexElementNormal | @aspose/3d | Normály na vrchol nebo na vrchol polygonu |
VertexElementUV | @aspose/3d | Prvek vrcholu texturových souřadnic |
VertexElementVertexColor | @aspose/3d | Prvek barvy na vrchol |
MappingMode | @aspose/3d | Výčet: CONTROL_POINT, POLYGON_VERTEX, POLYGON, ALL_SAME |
ReferenceMode | @aspose/3d | Výčet: Direct, IndexToDirect |
AnimationClip | @aspose/3d | Pojmenovaná animace; obsahuje AnimationNode seznam |
AnimationNode | @aspose/3d | Váže clip na uzel scény; obsahuje AnimationChannel seznam |
AnimationChannel | @aspose/3d | Cílí na vlastnost; obsahuje KeyframeSequence |
KeyFrame | @aspose/3d | Jedna dvojice čas/hodnota keyframe |
KeyframeSequence | @aspose/3d | Seřazený seznam klíčových snímků s interpolací a extrapolací |
Interpolation | @aspose/3d | Enum: Linear, Constant, Cubic |
Extrapolation | @aspose/3d | Enum: Constant, Cycle, Mirror |
ObjLoadOptions | @aspose/3d/formats/obj | Možnosti importu OBJ: enableMaterials, flipCoordinateSystem, scale, normalizeNormal |
GltfSaveOptions | @aspose/3d/formats/gltf | Možnosti exportu glTF/GLB: binaryMode |
GltfFormat | @aspose/3d/formats/gltf | Instance formátu pro glTF/GLB; předat do scene.save() |
StlLoadOptions | @aspose/3d/formats/stl | Možnosti importu STL |
StlSaveOptions | @aspose/3d/formats/stl | Možnosti exportu STL: binaryMode |
StlImporter | @aspose/3d/formats/stl | Nízkoúrovňová čtečka STL |
StlExporter | @aspose/3d/formats/stl | Nízkoúrovňový zapisovač STL |