특징 및 기능

Aspose.3D FOSS for TypeScript는 로드, 구성 및 3D 씬을 내보내기 위한 MIT 라이선스 Node.js 라이브러리입니다. 완전한 TypeScript 타입 정의와 단일 런타임 종속성 (xmldom), 그리고 6가지 주요 3D 파일 형식을 지원합니다. 이 페이지는 모든 기능 영역에 대한 주요 참고 자료이며 각 영역에 대한 실행 가능한 TypeScript 코드 예제를 포함합니다.

설치 및 설정

단일 명령어로 npm에서 패키지를 설치합니다:

npm install @aspose/3d

이 패키지는 CommonJS를 대상으로 하며 Node.js 18 이상이 필요합니다. 설치 후, 귀하의 tsconfig.json 전체 호환성을 위해 다음 컴파일러 옵션이 포함되어 있는지 확인하십시오:

{
  "compilerOptions": {
    "target": "ES2020",
    "module": "commonjs",
    "moduleResolution": "node",
    "esModuleInterop": true,
    "strict": true
  }
}

주 모듈을 가져옵니다 Scene 클래스를 패키지 루트에서 가져옵니다. 형식별 옵션 클래스는 해당 서브 경로에서 가져옵니다:

import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';

특징 및 기능

포맷 지원

Aspose.3D FOSS for TypeScript는 주요 3D 파일 포맷 6가지를 읽고 쓸 수 있습니다. 로드 시 바이너리 매직 넘버를 기반으로 포맷을 자동 감지하므로, 소스 포맷을 명시적으로 지정할 필요가 없습니다.

포맷읽기쓰기참고사항
OBJ (Wavefront)읽기/쓰기 .mtl 재질; 사용 ObjLoadOptions.enableMaterials 가져오기용
glTF 2.0JSON 텍스트 형식; PBR 재료
GLBBinary glTF; 설정 GltfSaveOptions.binaryMode = true
STL바이너리 및 ASCII; 전체 라운드트립 검증 완료
3MF3D Manufacturing Format with color and material metadata
FBX아니오*아니오*Importer/exporter는 존재하지만 포맷 자동 감지는 연결되지 않았습니다
COLLADA (DAE)단위 스케일링, 기하학, 재질 및 애니메이션 클립

재질이 포함된 OBJ 로드:

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

const scene = new Scene();
const options = new ObjLoadOptions();
options.enableMaterials = true;
options.flipCoordinateSystem = false;
options.scale = 1.0;
options.normalizeNormal = true;
scene.open('model.obj', options);

GLB(바이너리 glTF) 저장:

import { Scene } from '@aspose/3d';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';

const scene = new Scene();
// ... build or load scene content

const opts = new GltfSaveOptions();
opts.binaryMode = true;
scene.save('output.glb', GltfFormat.getInstance(), opts);

씬 그래프

모든 3D 콘텐츠는 트리 형태로 구성됩니다 Node 객체가 루트인 scene.rootNode. 각 노드는 가질 수 있습니다 Entity (a Mesh, Camera, Light, 또는 다른 SceneObject) 및 a Transform 부(parent)에 상대적으로 위치시킵니다.

핵심 씬 그래프 클래스:

  • Scene: 최상위 컨테이너; 보유합니다 rootNodeanimationClips
  • Node: 이름이 지정된 트리 노드와 childNodes, entity, transform, 및 materials
  • Entity: 부착 가능한 객체의 기본 클래스 (Mesh, Camera, Light)
  • SceneObject: 다음과 공유되는 기본 클래스 NodeEntity
  • A3DObject: 다음을 포함하는 루트 기본 클래스 name 및 속성 가방
  • Transform: 로컬 변환, 회전 (Euler 및 Quaternion), 및 스케일

씬 그래프 순회:

import { Scene, Node, Mesh } from '@aspose/3d';

const scene = new Scene();
scene.open('model.obj');

function visit(node: Node, depth: number = 0): void {
  const indent = '  '.repeat(depth);
  console.log(`${indent}Node: ${node.name}`);
  if (node.entity) {
    console.log(`${indent}  Entity: ${node.entity.constructor.name}`);
  }
  for (const child of node.childNodes) {
    visit(child, depth + 1);
  }
}

visit(scene.rootNode);

프로그래밍 방식으로 씬 계층 구조 만들기:

import { Scene, Node } from '@aspose/3d';

const scene = new Scene();
const parent = scene.rootNode.createChildNode('chassis');
const wheel = parent.createChildNode('wheel_fl');
wheel.transform.translation.set(0.9, -0.3, 1.4);

Geometry와 Mesh

Mesh 은 기본 기하학 유형입니다. 다음을 확장합니다 Geometry 및 제어점(정점), 폴리곤 인덱스, 그리고 노멀, UV, 정점 색상을 위한 정점 요소를 노출합니다.

핵심 Geometry 클래스:

  • Mesh: 다음을 포함하는 폴리곤 메쉬 controlPointspolygonCount
  • Geometry: 정점 요소 관리를 포함하는 기본 클래스
  • VertexElementNormal: 정점당 또는 폴리곤-정점당 법선
  • VertexElementUV: 텍스처 좌표(하나 이상의 UV 채널)
  • VertexElementVertexColor: 정점당 색상 데이터
  • MappingMode: 요소 데이터가 폴리곤에 매핑되는 방식을 제어합니다ByControlPoint, ByPolygonVertex, 등)
  • ReferenceMode: 인덱싱 전략을 제어합니다 (Direct, IndexToDirect)
  • VertexElementType: 정점 요소의 의미를 식별합니다
  • TextureMapping: 텍스처 채널 열거

로드된 씬에서 메시 데이터를 읽는 중:

import { Scene, Mesh, VertexElementType } from '@aspose/3d';

const scene = new Scene();
scene.open('model.stl');

for (const node of scene.rootNode.childNodes) {
  if (node.entity instanceof Mesh) {
    const mesh = node.entity as Mesh;
    console.log(`Mesh "${node.name}": ${mesh.controlPoints.length} vertices, ${mesh.polygonCount} polygons`);

    const normals = mesh.getElement(VertexElementType.NORMAL);
    if (normals) {
      console.log(`  Normal mapping: ${normals.mappingMode}`);
    }
  }
}

Material System

Aspose.3D FOSS for TypeScript는 레거시 Phong 셰이딩부터 물리 기반 렌더링까지 전체 범위를 포괄하는 세 가지 재질 유형을 지원합니다:

  • LambertMaterial: 확산 색상 및 주변 색상; 간단한 OBJ/DAE 재질에 매핑됩니다
  • PhongMaterial: 스페큘러 색상, 광택, 방출을 추가합니다; 기본 OBJ 재질 유형
  • PbrMaterial: 물리 기반 거칠기/금속 모델; glTF 2.0 가져오기 및 내보내기에 사용됩니다

로드된 OBJ 씬에서 재질을 읽는 중:

import { Scene, PhongMaterial, LambertMaterial } 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);

for (const node of scene.rootNode.childNodes) {
  for (const mat of node.materials) {
    if (mat instanceof PhongMaterial) {
      const phong = mat as PhongMaterial;
      console.log(`  Phong: diffuse=${JSON.stringify(phong.diffuseColor)}, shininess=${phong.shininess}`);
    } else if (mat instanceof LambertMaterial) {
      console.log(`  Lambert: diffuse=${JSON.stringify((mat as LambertMaterial).diffuseColor)}`);
    }
  }
}

glTF 씬을 구축할 때 PBR 재질을 적용하는 중:

import { Scene, Node, PbrMaterial } from '@aspose/3d';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';

const scene = new Scene();
const node = scene.rootNode.createChildNode('sphere');
const mat = new PbrMaterial();
mat.albedo = new Vector3(0.8, 0.2, 0.2);   // albedo starts null, must assign
mat.metallicFactor = 0.0;
mat.roughnessFactor = 0.5;
node.material = mat;

const opts = new GltfSaveOptions();
opts.binaryMode = false;
scene.save('output.gltf', GltfFormat.getInstance(), opts);

수학 유틸리티

이 라이브러리는 완전한 3D 수학 타입 세트를 제공하며, 모두 완전하게 타입이 지정되어 있습니다:

  • Vector3: 3요소 벡터; 지원 add, subtract, scale, dot, cross, normalize, length
  • Vector4: 동차 좌표용 4요소 벡터
  • Matrix4: 4×4 변환 행렬과 multiply, invert, transpose, decompose
  • Quaternion: 회전 쿼터니언과 fromEulerAngles, toEulerAngles, slerp, normalize
  • BoundingBox: 축 정렬 경계 상자와 min, max, center, size, merge
  • FVector3: 단정밀도 변형 Vector3 정점 요소 데이터에 사용됨

메쉬 정점으로부터 경계 상자를 계산하기:

import { Scene, Mesh, Vector3, BoundingBox } from '@aspose/3d';

const scene = new Scene();
scene.open('model.obj');

let box = new BoundingBox();
for (const node of scene.rootNode.childNodes) {
  if (node.entity instanceof Mesh) {
    for (const pt of (node.entity as Mesh).controlPoints) {
      box.merge(new Vector3(pt.x, pt.y, pt.z));
    }
  }
}
console.log('Center:', box.center);
console.log('Extents:', box.size);

Euler 각으로부터 변환 행렬 만들기:

import { Quaternion, Vector3, Matrix4 } from '@aspose/3d';

const rot = Quaternion.fromEulerAngle(0, Math.PI / 4, 0); // 45° around Y
const mat = new Matrix4();
mat.setTRS(new Vector3(0, 0, 0), rot, new Vector3(1, 1, 1));

애니메이션 시스템

애니메이션 API는 클립, 노드, 채널 및 키프레임 시퀀스를 모델링합니다:

  • AnimationClip: 이름이 지정된 애니메이션 노드 컬렉션; 에 의해 접근 scene.animationClips
  • AnimationNode: 클립을 이름으로 씬 노드에 바인딩합니다
  • AnimationChannel: 애니메이션 노드 내의 특정 속성(예: translation X)을 대상으로 합니다
  • KeyFrame: 단일 시간/값 쌍
  • KeyframeSequence: 정렬된 목록 KeyFrame : 다음과 같은 객체 Interpolation 그리고 Extrapolation 설정
  • Interpolation: 키프레임 보간 모드: Linear, Constant, Cubic
  • Extrapolation: 키프레임 범위 전후의 동작: Constant, Cycle, Mirror

로드된 씬에서 애니메이션 데이터를 읽기:

import { Scene, AnimationClip, KeyframeSequence } from '@aspose/3d';

const scene = new Scene();
scene.open('animated.fbx');

for (const clip of scene.animationClips) {
  console.log(`Clip: "${clip.name}"`);
  for (const animNode of clip.nodes) {
    console.log(`  Node: ${animNode.name}`);
    for (const channel of animNode.channels) {
      const seq: KeyframeSequence = channel.keyframeSequence;
      console.log(`    Channel "${channel.name}": ${seq.keyFrames.length} keyframes`);
      console.log(`    Interpolation: ${seq.interpolation}`);
    }
  }
}

스트림 및 버퍼 지원

사용 scene.openFromBuffer() 를 사용하여 메모리 내에서 직접 3D 씬을 로드합니다 Buffer. 이것은 서버리스 함수, 스트리밍 파이프라인, 그리고 디스크에 쓰지 않고 HTTP를 통해 가져온 에셋을 처리할 때 권장되는 패턴입니다.

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

// Load file into memory, then parse from buffer
const buffer: Buffer = fs.readFileSync('model.obj');
const scene = new Scene();
const options = new ObjLoadOptions();
options.enableMaterials = true;
scene.openFromBuffer(buffer, options);

for (const node of scene.rootNode.childNodes) {
  if (node.entity) {
    console.log(node.name, node.entity.constructor.name);
  }
}

버퍼에서 로드할 때 바이너리 매직 넘버를 통한 형식 자동 감지가 적용되므로, GLB, STL 바이너리 및 3MF 파일을 형식 매개변수를 지정하지 않아도 인식됩니다.

사용 예시

예제 1: OBJ 로드 및 GLB로 내보내기

이 예제는 재질이 포함된 Wavefront OBJ 파일을 로드한 뒤, 장면을 웹 및 게임 엔진에서 사용하기 적합한 바이너리 glTF (GLB) 파일로 다시 내보냅니다.

import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';

function convertObjToGlb(inputPath: string, outputPath: string): void {
  const scene = new Scene();

  const loadOpts = new ObjLoadOptions();
  loadOpts.enableMaterials = true;
  loadOpts.flipCoordinateSystem = false;
  loadOpts.normalizeNormal = true;
  scene.open(inputPath, loadOpts);

  // Report what was loaded
  for (const node of scene.rootNode.childNodes) {
    if (node.entity) {
      console.log(`Loaded: ${node.name} (${node.entity.constructor.name})`);
    }
  }

  const saveOpts = new GltfSaveOptions();
  saveOpts.binaryMode = true; // write .glb instead of .gltf + .bin
  scene.save(outputPath, GltfFormat.getInstance(), saveOpts);

  console.log(`Exported GLB to: ${outputPath}`);
}

convertObjToGlb('input.obj', 'output.glb');

예제 2: 노멀 검증이 포함된 STL 라운드트립

이 예제는 바이너리 STL 파일을 로드하고, 정점당 노멀 정보를 출력한 뒤, 장면을 ASCII STL로 다시 내보내고 라운드트립을 검증합니다.

import { Scene, Mesh, VertexElementNormal, VertexElementType } from '@aspose/3d';
import { StlLoadOptions, StlSaveOptions } from '@aspose/3d/formats/stl';

const scene = new Scene();
const loadOpts = new StlLoadOptions();
scene.open('model.stl', loadOpts);

let totalPolygons = 0;
for (const node of scene.rootNode.childNodes) {
  if (node.entity instanceof Mesh) {
    const mesh = node.entity as Mesh;
    totalPolygons += mesh.polygonCount;

    const normElem = mesh.getElement(VertexElementType.NORMAL) as VertexElementNormal | null;
    if (normElem) {
      console.log(`  Normals: ${normElem.data.length} entries, mapping=${normElem.mappingMode}`);
    }
  }
}
console.log(`Total polygons: ${totalPolygons}`);

// Re-export as ASCII STL
const saveOpts = new StlSaveOptions();
saveOpts.binaryMode = false; // ASCII output
scene.save('output_ascii.stl', saveOpts);

예제 3: 프로그래밍 방식으로 장면을 구축하고 glTF로 저장하기

이 예제는 처음부터 PBR 재질을 사용해 장면을 구성하고, 이를 JSON glTF 파일로 저장합니다.

import { Scene, Mesh, PbrMaterial, Vector4 } from '@aspose/3d';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';

const scene = new Scene();
const node = scene.rootNode.createChildNode('floor');

// Build a simple quad mesh (two triangles)
// controlPoints are Vector4 (x, y, z, w) where w=1 for positions
const mesh = new Mesh();
mesh.controlPoints.push(
  new Vector4(-1, 0, -1, 1),
  new Vector4( 1, 0, -1, 1),
  new Vector4( 1, 0,  1, 1),
  new Vector4(-1, 0,  1, 1),
);
mesh.createPolygon([0, 1, 2]);
mesh.createPolygon([0, 2, 3]);
node.entity = mesh;

// Apply a PBR material
const mat = new PbrMaterial();
mat.albedo = new Vector3(0.6, 0.6, 0.6);   // albedo starts null, must assign
mat.metallicFactor = 0.0;
mat.roughnessFactor = 0.8;
node.material = mat;

// Save as JSON glTF
const opts = new GltfSaveOptions();
opts.binaryMode = false;
scene.save('floor.gltf', GltfFormat.getInstance(), opts);
console.log('Scene written to floor.gltf');

팁 및 모범 사례

  • 사용 ObjLoadOptions.enableMaterials = true .mtl 파일에서 재질 데이터를 필요로 할 때마다 사용합니다. 이를 사용하지 않으면 각 노드의 재질 목록이 비게 됩니다.
  • 선호 binaryMode = true GLB용 웹 또는 게임 엔진용 에셋을 제작할 때 사용합니다. 바이너리 GLB는 단일 독립 파일이며 JSON + .bin 분할보다 브라우저와 엔진에서 더 빠르게 로드됩니다.
  • 사용 openFromBuffer() 서버리스 환경에서 임시 파일 I/O를 피하기 위해 사용합니다. 에셋을 가져와서, 전달하고 Buffer 직접 전달하고, 출력을 스트림이나 다른 버퍼에 씁니다.
  • 확인 node.entity 캐스팅하기 전에: 모든 노드가 엔터티를 가지고 있는 것은 아닙니다. 항상 …와 함께 보호하십시오 instanceof 접근하기 전에 확인 Mesh특정 속성 예: controlPoints.
  • 설정 normalizeNormal = true 에서 ObjLoadOptions 소스 OBJ 파일이 신뢰할 수 없는 출처에서 올 경우. 이는 퇴화된 노멀(Normal)이 하위 렌더링 또는 검증 단계로 전파되는 것을 방지합니다.
  • 유지 strict: true tsconfig.json에: 라이브러리는 다음으로 작성되었습니다 noImplicitAnystrictNullChecks.비활성화 strict 실제 타입 오류를 가리고, 타입이 지정된 API의 가치를 무력화합니다.
  • 다음으로 순회 childNodes, 인덱스 루프가 아니라: 그 childNodes 속성은 iterable을 반환합니다; 앞으로의 호환성을 위해 숫자 인덱싱에 의존하지 마세요.

일반적인 문제

증상가능한 원인수정
OBJ 로드 후 재질 목록이 비어 있음enableMaterials 설정되지 않음설정 options.enableMaterials = true
GLB 파일에 별도의 .bin 사이드카가 포함되어 있습니다binaryMode 기본값으로 false설정 opts.binaryMode = true
STL 출력에 정점 법선이 누락되었습니다STL ASCII 모드가 면당 법선을 생략합니다전환 binaryMode = true 또는 내보내기 전에 법선을 계산합니다
node.entity 항상 null탐색만 rootNode, 자식은 제외재귀적으로 들어갑니다 node.childNodes
TypeScript 오류: 속성이 존재하지 않습니다이전 @types 캐시실행 npm install @aspose/3d 다시; 별도 없음 @types 패키지가 필요합니다
openFromBuffer format 오류를 발생시킵니다매직으로부터 Format을 자동 감지할 수 없습니다두 번째 인수로 명시적인 format 옵션 클래스를 전달하세요

자주 묻는 질문

이 라이브러리는 네이티브 애드온이나 시스템 패키지가 필요합니까? 아니요. Aspose.3D FOSS for TypeScript는 단일 런타임 의존성이 있습니다: xmldom, 이는 순수 JavaScript이며 npm에 의해 자동으로 설치됩니다. 없습니다 .node 네이티브 애드온이 없으며 설치할 시스템 패키지도 없습니다.

지원되는 Node.js 버전은 무엇입니까? Node.js 18, 20, 22 LTS를 지원합니다. 이 라이브러리는 CommonJS 출력을 목표로 하며 내부적으로 ES2020 언어 기능을 사용합니다.

브라우저 번들(webpack/esbuild)에서 이 라이브러리를 사용할 수 있나요? 이 라이브러리는 Node.js를 목표로 하며 Node.js fsBuffer API를 사용합니다. 브라우저 번들은 공식적으로 지원되지 않습니다. 브라우저에서 사용하려면, 서버 측에서 씬을 로드하고 결과를(예: GLB 형식으로) 클라이언트에 전송하십시오.

다음 사이의 차이점은 무엇입니까 GltfSaveOptions.binaryMode = truefalse? binaryMode = false.gltf JSON 파일과 별도의 .bin 바이너리 버퍼 사이드카를 생성합니다. binaryMode = true 는 단일 자체 포함형을 생성합니다. .glb 파일. 사용 true 프로덕션 자산 전달을 위해.

디스크에 저장하지 않고 HTTP 응답에서 파일을 로드할 수 있나요? 예. 응답을 ~로 가져옵니다 Buffer (예: 사용 node-fetch 또는 내장된 fetch Node 18+에서), 호출하십시오 scene.openFromBuffer(buffer, options).

FBX 지원이 완전합니까? FBX 읽기 및 쓰기는 씬 계층 구조, 메시 및 기하 데이터, 애니메이션 클립, 그리고 재질에 대해 지원됩니다. 내장된 미디어가 포함된 매우 복잡한 FBX 파일은 부분적인 결과를 생성할 수 있으므로, 사용 중인 특정 에셋 컬렉션으로 테스트하십시오.

이 라이브러리는 TypeScript 4.x를 지원합니까? TypeScript 5.0 이상을 권장합니다. TypeScript 4.7 이상도 실제로 작동하지만, 이 라이브러리는 5.0 이상을 기준으로 테스트 및 작성되었습니다.

API 레퍼런스 요약

클래스모듈목적
Scene@aspose/3d최상위 씬 컨테이너; open(), openFromBuffer(), save(), rootNode, animationClips
Node@aspose/3d씬 그래프 노드; childNodes, entity, transform, materials, createChildNode()
Entity@aspose/3d씬에 부착 가능한 객체를 위한 기본 클래스
SceneObject@aspose/3d다음이 공유하는 기본 클래스 NodeEntity
A3DObject@aspose/3d다음과 함께하는 루트 기본 name 및 속성 가방
Transform@aspose/3d로컬 변환, 회전 및 스케일
Mesh@aspose/3d폴리곤 메시; controlPoints, polygonCount, createPolygon(), 정점 요소
Geometry@aspose/3d지오메트리 유형에 대한 기본 클래스
Camera@aspose/3d시야각 및 투영 설정이 포함된 카메라 엔터티
Light@aspose/3d조명 엔터티(포인트, 방향성, 스팟)
LambertMaterial@aspose/3d디퓨즈 + 앰비언트 셰이딩 모델
PhongMaterial@aspose/3d스페큘러와 방사성을 포함한 Phong 셰이딩
PbrMaterial@aspose/3dglTF용 물리 기반 거칠기/금속성 모델
Vector3@aspose/3d3-component double-precision vector
Vector4@aspose/3d4-component vector for homogeneous math
Matrix4@aspose/3d4×4 transformation matrix
Quaternion@aspose/3d회전 쿼터니언
BoundingBox@aspose/3d축 정렬 경계 상자
FVector3@aspose/3d단정밀도 변형 Vector3
VertexElementNormal@aspose/3d정점당 또는 폴리곤-정점당 노멀
VertexElementUV@aspose/3d텍스처 좌표 정점 요소
VertexElementVertexColor@aspose/3d정점당 색상 정점 요소
MappingMode@aspose/3d열거형: CONTROL_POINT, POLYGON_VERTEX, POLYGON, ALL_SAME
ReferenceMode@aspose/3d열거형: Direct, IndexToDirect
AnimationClip@aspose/3d명명된 애니메이션; 포함 AnimationNode 목록
AnimationNode@aspose/3d클립을 씬 노드에 바인드합니다; 포함 AnimationChannel 목록
AnimationChannel@aspose/3d속성을 대상으로 합니다; 보유 KeyframeSequence
KeyFrame@aspose/3d단일 시간/값 키프레임 쌍
KeyframeSequence@aspose/3d보간 및 외삽이 포함된 정렬된 키프레임 목록
Interpolation@aspose/3dEnum: Linear, Constant, Cubic
Extrapolation@aspose/3dEnum: Constant, Cycle, Mirror
ObjLoadOptions@aspose/3d/formats/objOBJ 가져오기 옵션: enableMaterials, flipCoordinateSystem, scale, normalizeNormal
GltfSaveOptions@aspose/3d/formats/gltfglTF/GLB 내보내기 옵션: binaryMode
GltfFormat@aspose/3d/formats/gltfglTF/GLB용 포맷 인스턴스; 전달 대상 scene.save()
StlLoadOptions@aspose/3d/formats/stlSTL 가져오기 옵션
StlSaveOptions@aspose/3d/formats/stlSTL 내보내기 옵션: binaryMode
StlImporter@aspose/3d/formats/stl저수준 STL 리더
StlExporter@aspose/3d/formats/stl저수준 STL 라이터
 한국어