Jak stworzyć 3D Mesh w programie TypeScript

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/3d instalacja (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.ts

wspólne kwestie

kwestiaPrzyczynyFixy
mesh.controlPoints.length 0 po pushieMesh nie odwołuje się do żadnego noduPush przed przyznaniem node.entity;- nie ma znaczenia, ale sprawdź referencję
Eksport wytwarza pustą geometrięnode.entity Nie przyznaneBezpieczeństwo node.entity = mesh Przed wezwaniem scene.save()
Normalne liczby nieporozumieniaArray przeszedł do setData() Krótsza niż controlPointsDodaj jeden FVector3 wejście na punkt kontrolny przy użyciu MappingMode.CONTROL_POINT
GlTF widz pokazuje czarny małpęNormalne wskazówki wewnątrzOdwrotny porządek w createPolygon (w tym np., 0, 2, 1• odrzucenie wektorów normalnych
TypScript: właściwość ’normals.data’ nie została znalezionaNieprawidłowy kierunek importuImportowanie 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 .

Zobacz również

 Polski