Funksjoner og funksjonalitet
Aspose.3D FOSS for TypeScript er et MIT-lisensiert Node.js-bibliotek for lasting, konstruering og eksportering av 3D‑scener. Det leveres med komplette TypeScript‑type‑definisjoner, en enkelt kjøretidsavhengighet (xmldom), og støtte for seks store 3D‑filformater. Denne siden er den primære referansen for alle funksjonsområder og inneholder kjørbare TypeScript‑kodeeksempler for hver av dem.
Installasjon og oppsett
Installer pakken fra npm med en enkelt kommando:
npm install @aspose/3dPakken retter seg mot CommonJS og krever Node.js 18 eller nyere. Etter installasjon, verifiser at din tsconfig.json inkluderer følgende kompilatoralternativer for full kompatibilitet:
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"moduleResolution": "node",
"esModuleInterop": true,
"strict": true
}
}Importer hoved‑ Scene klassen fra pakkens rot. Format‑spesifikke alternativklasser importeres fra deres respektive understier:
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';Funksjoner og funksjonalitet
Formatstøtte
Aspose.3D FOSS for TypeScript leser og skriver seks store 3D‑filformater. Formatgjenkjenning er automatisk fra binære magiske tall ved lasting, så du trenger ikke å spesifisere kildeformatet eksplisitt.
| Format | Les | Skriv | Notater |
|---|---|---|---|
| OBJ (Wavefront) | Ja | Ja | Leser/skriver .mtl materialer; bruk ObjLoadOptions.enableMaterials for import |
| glTF 2.0 | Ja | Ja | JSON-tekstformat; PBR-materialer |
| GLB | Ja | Ja | Binær glTF; satt GltfSaveOptions.binaryMode = true |
| STL | Ja | Ja | Binær og ASCII; full rundtur verifisert |
| 3MF | Ja | Ja | 3D Manufacturing Format with color and material metadata |
| FBX | Nei* | Nei* | Importør/eksportør finnes, men automatisk formatgjenkjenning er ikke koblet |
| COLLADA (DAE) | Ja | Ja | Enhetsskala, geometri, materialer og animasjonsklipp |
Laster OBJ med materialer:
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);Lagrer til GLB (binær 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);Scenegraf
All 3D-innhold er organisert som et tre av Node objekter med rot i scene.rootNode. Hver node kan bære en Entity (en Mesh, Camera, Light, eller andre SceneObject) og en Transform som posisjonerer den relativt til dens forelder.
Viktige scene‑grafklasser:
Scene: den øverste beholderen; inneholderrootNodeoganimationClipsNode: en navngitt tre-node medchildNodes,entity,transform, ogmaterialsEntity: basisklasse for vedleggbare objekter (Mesh,Camera,Light)SceneObject: basisklasse delt avNodeogEntityA3DObject: rotbasisklasse mednameog egenskapsposeTransform: lokal translasjon, rotasjon (Euler og Quaternion), og skalering
Traversering av scene‑grafen:
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);Opprette et scenehierarki programmatisk:
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);Geometri og Mesh
Mesh er den primære geometritypen. Den utvider Geometry og eksponerer kontrollpunkter (vertikser), polygonindekser og vertex-elementer for normaler, UV-er og vertex-farger.
Viktige geometriklasser:
Mesh: polygonnett medcontrolPointsogpolygonCountGeometry: basisklasse med vertex-elementhåndteringVertexElementNormal: per-vertex eller per-polygon-vertex normalerVertexElementUV: teksturkoordinater (en eller flere UV-kanaler)VertexElementVertexColor: per-vertex fargedataMappingMode: styrer hvordan elementdata kartlegges til polygoner (CONTROL_POINT,POLYGON_VERTEX,POLYGON,EDGE,ALL_SAME)ReferenceMode: styrer indekseringsstrategi (DIRECT,INDEX,INDEX_TO_DIRECT)VertexElementType: identifiserer semantikken til et vertex-elementTextureMapping: opptelling av teksturkanaler
Lese mesh-data fra en lastet scene:
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}`);
}
}
}Materialsystem
Aspose.3D FOSS for TypeScript støtter tre materialtyper som dekker hele spekteret fra eldre Phong-skygging til fysisk-basert rendering:
LambertMaterial: diffus farge og omgivelsesfarge; kartlegger til enkle OBJ/DAE-materialerPhongMaterial: legger til specular-farge, glans og emissiv; standard OBJ-materialtypePbrMaterial: fysisk-basert roughness/metallic-modell; brukt for glTF 2.0-import og -eksport
Leser materialer fra en lastet OBJ-scene:
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)}`);
}
}
}Bruk av et PBR-materiale når du bygger en glTF-scene:
import { Scene, Node, PbrMaterial } from '@aspose/3d';
import { Vector3 } 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); // red-tinted albedo; 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);Matematikkverktøy
Biblioteket leveres med et komplett sett av 3D-mattematikk-typer, alle fullt typet:
Vector3: 3-komponentvektor; støtterminus(),times(),dot(),cross(),normalize(),length,angleBetween()Vector4: 4-komponentvektor for homogene koordinaterMatrix4: 4×4 transformasjonsmatrise medconcatenate(),transpose,decompose,setTRSQuaternion: rotasjonskvaternion medfromEulerAngle()(statisk, entydig),eulerAngles()(instansmetode),slerp(),normalize()BoundingBox: aksejustert begrensningsboks medminimum,maximum,center,size,mergeFVector3: enkeltpresisjonsvariant avVector3brukt i vertex-elementdata
Beregn en begrensningsboks fra mesh-vertexer:
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);Bygger en transformasjon fra Euler-vinkler:
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));Animasjonssystem
Animasjons-API-et modellerer klipp, noder, kanaler og keyframe-sekvenser:
AnimationClip: navngitt samling av animasjonsnoder; aksessert viascene.animationClips; eksponereranimations: AnimationNode[]AnimationNode: navngitt gruppe avBindPoints; opprettet viaclip.createAnimationNode(name), aksessert viaclip.animationsBindPoint: binder enAnimationNodetil en spesifikk egenskap på et sceneobjekt; eksponererpropertyogchannelsCountAnimationChannel: utviderKeyframeSequence; holder en separatkeyframeSequence; aksessert viabindPoint.getChannel(name)KeyFrame: et enkelt tids-/verdi-par; bærer per-nøkkelbildeinterpolation: InterpolationKeyframeSequence: sortert liste overKeyFrameobjekter viakeyFrames; harpreBehaviorogpostBehavior(Extrapolation)Interpolation: enum:LINEAR,CONSTANT,BEZIER,B_SPLINE,CARDINAL_SPLINE,TCB_SPLINEExtrapolation: klasse medtype: ExtrapolationTypeogrepeatCount: numberExtrapolationType: enum:CONSTANT,GRADIENT,CYCLE,CYCLE_RELATIVE,OSCILLATE
Lese animasjonsdata fra en lastet scene:
import { Scene, AnimationNode, BindPoint } from '@aspose/3d';
const scene = new Scene();
scene.open('animated.dae'); // COLLADA animation import is supported
for (const clip of scene.animationClips) {
console.log(`Clip: "${clip.name}"`);
for (const animNode of clip.animations) { // clip.animations, not clip.nodes
console.log(` AnimationNode: ${animNode.name}`);
for (const bp of animNode.bindPoints) { // animNode.bindPoints, not animNode.channels
console.log(` BindPoint: property="${bp.property.name}", channels=${bp.channelsCount}`);
}
}
}Strøm- og bufferstøtte
Bruk scene.openFromBuffer() for å laste en 3D-scene direkte fra minnet Buffer. Dette er det anbefalte mønsteret for serverløse funksjoner, strømmings‑pipelines og behandling av ressurser hentet over HTTP uten å skrive til 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);
}
}Automatisk formatgjenkjenning fra binære magiske tall gjelder ved lasting fra buffer, så GLB-, STL‑binary- og 3MF‑filer blir gjenkjent uten å måtte angi en formatparameter.
Brukseksempler
Eksempel 1: Last inn OBJ og eksporter til GLB
Dette eksemplet laster inn en Wavefront OBJ‑fil med materialer, og eksporterer deretter scenen på nytt som en binær glTF (GLB)-fil som er egnet for bruk på nett og i spillmotorer.
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');Eksempel 2: Rundtur‑STL med normalvalidering
Dette eksemplet laster inn en binær STL‑fil, skriver ut normalinformasjon per vertex, og eksporterer deretter scenen på nytt som ASCII STL og verifiserer rundreisen.
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);Eksempel 3: Bygg en scene programmatisk og lagre som glTF
Dette eksemplet konstruerer en scene med et PBR-materiale fra bunnen av og lagrer den som en JSON glTF-fil.
import { Scene, Mesh, PbrMaterial, Vector4, Vector3 } 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');Tips og beste praksis
- Bruk
ObjLoadOptions.enableMaterials = truenår du trenger materialdata fra .mtl‑filer. Uten den vil materiallisten på hver node være tom. - Foretrekk
binaryMode = truefor GLB når du produserer ressurser for nett eller spillmotorer. Binær GLB er en enkelt selvstendig fil og lastes raskere i nettlesere og motorer enn JSON + .bin-delingen. - Bruk
openFromBuffer()i serverløse miljøer for å unngå midlertidig fil‑I/O. Hent ressursen, sendBufferdirekte, og skriv utdata til en strøm eller en annen buffer. - Sjekk
node.entityfør du kaster: ikke alle noder har en enhet. Beskytt alltid med eninstanceofsjekk før du får tilgang tilMesh-spesifikke egenskaper somcontrolPoints. - Sett
normalizeNormal = trueiObjLoadOptionsnår kilde‑OBJ‑filene dine kommer fra upålitelige kilder. Dette forhindrer degenererte normaler i å spre seg inn i nedstrøms rendering‑ eller valideringssteg. - Behold
strict: truei tsconfig.json: biblioteket er skrevet mednoImplicitAnyogstrictNullChecks. Deaktiveringstrictmaskerer ekte typefeil og undergraver verdien av den typede API-en. - Traverser via
childNodes, ikke en indeksløkke: denchildNodesegenskapen returnerer en iterabel; unngå å stole på numerisk indeksering for fremtidig kompatibilitet.
Vanlige problemer
| Symptom | Sannsynlig årsak | Løsning |
|---|---|---|
| Materialliste tom etter OBJ-lastning | enableMaterials ikke satt | Sett options.enableMaterials = true |
| GLB-fil inneholder separat .bin-sidefil | binaryMode standard til false | Sett opts.binaryMode = true |
| Vertexnormale mangler i STL-utdata | STL ASCII-modus utelater per-flate normaler | Bytt til binaryMode = true eller beregn normaler før eksport |
node.entity er alltid null | Traverserer kun rootNode, ikke dens barn | Gå rekursivt inn i node.childNodes |
| TypeScript-feil: egenskapen finnes ikke | Gammel @types hurtigbuffer | Kjør npm install @aspose/3d igjen; ingen separat @types pakke er nødvendig |
openFromBuffer kaster formatfeil | Formatet kan ikke automatisk oppdages fra magi | Send eksplisitt formatalternativklasse som andre argument |
Ofte stilte spørsmål
Krever biblioteket noen native-tillegg eller systempakker? Nei. Aspose.3D FOSS for TypeScript har en enkelt runtime‑avhengighet: xmldom, som er ren JavaScript og installeres automatisk av npm. Det finnes ingen .node native‑tillegg og ingen systempakker å installere.
Hvilke Node.js‑versjoner støttes? Node.js 18, 20 og 22 LTS. Biblioteket retter seg mot CommonJS-utdata og bruker ES2020-språkfunksjoner internt.
Kan jeg bruke biblioteket i en nettleserpakke (webpack/esbuild)? Biblioteket retter seg mot Node.js og bruker Node.js fs og Buffer API-er. Nettleser‑pakking støttes ikke offisielt. For bruk i nettleser, last inn scenen på server‑siden og overfør resultatet (f.eks. som GLB) til klienten.
Hva er forskjellen mellom GltfSaveOptions.binaryMode = true og false? binaryMode = false produserer en .gltf JSON‑fil pluss en separat .bin binær buffer‑sidecar. binaryMode = true produserer en enkelt selvstendig .glb fil. Bruk true for produksjons‑levering av ressurser.
Kan jeg laste inn en fil fra et HTTP‑svar uten å lagre den til disk? Ja. Hent svaret som en Buffer (f.eks. ved å bruke node-fetch eller den innebygde fetch i Node 18+), og deretter kall scene.openFromBuffer(buffer, options).
Er FBX‑støtte komplett? Nei. FBX‑import‑ og eksportklasser finnes i biblioteket, men FBX er ikke integrert i Scene.open() eller Scene.save() automatisk gjenkjenning. Å kalle scene.open('file.fbx') vil ikke aktivere FBX-importøren; filen vil bli håndtert av STL-reserveveien. Bruk de FBX-spesifikke import-/eksportklassene direkte hvis du trenger FBX I/O. Se formatstøttabellen ovenfor som merker FBX som No*.
Støtter biblioteket TypeScript 4.x? TypeScript 5.0+ anbefales. TypeScript 4.7+ bør fungere i praksis, men biblioteket er testet og skrevet mot 5.0+.
API-referansesammendrag
| Klasse | Modul | Formål |
|---|---|---|
Scene | @aspose/3d | Toppnivå scene-beholder; open(), openFromBuffer(), save(), rootNode, animationClips |
Node | @aspose/3d | Scene-grafnode; childNodes, entity, transform, materials, createChildNode() |
Entity | @aspose/3d | Basisklasse for objekter som kan festes til scenen |
SceneObject | @aspose/3d | Basisklasse delt av Node og Entity |
A3DObject | @aspose/3d | Rotbasisklasse med name og egenskapspose |
Transform | @aspose/3d | Lokal translasjon, rotasjon og skalering |
Mesh | @aspose/3d | Polygonnett; controlPoints, polygonCount, createPolygon(), vertex-elementer |
Geometry | @aspose/3d | Basisklasse for geometrityper |
Camera | @aspose/3d | Kameraenhet med synsfelt og projeksjonsinnstillinger |
Light | @aspose/3d | Lys-entity (point, directional, spot) |
LambertMaterial | @aspose/3d | Diffus + omgivende skyggelegningsmodell |
PhongMaterial | @aspose/3d | Phong-skyggelegning med spekulær og emissiv |
PbrMaterial | @aspose/3d | Fysisk-basert ruhet/metallisk modell for 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 | Rotasjonskvaternion |
BoundingBox | @aspose/3d | Aksialt justert avgrensningsboks |
FVector3 | @aspose/3d | Enkeltpresisjonsvariant av Vector3 |
VertexElementNormal | @aspose/3d | Per-vertex eller per-polygon-vertex normaler |
VertexElementUV | @aspose/3d | Teksturkoordinat vertex-element |
VertexElementVertexColor | @aspose/3d | Per-vertex farge vertex-element |
MappingMode | @aspose/3d | Enum: CONTROL_POINT, POLYGON_VERTEX, POLYGON, ALL_SAME |
ReferenceMode | @aspose/3d | Enum: DIRECT, INDEX, INDEX_TO_DIRECT |
AnimationClip | @aspose/3d | Navngitt animasjon; eksponerer animations: AnimationNode[]; opprettet via scene.createAnimationClip(name) |
AnimationNode | @aspose/3d | Navngitt gruppe av BindPoints; opprettet via clip.createAnimationNode(name) |
BindPoint | @aspose/3d | Binder en AnimationNode til en sceneobjekt-egenskap; eksponerer property og channelsCount |
AnimationChannel | @aspose/3d | Utvider KeyframeSequence; holder en keyframeSequence; tilgang via bindPoint.getChannel(name) |
KeyFrame | @aspose/3d | Enkelt tid/verdi nøkkelrammepar; bærer interpolation: Interpolation |
KeyframeSequence | @aspose/3d | Sortert keyFrames liste; preBehavior/postBehavior er Extrapolation objekter |
Interpolation | @aspose/3d | Enum: LINEAR, CONSTANT, BEZIER, B_SPLINE, CARDINAL_SPLINE, TCB_SPLINE |
Extrapolation | @aspose/3d | Klasse med type: ExtrapolationType og repeatCount: number |
ExtrapolationType | @aspose/3d | Enum: CONSTANT, GRADIENT, CYCLE, CYCLE_RELATIVE, OSCILLATE |
ObjLoadOptions | @aspose/3d/formats/obj | OBJ-importalternativer: enableMaterials, flipCoordinateSystem, scale, normalizeNormal |
GltfSaveOptions | @aspose/3d/formats/gltf | glTF/GLB-eksportalternativer: binaryMode |
GltfFormat | @aspose/3d/formats/gltf | Formatinstans for glTF/GLB; send til scene.save() |
StlLoadOptions | @aspose/3d/formats/stl | STL-importalternativer |
StlSaveOptions | @aspose/3d/formats/stl | STL-eksportalternativer: binaryMode |
StlImporter | @aspose/3d/formats/stl | Lavnivå STL-leser |
StlExporter | @aspose/3d/formats/stl | Lavnivå STL-skriver |