Kaip įkelti 3D modelius TypeScript
@aspose/3d paketas suteikia TypeScript ir Node.js programoms paprastą API 3D scenų failų atvėrimui. Scene yra šakninis objektas: iškvieskite scene.open() su failo keliu ir pasirenkamais formatui būdingais įkėlimo parametrais, tada naršykite scene.rootNode norėdami pasiekti geometriją, medžiagas ir transformacijas.
Žingsnis po žingsnio vadovas
Žingsnis 1: Įdiekite @aspose/3d naudodami npm
Pridėkite paketą prie savo projekto. Nereikia jokių natūralių binarinių failų ar platformai specifinių kūrimo įrankių; tik Node.js 18 arba naujesnė.
npm install @aspose/3dTypeScript projektams tipų apibrėžimai yra įtraukti į paketą:
##tsconfig.json: minimum required settings
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"strict": true
}
}Žingsnis 2: Importuoti sceną ir formatui specifines parinktis
Kiekvienas formatas pateikia savo įkėlimo klasę ir parametrų objektą po sub‑kelio. Importuokite tik tai, ko jums reikia:
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';Kitiems formatams šablonas yra identiškas:
import { GltfLoadOptions } from '@aspose/3d/formats/gltf';
import { FbxLoadOptions } from '@aspose/3d/formats/fbx';
import { StlLoadOptions } from '@aspose/3d/formats/stl';Žingsnis 3: Atidarykite 3D failą naudodami scene.open()
Sukurkite Scene egzempliorių, tada iškvieskite scene.open() su failo keliu ir neprivalomu įkėlimo parinkčių objektu. Iškvietimas yra sinchroninis.
import { Scene } 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);
console.log('Scene loaded successfully');Įkelti iš jau atmintyje esančio Buffer (naudinga serverless arba srautinėse kontekstuose):
import * as fs from 'fs';
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const buffer = fs.readFileSync('model.obj');
const scene = new Scene();
scene.openFromBuffer(buffer, new ObjLoadOptions());Žingsnis 4: Iteruoti per scenos mazgus
Scenos grafas yra medis, kurio šaknis yra scene.rootNode. Kiekvienas Node gali turėti vaikų mazgus ir pasirenkamą entity (tinklas, kamera, šviesa ir kt.).
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const scene = new Scene();
scene.open('model.obj', new ObjLoadOptions());
function visitNode(node: any, depth: number = 0): void {
const indent = ' '.repeat(depth);
console.log(`${indent}Node: ${node.name}`);
if (node.entity) {
console.log(`${indent} Entity type: ${node.entity.constructor.name}`);
}
for (const child of node.childNodes) {
visitNode(child, depth + 1);
}
}
visitNode(scene.rootNode);Žingsnis 5: Gauti tinklo viršūnių duomenis naudojant controlPoints
Kai mazgo objektas yra Mesh, galite perskaityti neapdorotus valdymo taškus (viršūnes) iš controlPoints masyvo. Kiekvienas įrašas yra Vector4 su x, y, z ir w komponentais.
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const scene = new Scene();
scene.open('model.obj', new ObjLoadOptions());
for (const node of scene.rootNode.childNodes) {
if (!node.entity) continue;
const entity = node.entity;
// Check if the entity is a Mesh by duck-typing controlPoints
if ('controlPoints' in entity) {
const mesh = entity as any;
console.log(`Mesh "${node.name}": ${mesh.controlPoints.length} vertices`);
// Print first three vertices
for (let i = 0; i < Math.min(3, mesh.controlPoints.length); i++) {
const v = mesh.controlPoints[i];
console.log(` v[${i}]: x=${v.x.toFixed(4)}, y=${v.y.toFixed(4)}, z=${v.z.toFixed(4)}`);
}
}
}Žingsnis 6: Konfigūruoti ObjLoadOptions medžiagų įkėlimui
ObjLoadOptions atskleidžia savybes, leidžiančias kontroliuoti, kaip susiję .mtl medžiagų failai ir tekstūros yra išsprendžiami.
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const options = new ObjLoadOptions();
options.enableMaterials = true; // parse .mtl file if present
const scene = new Scene();
scene.open('model.obj', options);
// Inspect materials attached to nodes
for (const node of scene.rootNode.childNodes) {
if (node.material) {
console.log(`Material on "${node.name}": ${node.material.constructor.name}`);
}
}Įprastos problemos ir sprendimai
Klaida: Nepavyko rasti modulio ‘@aspose/3d/formats/obj’
Formato subkeliai reikalauja Node.js 12.7+ paketų eksporto. Įsitikinkite, kad naudojate Node.js 18 arba naujesnę versiją. Jei naudojate TypeScript, nustatykite "moduleResolution": "node16" arba "bundler" į tsconfig.json.
scene.rootNode.childNodes yra tuščas po open()
Kai kurie OBJ failai naudoja nestandartinius eilutės pabaigos ženklus arba neturi galutinės naujos eilutės. Patikrinkite, ar failas yra galiojantis OBJ, atidarydami jį teksto redaktoriuje. Taip pat patvirtinkite, kad perdavėte ObjLoadOptions, o ne bendrinį LoadOptions: formatui specifiniai parametrai būtini teisingam paskirstymui.
controlPoints masyvas yra nulinio ilgio
Tinklas galėjo būti įkeliamas, bet neturi geometrijos (pvz., tuščia grupė OBJ faile). Naudokite mesh.polygonCount patikrinimui prieš iteruojant viršūnes.
Didelių failų atminties naudojimas yra didelis
Įkėlimas iš buferio su scene.openFromBuffer() nesumažina didžiausios atminties: visą failą reikia išanalizuoti. Dideliems failams (> 100 MB) įsitikinkite, kad jūsų Node.js procesas turi pakankamą heap: node --max-old-space-size=4096 yourScript.js.
Tipų klaidos: ’entity’ yra tipo ‘unknown’entity savybė yra plačiai tipizuota. Paverkite į any arba į konkrečią klasę (Mesh, Camera ir kt.) priklausomai nuo to, ko tikitės savo scenoje.
Dažniausiai užduodami klausimai (DUK)
Kokius formatus galima įkelti su scene.open()?
OBJ, glTF 2.0 (.gltf + .bin), GLB, STL, 3MF, FBX ir COLLADA (.dae) visi palaikomi importui. Pateikite atitinkamą *LoadOptions klasę kiekvienam formatui.
Ar galiu įkelti failą nenurodydamas parinkčių?
Taip. scene.open('model.glb') veikia be parinkčių formatais, kuriems nereikia specialios konfigūracijos. Parinkčių perdavimas rekomenduojamas OBJ, nes medžiagos rezoliucija priklauso nuo enableMaterials.
Ar įkėlimas vyksta asinchroniškai?
Ne. scene.open() ir scene.openFromBuffer() yra sinchroniniai. Įdėkite juos į darbinę giją arba setImmediate, jei reikia išlaikyti įvykių ciklą reaguojantį.
Ar OBJ eksportas palaikomas?
Taip. OBJ eksportas palaikomas per scene.save('output.obj'). .mtl medžiagos failas rašomas automatiškai šalia .obj failo.
Kur tikimasi .mtl failo įkeliant OBJ?
Pagal numatytuosius nustatymus, analizatorius ieško .mtl failo, įvardinto OBJ viduje (mtllib direktyva), atsižvelgdamas į OBJ failo katalogą. Įsitikinkite, kad abu failai yra tame pačiame aplanke.