Jak stworzyć 3D Mesh w programie TypeScript
Aspose.3D FOSS dla TypeScript pozwala zbudować geometrii 3D w całości w kodie bez ładowania jakiegokolwiek pliku. zdefiniujesz pozycje pionowe jako punkty sterowania, określaj poligony według indeksu i przypisuj opcjonalne elementy pionowej, takie jak normalne, UV lub kolorów pionowych. Wynik można zapisać do dowolnego formatu pisemnego: glTF, GLB, STL, FBX lub COLLADA.
Warunki
- Node.js 18 lub później
- TypScript 5.0 lub później
@aspose/3dinstalacja (patrz krok 1)
Przewodnik krok po kroku
Krok 1: Instalacja @aspose/3d
asposefoss/3d is not yet published — build from source until it ships. See the project README for build instructions.
Nie wymagane są native addons ani biblioteki systemowe. pakiet zawiera definicje typu TypeScript.
Minimalne tsconfig.json:
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"moduleResolution": "node",
"esModuleInterop": true,
"strict": true
}
}Krok 2: Tworzenie sceny i nodu
A Scene jest najwyższym poziomem kontenera. cała geometria musi być przymocowana do Node W środku drzewa:
import { Scene } from '@aspose/3d';
const scene = new Scene();
const node = scene.rootNode.createChildNode('triangle');createChildNode(name) tworzy nazwany węzły i przewraca je jako dziecko bieżącego wązu. Node Obiekt jest miejscem, w którym przymocujesz masę w kroku 7.
Krok 3: Tworzenie obiektu Mesh
Mesh posiada pozycje wrzodowe i poligony definicje. Konstruuj jeden z opcjonalnym nazwą:
import { Mesh } from '@aspose/3d/entities';
const mesh = new Mesh('triangle');Mysz zaczyna się puste: bez pionów i twarzy. Dodaj je w następnych krokach.
Krok 4: Dodaj punkty sterowania (wersje)
Punkty kontrolne to pozycje z góry w przestrzeni lokalnej. Vector4 Wartości w mesh.controlPoints.Czwarta część (w) jest 1 Dla pozycji:
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
Odwołujesz się do tych pozycji według ich indeksów opartych na zero, gdy zdefiniujesz poligony.
Krok 5: Tworzenie poligonu twarzy
createPolygon() Definuje twarz, wymieniając w kolejności indeksy pionowe.Trzy indyki tworzą trójkąt:
mesh.createPolygon(0, 1, 2);Możesz również zdefiniować kwady (cztery wskaźniki) lub arbitralne poligony dla formatów, które je obsługują. dla glTF biblioteka automatycznie trójkątnie kwad i n-gony na eksporcie.
Krok 6: Dodaj normy Vertex
Normy poprawiają jakość renderowania. używanie mesh.createElement() Aby stworzyć A VertexElementNormal, zbierać normalne wektory do kolejki, a następnie zadzwonić setData() Zostawmy je. - To jest data Getter zwraca kopii obronną – naciskając na nią nie ma efektu. FVector3 (samozwyczajne) dla normalnych danych, nie 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 To normalne na jeden vertek. ReferenceMode.DIRECT Oznacza to, że aria danych jest indeksowana bezpośrednio przez poligonowy indeks podwójny.
Krok 7: Przyłącz Mesh i zaoszczędzaj na glTF
Przypisuj masę do węzła poprzez node.entity,Następnie przechowuj scenę:
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');Aby stworzyć pojedynczy samokontentowany .glb Zamiast plików, ustaw saveOpts.binaryMode = true Zmiana rozszerzenia pliku wyjściowego do .glb.
Pełny przykład
Poniżej znajduje się pełny scenariusz łączący wszystkie powyższe kroki:
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');Bieg z ts-node:
npx ts-node triangle.tswspólne kwestie
| kwestia | Przyczyny | Fixy |
|---|---|---|
mesh.controlPoints.length 0 po pushie | Mesh nie odwołuje się do żadnego nodu | Push przed przyznaniem node.entity;- nie ma znaczenia, ale sprawdź referencję |
| Eksport wytwarza pustą geometrię | node.entity Nie przyznane | Bezpieczeństwo node.entity = mesh Przed wezwaniem scene.save() |
| Normalne liczby nieporozumienia | Array przeszedł do setData() Krótsza niż controlPoints | Dodaj jeden FVector3 wejście na punkt kontrolny przy użyciu MappingMode.CONTROL_POINT |
| GlTF widz pokazuje czarny małpę | Normalne wskazówki wewnątrz | Odwrotny porządek w createPolygon (w tym np., 0, 2, 1• odrzucenie wektorów normalnych |
| TypScript: właściwość ’normals.data’ nie została znaleziona | Nieprawidłowy kierunek importu | Importowanie VertexElementNormal od @aspose/3d/entities,Nie z @aspose/3d Root |
Często zadawane pytania
Czy można tworzyć kwady zamiast trójkąta? Przeprowadź cztery wskaźniki do createPolygon(0, 1, 2, 3).Biblioteka trójkątów kwad podczas eksportu do formatów wymagających trzynastu (glTF, STL).
Jaka jest różnica między MappingMode.CONTROL_POINT i MappingMode.POLYGON_VERTEX? CONTROL_POINT Wskaźnik jest jednym wartościem na unikalny vertex. POLYGON_VERTEX przechowuje jedną wartość na parę poligonu-wrzutowego, co pozwala na różne normy w tym samym szczycie, gdy należy do wielu polygonów (trudnych krańców).
Czy muszę trójkątnie złożyć masę przed oszczędzaniem na STL? Biblioteka automatycznie obsługuje trójkąt przy eksporcie do formatów wymagających trzynastu. można zdefiniować kwady i n-gony w myszce i przechowywać bezpośrednio do STL.
Jak dodać koordynaty UV? Używanie mesh.createElementUV(TextureMapping.Diffuse, MappingMode.CONTROL_POINT, ReferenceMode.DIRECT) Aby stworzyć A VertexElementUV,Następnie zadzwoń setData([...]) Z kolejną aretą FVector2 lub FVector3 1 punkt – jeden na kontrolny punkt. data Getter zwraca kopię; nie naciskaj na nią bezpośrednio.
Czy mogę w jednej scenie zbudować kilka kart? - tworzenie wielu węzłów pod scene.rootNode i przypisywać oddzielny Mesh W każdym z nich węzły entity Właściwości .