Wie man ein 3D-Mesh in TypeScript programmiert erstellt
Aspose.3D FOSS für TypeScript ermöglicht es Ihnen, 3D-Geometrie vollständig in Code zu erstellen, ohne eine Datei zu laden. Sie definieren die Vertippspositionen als Steuerpunkte, geben Polygonflächen nach Index an und fügen optionale Vertexelemente wie Normale, UVs oder Vertikelfarben hinzu. Das Ergebnis kann in jedes schreibbare Format gespeichert werden: glTF, GLB, STL, FBX oder COLLADA.
Voraussetzungen für die Durchführung der Maßnahmen
- Node.js 18 or later
- TypScript 5.0 oder neuer Version
@aspose/3dinstalliert (siehe Schritt 1)
Schritt für Schritte
Schritt 1: Installieren @aspose/3d
asposefoss/3d is not yet published — build from source until it ships. See the project README for build instructions.
Das Paket enthält auch Typ-Definitionen.
Mindestbetrag tsconfig.json:
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"moduleResolution": "node",
"esModuleInterop": true,
"strict": true
}
}Schritt 2: Erstellen einer Szene und eines Knotenpunkts
A) Die Scene Die Geometrie muss an einem Node Innerhalb des Szenenbaumes:
import { Scene } from '@aspose/3d';
const scene = new Scene();
const node = scene.rootNode.createChildNode('triangle');createChildNode(name) erstellt einen benannten Knoten und verlegt ihn als Kind des aktuellen Knotes. Die zurückgegebene Node Objekt ist, wo Sie das Netz in Schritt 7 befestigen.
Schritt 3: Erstellen eines Mesh-Objekts
Mesh Konstruieren Sie eine mit einem optionalen Namen:
import { Mesh } from '@aspose/3d/entities';
const mesh = new Mesh('triangle');Das Netz beginnt leer: keine Spitzen und keine Gesichter. Sie fügen sie in den nächsten Schritten hinzu.
Schritt 4: Steuerelemente (Werte) hinzufügen
Die Kontrollpunkte sind die Punktpositionen im lokalen Raum. Vector4 Werte in die mesh.controlPoints.Die vierte Komponente (w) ist 1 für Positionen:
import { Vector4 } from '@aspose/3d/utilities';
mesh.controlPoints.push(new Vector4(0.0, 0.0, 0.0, 1.0)); // index 0
mesh.controlPoints.push(new Vector4(1.0, 0.0, 0.0, 1.0)); // index 1
mesh.controlPoints.push(new Vector4(0.5, 1.0, 0.0, 1.0)); // index 2
Sie beziehen sich auf diese Positionen durch ihren Null-basierten Index, wenn die Definition von Polygon Gesichtern.
Schritt 5: Erstellen von Polygonen
createPolygon() definiert eine Fläche, indem die Wurzelindex in der Reihenfolge aufgeführt werden. Drei Indizes bilden ein Dreieck:
mesh.createPolygon(0, 1, 2);Sie können auch Quads (vier Indizes) oder beliebige Polygone für Formate definieren, die diese unterstützen. Für glTF trianguliert die Bibliothek bei Export automatisch Quades und n-Gons.
Schritt 6: Hinzufügen von Vertex-Normalen
Normalen verbessern die Wiedergabequalität. mesh.createElement() Erstellung einer VertexElementNormal, normalen Vektoren in ein Array sammeln, dann rufen Sie setData() Die Veröffentlichung der data Getter gibt eine Verteidigungskopie zurück Drucken hat keine Wirkung. FVector3 (Einfachgenauigkeit) für normale Daten, nicht Vector4.
import { VertexElementNormal } from '@aspose/3d/entities';
import { VertexElementType, MappingMode, ReferenceMode } from '@aspose/3d/entities';
import { FVector3 } from '@aspose/3d/utilities';
const normals = mesh.createElement(
VertexElementType.NORMAL,
MappingMode.CONTROL_POINT,
ReferenceMode.DIRECT
) as VertexElementNormal;
// Build the normal array, then call setData() — do NOT push to normals.data
normals.setData([
new FVector3(0, 0, 1), // normal for vertex 0 (pointing +Z)
new FVector3(0, 0, 1), // normal for vertex 1
new FVector3(0, 0, 1), // normal for vertex 2
]);MappingMode.CONTROL_POINT bedeutet ein Normalpunkt pro Punkt. ReferenceMode.DIRECT bedeutet, dass das Datenarray direkt durch den Index des Polygon-Wertexts indiziert wird.
Schritt 7: Befestigen Sie das Netz und speichern Sie auf glTF
Zuweisen des Mesh an den Knoten über node.entity, dann retten Sie die Szene:
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';
node.entity = mesh;
const saveOpts = new GltfSaveOptions();
scene.save('triangle.gltf', GltfFormat.getInstance(), saveOpts);
console.log('Triangle mesh saved to triangle.gltf');Die Kommission hat die .glb Datei statt, gesetzt saveOpts.binaryMode = true und die Ausgabe-Dateierweiterung in: .glb.
Vollständiges Beispiel
Im Folgenden finden Sie das vollständige Skript, in dem alle oben genannten Schritte kombiniert sind:
import { Scene } from '@aspose/3d';
import { Mesh, VertexElementNormal } from '@aspose/3d/entities';
import { VertexElementType, MappingMode, ReferenceMode } from '@aspose/3d/entities';
import { Vector4, FVector3 } from '@aspose/3d/utilities';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';
const scene = new Scene();
const node = scene.rootNode.createChildNode('triangle');
const mesh = new Mesh('triangle');
mesh.controlPoints.push(new Vector4(0.0, 0.0, 0.0, 1.0));
mesh.controlPoints.push(new Vector4(1.0, 0.0, 0.0, 1.0));
mesh.controlPoints.push(new Vector4(0.5, 1.0, 0.0, 1.0));
mesh.createPolygon(0, 1, 2);
const normals = mesh.createElement(
VertexElementType.NORMAL,
MappingMode.CONTROL_POINT,
ReferenceMode.DIRECT
) as VertexElementNormal;
// setData() is the correct API — normals.data returns a defensive copy; pushing to it has no effect
normals.setData([
new FVector3(0, 0, 1),
new FVector3(0, 0, 1),
new FVector3(0, 0, 1),
]);
node.entity = mesh;
const saveOpts = new GltfSaveOptions();
scene.save('triangle.gltf', GltfFormat.getInstance(), saveOpts);
console.log('Triangle mesh saved to triangle.gltf');Lauf mit ihm. ts-node:
npx ts-node triangle.tsHäufige Probleme
| Ausgabe | Ursache | Behebung |
|---|---|---|
mesh.controlPoints.length ist 0 nach dem Druck. | Netz, auf das kein Knoten verweist | Drücken, bevor Sie zuweisen node.entity; die Reihenfolge spielt keine Rolle, aber überprüfen Sie den Bezug. |
| Export produziert leere Geometrie | node.entity nicht zugewiesen | Sicherstellen node.entity = mesh vor dem Anruf . scene.save() |
| Normalzahl-Unterschied | Array auf übertragen setData() weniger als controlPoints | Einer hinzufügen. FVector3 Eintrag pro Kontrollpunkt bei Verwendung: MappingMode.CONTROL_POINT |
| Der glTF-Viewer zeigt schwarzes Netz. | Normalen, die nach innen zeigen. | Umgekehrter Aufwicklungsbefehl in createPolygon (z. B., die., 0, 2, 1) oder normalen Vektoren ablehnen. |
| TypScript: Eigenschaft ’normal.data’ nicht gefunden | Falscher Importweg | Einfuhr VertexElementNormal von @aspose/3d/entities, nicht ab @aspose/3d Wurzel |
Häufig gestellte Fragen
Kann ich Quads anstelle von Dreiecken erstellen? Ja, geben Sie vier Indizes an die createPolygon(0, 1, 2, 3).Die Bibliothek trianguliert Quads beim Export in Formate, die Dreiecks erfordern (glTF, STL).
Was ist der Unterschied zwischen MappingMode.CONTROL_POINT und . MappingMode.POLYGON_VERTEX? CONTROL_POINT Speichert einen Wert pro einzigartiger Punkt. POLYGON_VERTEX Speichert einen Wert pro Polygon-Vertexpaar, was verschiedene Normale am gleichen Versteck zulässt, wenn es zu mehreren Polygonen (harten Kanten) gehört.
Muss ich das Netz triangulieren, bevor ich es auf STL speichere? Die Bibliothek verarbeitet die Triangulation automatisch, wenn sie in Formate exportiert wird, für die Dreieck erforderlich sind. Sie können Quads und N-Gons im Netz definieren und direkt auf STL speichern.
Wie füge ich UV-Koordinaten hinzu? Verwendung mesh.createElementUV(TextureMapping.Diffuse, MappingMode.CONTROL_POINT, ReferenceMode.DIRECT) Erstellung einer VertexElementUV,Dann ruf an . setData([...]) mit einer Reihe von FVector2 oder FVector3 Die Werte 1 pro Kontrollpunkt. data Getter gibt eine Kopie zurück; drücken Sie nicht direkt darauf.
Kann ich mehrere Maschen in einer Szene bauen? Ja, erstellen Sie mehrere Knoten unter scene.rootNode und eine separate Mesh zu jedem Knoten entity Eigentum.