วิธีแปลงโมเดล 3 มิติใน TypeScript

วิธีแปลงโมเดล 3 มิติใน TypeScript

Aspose.3D FOSS for TypeScript แปลงระหว่างรูปแบบ 3D โดยการโหลดเข้าสู่การแสดงผลกลาง Scene แล้วบันทึกเป็นรูปแบบเป้าหมาย คู่มือนี้แสดงการแปลงที่พบบ่อยที่สุด.

คู่มือแบบขั้นตอนต่อขั้นตอน

ขั้นตอนที่ 1: ติดตั้ง @aspose/3d

npm install @aspose/3d

ขั้นตอนที่ 2: โหลดไฟล์ต้นฉบับ

สร้าง Scene และเรียก scene.open(). ใช้คลาส *LoadOptions ที่เฉพาะรูปแบบเพื่อผลลัพธ์ที่ดีที่สุด.

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

const scene = new Scene();
const opts = new ObjLoadOptions();
opts.enableMaterials = true;
scene.open('model.obj', opts);

ขั้นตอนที่ 3: บันทึกเป็นรูปแบบเป้าหมาย

เรียก scene.save() พร้อมเส้นทางเอาต์พุต รูปแบบเอาต์พุตจะถูกตรวจจับจากส่วนขยายไฟล์.

// OBJ → glTF binary (GLB)
scene.save('output.glb');

// OBJ → STL
scene.save('output.stl');

// OBJ → COLLADA
scene.save('output.dae');

หมายเหตุ: FBX ไม่รองรับ โดยการตรวจจับอัตโนมัติของ scene.save(). ส่วนขยาย .fbx ไม่ได้เชื่อมต่อกับผู้ส่งออกใด ๆ — การบันทึกเป็น .fbx จะเขียนเนื้อหาในรูปแบบ OBJ อย่างเงียบโดยอัตโนมัติ. ใช้ OBJ, glTF, STL, 3MF หรือ COLLADA เพื่อให้ได้ผลลัพธ์ที่เชื่อถือได้.


ขั้นตอนที่ 4: ตัวอย่างการแปลงทั่วไป

OBJ เป็น glTF / GLB

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

const scene = new Scene();
scene.open('model.obj', new ObjLoadOptions());
scene.save('model.glb');
console.log('Converted OBJ → GLB');

FBX — ไม่รองรับ

การตรวจจับอัตโนมัติของ FBX ไม่ได้เชื่อมต่อใน scene.open(). ไฟล์ .fbx ที่ส่งไปยัง scene.open() ไม่ได้รับการจดจำโดยตัวตรวจจับรูปแบบใด ๆ และจะถูกส่งต่อไปยังตัวแยกวิเคราะห์ STL ซึ่งจะล้มเหลวหรือสร้างข้อมูลขยะ. คลาสผู้นำเข้า/ส่งออก FBX มีอยู่ในไลบรารีแต่ต้องเรียกใช้โดยตรงแทนการใช้ API ระดับสูง open()/save(). ใช้ COLLADA, OBJ หรือ glTF เป็นทางเลือกแทน FBX.

glTF เป็น STL

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

const scene = new Scene();
scene.open('model.glb');
scene.save('model.stl');
console.log('Converted GLB → STL');

COLLADA เป็น 3MF

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

const scene = new Scene();
scene.open('model.dae');
scene.save('model.3mf');
console.log('Converted COLLADA → 3MF');

ขั้นตอนที่ 5: แปลงหลายไฟล์เป็นชุด

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

const inputDir = './input';
const outputDir = './output';

fs.mkdirSync(outputDir, { recursive: true });

const objFiles = fs.readdirSync(inputDir).filter(f => f.endsWith('.obj'));

for (const file of objFiles) {
    const inputPath = path.join(inputDir, file);
    const outputFile = file.replace('.obj', '.glb');
    const outputPath = path.join(outputDir, outputFile);

    const scene = new Scene();
    scene.open(inputPath, new ObjLoadOptions());
    scene.save(outputPath);

    console.log(`Converted ${file}${outputFile}`);
}

เมทริกซ์การแปลงที่รองรับ

จาก \ ถึงglTF/GLBOBJSTLFBX3MFCOLLADA
OBJ
glTF/GLB
FBX
STL
3MF
COLLADA

FBX ไม่ได้รับการสนับสนุนผ่าน API ระดับสูง open()/save() — รูปแบบนี้ไม่ได้เชื่อมต่อกับการตรวจจับอัตโนมัติ. เซลล์ FBX ทั้งหมดด้านบนเป็น ✗.


ปัญหาทั่วไปและการแก้ไข

วัสดุหายไปหลังจากการแปลง

วัสดุ OBJ (usemtl, .mtl ไฟล์) จะถูกโหลดเมื่อ ObjLoadOptions.enableMaterials = true. เมื่อบันทึกเป็น glTF, คุณสมบัติวัสดุ PBR จะถูกแมปโดยอัตโนมัติ. วัสดุที่ซับซ้อน (เชิงกระบวนการ, หลายชั้น) อาจแปลงด้วยความแม่นยำที่ลดลง.

เมชแสดงขนาดไม่ถูกต้อง

รูปแบบต่าง ๆ ใช้หน่วยเริ่มต้นที่แตกต่างกัน (มิลลิเมตรสำหรับ STL, เมตรสำหรับ glTF) ใช้ ObjLoadOptions.scale เมื่อโหลดหรือ StlSaveOptions.scaleFactor เมื่อบันทึกเพื่อทำให้หน่วยเป็นมาตรฐาน

ความไม่ตรงกันของระบบพิกัด (โมเดลถูกพลิกหรือหมุน)

บางรูปแบบใช้ Y‑up ด้านขวา, ส่วนอื่นใช้ Z‑up. ใช้ ObjLoadOptions.flipCoordinateSystem = true หรือทำการหมุนโหนดรากหลังจากโหลด.


คำถามที่พบบ่อย

การแปลงจะคงแอนิเมชันไว้หรือไม่?

ข้อมูลการเคลื่อนไหวจะถูกเก็บรักษาไว้เมื่อแปลงระหว่างรูปแบบที่รองรับ (เช่น COLLADA → glTF). STL และ OBJ ไม่ได้บรรจุข้อมูลการเคลื่อนไหว. FBX ไม่ได้รับการสนับสนุนผ่าน scene.open()/scene.save(), ดังนั้นการทำรอบการเคลื่อนไหวของ FBX จึงไม่สามารถทำได้ผ่าน API ระดับสูง.

ข้อมูลพื้นผิวถูกเก็บรักษาไว้หรือไม่?

พื้นผิวที่อ้างอิงโดยวัสดุ OBJ หรือฝังใน glTF จะถูกส่งต่อไปยังกราฟฉาก เมื่อบันทึกเป็น GLB (binaryMode = true) บัฟเฟอร์ไบนารีจะถูกฝังไว้ในไฟล์เดียว สำหรับการส่งออก OBJ พื้นผิวจะถูกบันทึกเป็นไฟล์แยกพร้อมกับ .obj.

ฉันสามารถแปลงไฟล์หลายไฟล์พร้อมกันได้หรือไม่?

scene.open() และ scene.save() เป็น synchronous. ใช้ Node.js worker_threads สำหรับการประมวลผลแบบขนาน.


ดูเพิ่มเติม

 ภาษาไทย