TypeScript에서 3D Mesh를 프로그래밍하는 방법
Aspose.3D FOSS for TypeScript는 모든 파일을 충전하지 않고 코드에 완전히 3D 지메트리를 구축 할 수 있습니다. 당신은 컨트롤 포인트로 척추 위치를 정의하고, 인덱스에 따라 폴리곤 얼굴을 지정하고 정상, UV 또는 굴곡 색상과 같은 선택적 좌석 요소를 추가합니다. 결과는 글쓰기 형식으로 저장 될 수있다 : glTF, GLB, STL, FBX, 또는 COLLADA.
원칙들
- Node.js 18 또는 이후의 경우
- TypeScript 5.0 또는 이후의 경우
@aspose/3d설치 (보기 단계 1)
단계별 가이드
단계 1 : 설치 @aspose/3d
asposefoss/3d is not yet published — build from source until it ships. See the project README for build instructions.
원주민 추가 또는 시스템 라이브러리가 필요하지 않습니다.이 패키지에는 TypeScript 유형 정의가 포함되어 있습니다.
최소한의 tsconfig.json:
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"moduleResolution": "node",
"esModuleInterop": true,
"strict": true
}
}단계 2: 장면과 노드를 만드는 방법
A 는 Scene 모든 지질은 상단 수준의 컨테이너입니다.모든 지메트리어는 하나에 붙여 있어야합니다. Node 장면 나무 안에 :
import { Scene } from '@aspose/3d';
const scene = new Scene();
const node = scene.rootNode.createChildNode('triangle');createChildNode(name) 이름을 붙인 노드를 만들고 현재 노드의 아기로서 그것을 전달합니다. Node 객체는 단계 7에서 메시지를 붙여 넣을 곳입니다.
단계 3: Mesh Object 만들기
Mesh 위치와 폴리곤 정의를 가지고 있습니다. 선택적 이름으로 하나를 구축 :
import { Mesh } from '@aspose/3d/entities';
const mesh = new Mesh('triangle');잎은 비어있기 시작합니다 : 계단과 얼굴이 없습니다. 다음 단계에서 그들을 추가하십시오.
단계 4 : 컨트롤 포인트를 추가 (위치)
컨트롤 포인트는 지역 공간의 척추 위치입니다. Vector4 가치가 들어오는 mesh.controlPoints.4번째 부분은 (w) 이다 1 위치에 대하여 :
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
당신은 이러한 위치를 0 기반 지수로 참조 할 때 폴리곤 얼굴을 정의합니다.
5단계 : 폴리곤 얼굴을 만드는 방법
createPolygon() 세 개의 지표는 삼각형을 만드는 순서로 좌석 지수를 나열함으로써 얼굴을 정의합니다.:
mesh.createPolygon(0, 1, 2);또한 그들을 지원하는 형식에 대한 쿼드 (4 개의 지표) 또는 자발적인 폴리곤을 정의할 수 있습니다. glTF를 위해 도서관은 자동으로 수출에서 퀘드와 n-gons를 삼각형화합니다.
단계 6 : Vertex 정상을 추가합니다.
정상적인 품질을 향상시키는 순서.사용 mesh.createElement() A를 만들기 위해서 VertexElementNormal, 정상 벡터를 순서대로 수집하고, 그 다음에 전화합니다. setData() 그들을 보관하기 위해서.The data 터는 방어 복사본을 반환합니다 - 그것에 밀어 넣으면 효과가 없습니다. FVector3 (일반 정확도 플로이트) 정상 데이터를 위해, 아니 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 1개는 정상으로 니다. ReferenceMode.DIRECT 데이터 범위는 폴리곤 베르텍스 인덱스에 의해 직접 인코딩됩니다.
단계 7 : 메시지를 붙이고 glTF로 저장합니다.
틈새를 통해 노드에 부여하십시오. node.entity,그리고 그 장면을 저장합니다 :
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');단일 자체 컨테이너를 만들기 위해서 .glb 파일 대신, 설정 saveOpts.binaryMode = true 그리고 출력 파일 확장을 변경하여 .glb.
완전한 예제
다음은 위의 모든 단계를 결합하는 전체 스크립트입니다 :
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');함께 달리기 ts-node:
npx ts-node triangle.ts일반적인 문제들
| 문제 | 원인은 | 고정 |
|---|---|---|
mesh.controlPoints.length 0 후 push | 은 어떤 노드도 언급하지 않는다. | 눌러주기 전에 node.entity;주문은 중요하지 않지만 참조를 확인합니다. |
| 수출은 빈 지질을 생산합니다. | node.entity 부여되지 않음 | 보안 node.entity = mesh 전화를 하기 전에 scene.save() |
| 정상적인 숫자 잘못된 | 아레아가 갔다 setData() 짧은 것보다 controlPoints | 하나 추가하기 FVector3 통제점에 따라 입력할 때 사용하기 MappingMode.CONTROL_POINT |
| glTF 시청자 검은 메시지를 보여줍니다. | 정상적인 내부를 지적하는 방법 | 반대 휘발성 순서의 정리 createPolygon (예를 들어 그., 0, 2, 1정상적인 벡터를 부정하는 것 |
| TypeScript: ’normals.data’ 속성 찾을 수 없습니다 | 잘못된 수입 경로 | 수입 VertexElementNormal 에서부터 @aspose/3d/entities,하지만, 아니에서 @aspose/3d 뿌리 |
자주 묻는 질문들
삼각형 대신에 쿼드를 만들 수 있습니까? 네 개의 지표를 통과하여 createPolygon(0, 1, 2, 3).도서관은 삼각형을 필요로하는 형식으로 수출하는 동안 쿼드를 분류합니다 (glTF, STL).
그 사이의 차이점은 무엇인가 MappingMode.CONTROL_POINT 그리고 MappingMode.POLYGON_VERTEX? CONTROL_POINT 1개의 값을 각각 유일한 베르텍스에 저장합니다. POLYGON_VERTEX 폴리곤-버텍스 커플 당 하나의 가치를 저장하여 여러 롤리건 (단단한 가장자리)에 속할 때 같은 좌석에서 다른 정상을 허용합니다.
STL에 저장하기 전에 을 삼각형해야합니까? No. 도서관은 삼각형을 필요로하는 형식으로 수출 할 때 자동으로 삼위일체를 처리합니다.당신은 메시지에 쿼드와 n-곤을 정의하고 STL에 직접 저장할 수 있습니다.
UV 조율을 어떻게 추가할 수 있습니까? 사용하기 mesh.createElementUV(TextureMapping.Diffuse, MappingMode.CONTROL_POINT, ReferenceMode.DIRECT) A를 만들기 위해서 VertexElementUV,그리고 그 다음에 전화 setData([...]) 그리고 그들의 일련의 FVector2 또는 FVector3 값 - 1 점에 따라 통제점. data 터는 복사본을 반환합니다; 직접 밀어 넣지 마십시오.
한 장면에서 여러 개의 메시지를 만들 수 있습니까? 예. 아래에 여러 노드를 만들기 scene.rootNode 그리고 별도의 분리된 Mesh 각 노드에 대하여 entity 재산을 하는 것.