איך למטב מודלים תלת-ממדיים ב-TypeScript

איך למטב מודלים תלת-ממדיים ב-TypeScript

Aspose.3D FOSS עבור TypeScript מספק כמה אסטרטגיות לצמצום גודל קובץ הפלט ולשיפור קצב העיבוד. מדריך זה מכסה בחירת פורמט, הטמעת בינארי, צינורות בזיכרון, ואופטימיזציות ברמת Node.js.

מדריך שלב אחר שלב

שלב 1: בחר את פורמט הפלט הנכון

GLB (binary glTF) מייצר את הפלט הקומפקטי ביותר עם תמיכה טובה בכלים. OBJ הוא מבוסס טקסט וגדול יותר. STL הוא קומפקטי לעבודה עם גאומטריה בלבד.

פורמטגודלכולל חומריםכולל אנימציהשימוש מומלץ
GLBקטןכן (מוטמע)כןאינטרנט, משחקים, החלפה כללית
glTFבינוניכן (נפרד)כןפיתוח, בדיקה
STLקטןלאלא3D printing, geometry-only
OBJגדוללהפריד .mtlלאכלים ישנים, תאימות רחבה
FBXבינונילא*לא*קיים ייבוא/ייצוא אך אינו משולב בזיהוי אוטומטי
3MFקטןכןלאהדפסה תלת‑ממדית מודרנית

שלב 2: ייצא ל‑GLB בינארי

בעת שמירה ל‑GLB, הגדר GltfSaveOptions.binaryMode = true כדי לייצר קובץ בינארי יחיד עצמאי. זה מונע את ה‑ .bin קובץ צדדי ונדרש עבור רוב הצופים בתלת‑ממד:

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

const scene = new Scene();
scene.open('complex-model.obj', new ObjLoadOptions());

const opts = new GltfSaveOptions();
opts.binaryMode = true;

scene.save('optimized.glb', opts);
console.log('Saved compact binary GLB');

שלב 3: השתמש ב‑Buffer I/O לצינורות בזיכרון

בעת עיבוד קבצים בשירות אינטרנט, השתמש ב‑ openFromBuffer ו saveToBuffer כדי למנוע כתיבה למערכת הקבצים:

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

function convertInMemory(inputBuffer: Buffer): Buffer {
    const scene = new Scene();
    scene.openFromBuffer(inputBuffer, new ObjLoadOptions());
    return scene.saveToBuffer('glb');
}

שלב 4: עיבוד קבצים במקבצים באמצעות Worker Threads

עבור משימות המרה גדולות, פזר את העבודה על פני Worker Threads של Node.js כדי להשתמש במספר ליבות CPU:

// worker.ts
import { workerData, parentPort } from 'worker_threads';
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';

const { inputPath, outputPath } = workerData;

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

parentPort?.postMessage({ done: true, output: outputPath });
// main.ts: dispatch files to workers
import { Worker } from 'worker_threads';
import * as fs from 'fs';
import * as path from 'path';

const files = fs.readdirSync('./input').filter(f => f.endsWith('.obj'));

for (const file of files) {
    const inputPath = path.join('./input', file);
    const outputPath = path.join('./output', file.replace('.obj', '.glb'));

    const worker = new Worker('./dist/worker.js', {
        workerData: { inputPath, outputPath }
    });

    worker.on('message', msg => console.log(`Converted: ${msg.output}`));
    worker.on('error', err => console.error(`Error: ${err}`));
}

שלב 5: נטר את הזיכרון עבור מודלים גדולים

עבור קבצים מעל 50 MB, נטר את השימוש בערמת הזיכרון ועבד קבצים ברצף אם הזיכרון מוגבל:

function logMemory(label: string) {
    const used = process.memoryUsage();
    console.log(`[${label}] heapUsed: ${Math.round(used.heapUsed / 1024 / 1024)} MB`);
}

logMemory('before load');
const scene = new Scene();
scene.open('large-model.obj');
logMemory('after load');
scene.save('output.glb');
logMemory('after save');

הגדל את ערמת הזיכרון של Node.js עבור מודלים גדולים מאוד:

node --max-old-space-size=8192 convert.js

שאלות נפוצות

מהו פורמט הפלט הקומפקטי ביותר?

GLB (binary glTF) עם נכסים משולבים מייצר את הפלט הקומפקטי ביותר בקובץ יחיד עבור סצנות עם חומרים וטקסטורות. STL הוא יותר קומפקטי לתוכן של גאומטריה בלבד.

האם @aspose/3d מבצע פישוט רשת או LOD?

לא. הספרייה קוראת וכותבת את הגאומטריה המקורית מבלי לשנות את טופולוגיית הרשת. פישוט רשת (הפחתת קודקודים, יצירת LOD) אינו נתמך.

האם אני יכול להסיר חומרים כדי להפחית את גודל הקובץ?

הגדר ObjSaveOptions.enableMaterials = false כאשר שומרים ל‑OBJ. עבור glTF, כל נתוני החומר תמיד נכללים; השתמשו ב‑STL לפלט של גאומטריה בלבד.


ראה גם

 עברית