Jak pobrać modele 3D w typografie

Jak pobrać modele 3D w typografie

i The @aspose/3d Pakiet zapewnia aplikacjom TypeScript i Node.js prostą API do otwarcia plików sceny 3D. Scene jest głównym obiektem: wezwanie scene.open() z trasy pliku i opcjonalnymi opcjami ładowania w formacie, a następnie przechodzić przez scene.rootNode Dostęp do geometrii, materiałów i transformacji.

Przewodnik krok po kroku

Krok 1: Instaluj @aspose/3d za pośrednictwem npm

Nie wymagane są native binary ani platformowe narzędzia budowlane; tylko Node.js 18 lub później.

asposefoss/3d is not yet published — build from source until it ships. See the project README for build instructions.

W przypadku projektów TypeScript definicje typu są połączone z pakietem:

##tsconfig.json: minimum required settings
{
  "compilerOptions": {
    "target": "ES2020",
    "module": "commonjs",
    "strict": true
  }
}

Krok 2: Importowanie sceny i opcje specyficzne dla formatu

Każdy format wyświetla swój własny klasę ładowarki i obiekt opcji pod podwodnym. Importować tylko to, czego potrzebujesz:

import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';

W przypadku innych formatów wzór jest identyczny:

import { GltfLoadOptions } from '@aspose/3d/formats/gltf';
import { FbxLoadOptions } from '@aspose/3d/formats/fbx';
import { StlLoadOptions } from '@aspose/3d/formats/stl';

Krok 3: Otwórz plik 3D za pomocą scene.open()

Tworzenie A Scene W przypadku, a następnie wezwanie scene.open() z trasy pliku i opcjonalnym obiektem opcji ładowania. wezwanie jest synchroniczne.

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');

Aby pobrać z A Buffer już w pamięci (użyteczne w kontekście bezserwera lub transmisji):

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());

Krok 4: Wejdź na sceny

Grafika sceniczna to drzewo zakorzenione w scene.rootNode.Każdy z nich Node może zawierać węzły dziecięce i opcjonalne entity (Mesz, kamera i światło).

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);

Krok 5: Dostęp do danych z myszki za pośrednictwem punktów kontrolnych

Gdy jednostka węzła jest Mesh, można przeczytać surowe punkty kontroli (wersje) z controlPoints Wstęp: Każdy wpis jest jednym z Vector4 z x, y, z,i w i składników.

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)}`);
        }
    }
}

Krok 6: Konfiguruj ObjLoadOptions do ładowania materiałów

ObjLoadOptions wykazuje właściwości do kontroli, jak towarzyszyć .mtl Materiały i tekstury są rozstrzygnięte.

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}`);
    }
}

Wspólne problemy i rozwiązania

Błąd: Nie można znaleźć modułu ‘@aspose/3d/formats/obj’ Podpotyki formatowe wymagają eksportu pakietu Node.js 12.7+. upewnij się, że jesteś na Noda.js 18 lub później. Jeśli używasz TypeScript, ustawić "moduleResolution": "node16" lub "bundler" w tsconfig.json.

scena.rootNode.childNodes jest puste po otwarciu() Niektóre pliki OBJ używają niestandardowych końców linii lub brakuje śledzenia nowości. sprawdź, czy plik jest ważny OBD poprzez jego otwarcie w edytorze tekstu. ObjLoadOptions Nie jest to generika LoadOptions: opcje specyficzne dla formatu są wymagane do prawidłowego wysyłki.

Rysunek kontrolny ma zero długości Mecz może być ładowany, ale nie zawiera geometrii (np. pustej grupy w OBJ). mesh.polygonCount Sprawdź przed wyciągnięciem pionów.

Użycie pamięci jest wysokie dla dużych plików Zestaw z bufferem scene.openFromBuffer() nie zmniejsza pamięci szczytu: cały plik musi być parsed. Dla dużych pliku (> 100 MB), upewnij się, że proces Node.js ma wystarczającą ilość płytek: node --max-old-space-size=4096 yourScript.js.

Błędy typu: „entity” jest z rodzaju „unknown” i The entity Właściwości są szeroko rozpoznawane.Cast do any lub do konkretnej klasy (Mesh, Camera, itp.) w zależności od tego, czego oczekujesz na swojej scenie.

Często zadawane pytania (FAQ)

Jakie formaty można pobrać za pomocą scena.open()? OBJ, glTF 2.0 (.gltf + .bin), GLB, STL, 3MF, FBX i COLLADA ( .dae) są wszystkie obsługiwane do importu. *LoadOptions Klasy dla każdego formatu.

Czy mogę pobrać plik bez określenia opcji? Tak i tak. scene.open('model.glb') funkcje bez opcji dla formatów, które nie wymagają specjalnej konfiguracji. Opcje przejściowe są zalecane dla OBJ, ponieważ rozdzielczość materiału zależy od enableMaterials.

Czy ładowanie działa asynchronicznie? Nie . scene.open() i scene.openFromBuffer() są synchroniczne. wklej je do strumienia pracownika lub setImmediate Jeśli potrzebujesz, aby zespół był reakcyjny.

Czy eksport OBJ jest wspierany? Eksport OBJ jest wspierany przez scene.save('output.obj').• The .mtl Dokumenty są automatycznie zapisywane obok .obj w pliku .

Gdzie jest plik .mtl oczekiwany podczas ładowania OBJ? W przypadku nieprawidłowości, parzer szuka .mtl Wprowadzenie do programu w ramach OBJ (mtllib dyrektywa) w odniesieniu do katalogu pliku OBJ. Upewnij się, że oba pliki znajdują się w tym samym folderze.

Zobacz również

 Polski