TypeScript에서 3D 모델을 다운로드하는 방법

TypeScript에서 3D 모델을 다운로드하는 방법

그들의 @aspose/3d 패키지는 TypeScript 및 Node.js 응용 프로그램에 3D 스크린 파일을 열기위한 간단한 API를 제공합니다. Scene 원본은 ‘Call’입니다. scene.open() 파일 경로와 선택적 인 형식 특정 로드 옵션을 사용하여, 그 다음에 통과 scene.rootNode 지질학, 재료 및 변환에 접근할 수 있습니다.

단계별 가이드

단계 1: npm를 통해 @aspose/3d 설치

프로젝트에 패키지를 추가하십시오.이집 바이너리 또는 플랫폼 특정 구축 도구가 필요하지 않습니다; Node.js 18 이상만.

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

TypeScript 프로젝트의 경우, 타입 정의는 패키지와 결합됩니다 :

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

단계 2: 수입 장면 및 형식 특정 옵션

각 형식은 자신의 로더 클래스와 옵션 항목을 하위 하단 경로에 표시합니다.:

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

다른 형식의 경우 패턴은 동일합니다 :

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

3단계 : scene.open()를 사용하여 3D 파일을 열어보세요.

A를 만드는 것 Scene 예를 들어, 전화 scene.open() 파일 경로와 선택적 인 로드 옵션 개체를 사용합니다.이 전화는 동기화됩니다.

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

A에서 충전하기 위해서 Buffer 이미 메모리 (서비스없이 또는 스트리밍 컨텍스트에서 사용 가능):

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

단계 4 : 장면 노드 위에 흔들리십시오.

장면 그래프는 뿌리 잡힌 나무입니다. scene.rootNode.각각의 Node 어린이 노드와 선택적 인 삽입을 포함 할 수 있습니다. entity (메시, 카메라, 빛 등).

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

5단계: 컨트롤 포인트를 통해 메시지 베르텍 데이터에 액세스

노드의 본질이 하나가 될 때 Mesh, 당신은 원료 제어 포인트 (상표)를 읽을 수 있습니다. controlPoints 각 입구는 A Vector4 와 함께 x, y, z,그리고, 그리고 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)}`);
        }
    }
}

단계 6: 재료 충전을 위한 ObjLoadOptions 설정

ObjLoadOptions - 관련 기능을 통제하여 동반하는 방법에 대한 조언 .mtl 재료 파일 및 텍스트가 해결됩니다.

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

일반적인 문제와 해결책

오류: 모듈 ‘@aspose/3d/formats/obj’을 찾을 수 없습니다. 포맷 하위 경로는 Node.js 12.7+ 패키지 수출을 필요로합니다.Node .js 18 이상에 있는지 확인하십시오.TypeScript를 사용하는 경우, 설정 "moduleResolution": "node16" 또는 "bundler" 안에 있는 tsconfig.json.

녹음하기.rootNode.childNodes는 열기 후에 비어있다() 일부 OBJ 파일은 비 표준 라인 끝을 사용하거나 트레이링 뉴스 라인이 부족합니다.이 파일이 유효한 OBD를 확인하여 텍스트 편집기에서 열립니다. ObjLoadOptions 일반적인 것이 아니고, LoadOptions: 형식 특정 옵션은 올바른 배송을 위해 필요합니다.

컨트롤 포인트 아레이는 0 길이를 가지고 있습니다. 벽돌은 충전되었을 수도 있지만 지질이 포함되지 않습니다 (예를 들어 OBJ에있는 빈 그룹). mesh.polygonCount 이탈리아어를 확인하기 전에 을 확인합니다.

메모리 사용량은 큰 파일에 대 한 높은 부퍼 에서 로드 scene.openFromBuffer() 최대 메모리를 줄이지 않습니다 : 전체 파일이 되어야합니다.대형 파일 (> 100 MB)의 경우 Node.js 프로세스가 충분한 히프를 가지고 있는지 확인하십시오.: node --max-old-space-size=4096 yourScript.js.

유형 오류: ’entity’는 ‘Unknown’의 유류입니다. 그들의 entity 부동산은 널리 사용됩니다.Cast to any 특정 클래스에 대 한 (Mesh, Camera, 등) 당신이 당신의 장면에서 기대하는 것에 따라.

자주 묻는 질문 (FAQ)

어떤 형식으로 scene.open()로 업로드할 수 있나요? OBJ, glTF 2.0 (.gltf + .bin), GLB, STL, 3MF, FBX 및 COLLADA ( .dae) 모두 수입을 위해 지원됩니다. *LoadOptions 각 형식에 대한 클래스.

옵션을 지정하지 않고 파일을 업로드 할 수 있습니까? 예요 ᄒᄒ. scene.open('model.glb') 특수 구성이 필요하지 않은 형식에 대한 옵션이 없기 때문에 OBJ의 통과 택시가 권장됩니다. enableMaterials.

충전은 비동기적으로 진행되는가? 아니오 니. scene.open() 그리고 scene.openFromBuffer() 동기화되어 있습니다.그들을 노동자 스트립에 묶거나 setImmediate 이벤트 루프를 응답해야 하는 경우.

OBJ 수출이 지원되나요? 예. OBJ 수출은 지원됩니다 scene.save('output.obj').□ 그들의 .mtl 파일은 자동으로 옆에 작성됩니다. .obj 파일을 써보세요.

OBJ를 충전할 때 .mtl 파일이 어디에 있나요? 에 따라, 파세르는 그를 찾고 있다. .mtl 에 포함된 파일(mtllib OBJ 파일의 디렉토리에 관한 지침. 두 파일이 동일한 폴더에 있는지 확인합니다.

또한 보기

 한국어