כיצד להמיר מודלים תלת‑ממדיים ב‑TypeScript

כיצד להמיר מודלים תלת‑ממדיים ב‑TypeScript

Aspose.3D FOSS for TypeScript ממיר בין פורמטים תלת‑ממדיים על‑ידי טעינה לייצוג נייטרלי 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() auto-detection. ההרחבה .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 ממופות אוטומטית. חומרים מורכבים (פרוצדורליים, מרובי‑שכבות) עשויים להיות מומרצים עם נאמנות מצומצמת.

Mesh מופיע בקנה מידה שגוי

פורמטים שונים משתמשים ביחידות ברירת מחדל שונות (מילימטרים עבור 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() הם סינכרוניים. השתמשו ב‑Node.js worker_threads לעיבוד מקבילי.


ראה גם

 עברית