นักพัฒนา Node.js ที่ทำงานกับเนื้อหา 3D มักต้องแปลงระหว่างรูปแบบต่าง ๆ: เครื่องมือออกแบบส่งออก OBJ, ตัวเรนเดอร์บนเว็บต้องการ GLB, เครื่องพิมพ์ 3D ต้องการ STL, และสายการผลิตใช้ 3MF การจัดการการแปลงเหล่านี้ด้วย API เดียวที่สอดคล้องกันช่วยลดจำนวนเครื่องมือภายนอกในสายงานและทำให้ตรรกะการแปลงอยู่ในโค้ดแอปพลิเคชันซึ่งสามารถทดสอบและเวอร์ชันได้.
นี้ @aspose/3d แพคเกจ (v24.12.0, ใบอนุญาต MIT) ให้ API ที่เน้น TypeScript สำหรับการอ่านและเขียนรูปแบบ 3D หลักทั้งหมดใน Node.js คู่มือนี้จะอธิบายขั้นตอนการแปลงที่พบบ่อยที่สุด.
การติดตั้ง
npm install @aspose/3d
ข้อกำหนด: Node.js 18, 20 หรือ 22; TypeScript 5.0 หรือใหม่กว่า การพึ่งพาในเวลารันเดียวคือ xmldom.
รูปแบบที่รองรับ
ตารางด้านล่างแสดงรายการรูปแบบที่ครอบคลุมในคู่มือนี้และการสนับสนุนการอ่าน/เขียนของแต่ละรูปแบบ.
| รูปแบบ | ส่วนขยาย | อ่าน | เขียน | หมายเหตุ |
|---|---|---|---|---|
| Wavefront OBJ | .obj | ใช่ | ใช่ | อ่าน/เขียน .mtl ไฟล์วัสดุ |
| glTF 2.0 (JSON) | .gltf | ใช่ | ใช่ | รูปแบบการส่งเว็บมาตรฐาน |
| glTF 2.0 (ไบนารี) | .glb | ใช่ | ใช่ | เป็นอิสระ, แนะนำสำหรับเว็บ |
| STL (ASCII/Binary) | .stl | ใช่ | ใช่ | รูปแบบการพิมพ์ 3D มาตรฐาน |
| 3MF | .3mf | ใช่ | ใช่ | รูปแบบการผลิตที่มีเมตาดาต้าครบถ้วน |
| FBX | .fbx | ไม่* | ไม่* | มีตัวนำเข้า/ส่งออกอยู่แล้วแต่การตรวจจับรูปแบบอัตโนมัติยังไม่ได้เชื่อมต่อ; ไม่สามารถใช้ผ่าน scene.open() |
| COLLADA | .dae | ใช่ | ใช่ | รูปแบบการแลกเปลี่ยนแบบ XML |
OBJ รองรับการนำเข้าและส่งออกทั้งสองอย่าง โหลดด้วย scene.open() และบันทึกด้วย scene.save('output.obj'), หรือแปลงเป็นรูปแบบที่รองรับอื่น ๆ เช่น glTF, STL, หรือ 3MF.
OBJ ไปยัง GLB (การส่งมอบบนเว็บ)
การแปลง OBJ เป็น binary glTF (GLB) เป็นกระบวนการทำงานบนเว็บที่พบบ่อยที่สุด GLB เป็นแพคเกจไบนารีที่รวมทุกอย่างไว้ในไฟล์เดียว: เทกเจอร์, รูปร่าง, และเมตาดาต้า ซึ่งทำให้การส่งผ่าน HTTP มีประสิทธิภาพและสามารถโหลดโดยตรงด้วย Three.js, Babylon.js, และ model‑viewer.
import { Scene } from '@aspose/3d';
function convertObjToGlb(inputPath: string, outputPath: string): void {
const scene = new Scene();
scene.open(inputPath);
scene.save(outputPath); // extension '.glb' selects binary GLB format
console.log(`Converted ${inputPath} -> ${outputPath}`);
}
convertObjToGlb('model.obj', 'model.glb');
รูปแบบผลลัพธ์จะถูกสรุปจากนามสกุลไฟล์ ใช้ .glb สำหรับ GLB แบบไบนารี หรือ .gltf สำหรับ JSON แยก + .bin เค้าโครง.
OBJ ไปยัง STL (การเตรียมพิมพ์ 3D)
STL เป็นภาษากลางของการพิมพ์ 3D แบบ FDM และ SLA slicer ต่าง ๆ เช่น PrusaSlicer, Bambu Studio, และ Chitubox รองรับ STL ทั้งหมด การแปลงจาก OBJ ไปยัง STL ทำได้ง่ายเนื่องจากทั้งสองรูปแบบเก็บเมชสามเหลี่ยม.
import { Scene } from '@aspose/3d';
function convertObjToStl(inputPath: string, outputPath: string): void {
const scene = new Scene();
scene.open(inputPath);
scene.save(outputPath); // extension '.stl' selects STL format
console.log(`STL written to ${outputPath}`);
}
convertObjToStl('part.obj', 'part.stl');
STL ไม่เก็บข้อมูลสี, วัสดุ หรือ UV หากไฟล์ OBJ ของคุณใช้กลุ่มวัสดุ ข้อมูลนั้นจะถูกตัดออกระหว่างการส่งออก สำหรับรูปแบบการพิมพ์ที่คงสีไว้ ให้พิจารณาใช้ 3MF แทน (ดูด้านล่าง).
STL ไปยัง glTF (สแกนเนอร์และ CAD ไปยังเว็บ)
สแกนเนอร์แบบ structured‑light และตัวส่งออก CAD แบบพารามิเตอร์มักจะส่งออกเป็น STL การแปลงเป็น glTF ทำให้รูปทรงสามารถเข้าถึงได้ในตัวดูบนเว็บและแพลตฟอร์ม AR โดยไม่ต้องมีขั้นตอนการเรนเดอร์บนเซิร์ฟเวอร์.
import { Scene } from '@aspose/3d';
function convertStlToGltf(inputPath: string, outputPath: string): void {
const scene = new Scene();
scene.open(inputPath);
// extension '.gltf' saves as JSON + .bin sidecar
scene.save(outputPath);
console.log(`glTF written to ${outputPath}`);
}
convertStlToGltf('scan_output.stl', 'scan_output.gltf');
เนื่องจาก STL ไม่บรรจุข้อมูลวัสดุหรือเทกเจอร์ ไฟล์ glTF ที่ได้จะมีเพียงรูปทรงเท่านั้น คุณสามารถแนบวัสดุโดยโปรแกรมให้กับโหนดในซีนหลังจากโหลดได้หากต้องการ.
3MF to glTF (Manufacturing to Visualization)
รูปแบบการผลิต 3 มิติ (3MF) กำลังถูกใช้มากขึ้นในกระบวนการผลิตแบบเพิ่มชั้น เนื่องจากมันเก็บข้อมูลสี, วัสดุ, โครงสร้างส่วนประกอบ, และเมตาดาต้าการพิมพ์พร้อมกับเรขาคณิต การแปลง 3MF เป็น glTF ทำให้สามารถแสดงผลต่อเนื่องในเครื่องมือเว็บได้โดยคงโครงสร้างของฉากไว้.
import { Scene } from '@aspose/3d';
function convert3mfToGlb(inputPath: string, outputPath: string): void {
const scene = new Scene();
scene.open(inputPath);
scene.save(outputPath); // extension '.glb' selects binary GLB format
console.log(`3MF -> GLB: ${outputPath}`);
}
convert3mfToGlb('assembly.3mf', 'assembly.glb');
3MF files often contain multi-component assemblies. The scene graph produced by scene.open() รักษาโครงสร้างชั้นของคอมโพเนนต์ใน scene.rootNode.childNodes, ดังนั้นคุณจึงสามารถตรวจสอบหรือจัดการส่วนย่อยแต่ละส่วนก่อนบันทึกได้.
รูปแบบการแปลงเป็นชุด
เมื่อประมวลผลไดเรกทอรีของไฟล์, ห่อหุ้มการแปลงแต่ละรายการใน try/catch เพื่อให้ไฟล์ที่เสียหายเพียงไฟล์เดียวไม่ทำให้การประมวลผลทั้งหมดหยุดทำงาน.
import { Scene } from '@aspose/3d';
import { readdirSync } from 'fs';
import { join, basename, extname } from 'path';
interface ConversionResult {
input: string;
output: string;
success: boolean;
error?: string;
}
function batchConvertToGlb(
inputDir: string,
outputDir: string,
extensions: string[] = ['.obj', '.stl', '.3mf', '.dae'] // .fbx excluded: format auto-detection not wired
): ConversionResult[] {
const results: ConversionResult[] = [];
const files = readdirSync(inputDir).filter((f) =>
extensions.includes(extname(f).toLowerCase())
);
for (const file of files) {
const inputPath = join(inputDir, file);
const outputPath = join(outputDir, basename(file, extname(file)) + '.glb');
try {
const scene = new Scene();
scene.open(inputPath);
scene.save(outputPath); // extension '.glb' infers GLB format
results.push({ input: inputPath, output: outputPath, success: true });
} catch (err) {
const message = err instanceof Error ? err.message : String(err);
results.push({ input: inputPath, output: outputPath, success: false, error: message });
console.error(`Failed to convert ${file}: ${message}`);
}
}
const succeeded = results.filter((r) => r.success).length;
console.log(`Batch complete: ${succeeded}/${results.length} files converted.`);
return results;
}
// Usage
batchConvertToGlb('./input', './output');
รูปแบบข้างต้นอ่านนามสกุลไฟล์ที่รองรับแต่ละรายการจากไดเรกทอรีอินพุต, แปลงเป็น GLB, และบันทึกความล้มเหลวใด ๆ โดยไม่หยุดลูป. อาร์เรย์ที่ส่งกลับของ ConversionResult อ็อบเจกต์สามารถใช้สำหรับการรายงานหรือตรรกะการลองใหม่ได้.
สรุป
@aspose/3d ครอบคลุมความต้องการการแปลงรูปแบบทั้งหมดในแอปพลิเคชัน Node.js TypeScript ด้วย API สองขั้นตอนที่สอดคล้องกัน: scene.open() เพื่อโหลด, scene.save() เพื่อเขียน. ข้อจำกัดสำคัญที่ต้องจำคือว่ามีคลาสนำเข้าและส่งออก FBX อยู่แต่การตรวจจับรูปแบบอัตโนมัติยังไม่ได้เชื่อมต่อ, ดังนั้นไฟล์ FBX ไม่สามารถโหลดผ่าน scene.open().
สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับ Scene, Node, และ Mesh คลาสที่ใช้ในตัวอย่างเหล่านี้, ดูหน้าการอ้างอิงคลาสในเอกสารนี้.