كيفية تصدير المشاهد 3D إلى glTF/GLB في TypeScript

كيفية تصدير المشاهد 3D إلى glTF/GLB في TypeScript

يدعم Aspose.3D FOSS glTF 2.0 كشكل من أشكال الواردات والتصدير. Scene يمكن أن يتم تسجيل الكائن من ملف OBJ أو FBX أو STL أو أي ملفات مصدر أخرى ثم يكتب إلى .gltf (JSON + الثنائي الخارجي) أو .glb (حوض ثنائي واحد) عن طريق وضع علم واحد على GltfSaveOptions.

خطوة بخطوة دليل

الخطوة 1: تثبيت @aspose/3d

asposefoss/3d is not yet published — build from source until it ships. See the project README for build instructions.

تأكيد Node.js 18 أو أحدث نشط:

node --version   # must be >= 16.0.0

الخطوة 2: استيراد المشهد، GltfSaveOptions، و GlTfFormat

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

GltfFormat هل تم نقل وصف النموذج إلى scene.save(). GltfSaveOptions يضع كل إعدادات التصدير.

إذا كنت تقوم أيضًا بتحميل ملف المصدر (على سبيل المثال، OBJ)، قم بإدخال خيارات التحميل المقابلة:

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

الخطوة 3: بناء أو تحميل مشهد

الخيار A: تحميل من ملف موجود (OBJ → GLB التحويل):

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

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

الخيار B: بناء الحد الأدنى من المشهد برمجة:

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

const scene = new Scene();
const childNode = new Node('cube');
scene.rootNode.addChildNode(childNode);
// Attach geometry to childNode as needed

الخطوة 4: إعداد GltfSaveOptions

GltfSaveOptions يسيطر على تنسيق النتيجة وتشفير التفاصيل.

const saveOpts = new GltfSaveOptions();

// Set to true for a single binary .glb file
// Set to false (default) for JSON .gltf + separate .bin
saveOpts.binaryMode = true;

خيارات إضافية يمكنك تعيينها:

الممتلكاتنوعالافتراضيةتأثير
binaryModebooleanfalsetrue → GLB, false جليس JSON
flipTexCoordVbooleantrueمحور UV عمودي Flip لمتوافق مع المحرك

الخطوة 5: حفظ باستخدام scene.save()

من خلال مسار الخروج، و GltfFormat وصف، والخيارات المعدلة:

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

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

const saveOpts = new GltfSaveOptions();
saveOpts.binaryMode = true;   // produce .glb

scene.save('output.glb', GltfFormat.getInstance(), saveOpts);
console.log('Converted to GLB successfully');

لإنتاج JSON .gltf الملف بدلاً من ذلك:

saveOpts.binaryMode = false;
scene.save('output.gltf', GltfFormat.getInstance(), saveOpts);
console.log('Exported to glTF JSON successfully');

الخطوة 6: تحقق من ملف الناتج

تأكد من أن ملف الإخراج موجود ولديه حجم غير صفر:

import * as fs from 'fs';

const outputPath = 'output.glb';
const stats = fs.statSync(outputPath);
console.log(`Output file size: ${stats.size} bytes`);

if (stats.size === 0) {
    throw new Error('Export produced an empty file: check scene content');
}

للحصول على التحقق من الدوران، قم بإعادة تحميل GLB والتحقق في عدد النقاط:

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

const verify = new Scene();
verify.open('output.glb', new GltfLoadOptions());

let nodeCount = 0;
function countNodes(node: any): void {
    nodeCount++;
    for (const child of node.childNodes) countNodes(child);
}
countNodes(verify.rootNode);

console.log(`Round-trip verification: ${nodeCount} node(s) in output`);

مشكلات و تصحيحات مشتركة

ملف المواد OBJ غير موجود بعد التصدير عندما ينقذ إلى OBJ عبر scene.save('output.obj'),وَالْمُسْلِمِينَ .mtl الملفات مكتوبة جنبا إلى جنب مع .obj تأكد من أن دليل الناتج قابل للكتابة وأن كلا الملفين يتم الاحتفاظ بهما معا.

النتيجة .glb أصغر من المتوقع / المراسلات مفقودة إذا كان المشهد المحمول يحتوي على عقدة بدون كيانات (على سبيل المثال، مجموعات فارغة من OBJ)، فإن GLB لن تحتوي إلى هندسة تلك العقدة. mesh.controlPoints.length > 0 قبل أن ينقذ.

لا يمكن العثور على الوحدة ‘@aspose/3d/formats/gltf’ تأكد من أنك على Node.js 18+ و هذا هو @aspose/3d يتم تثبيتها في نفس node_modules كأنه نقطة انطلاق.ركض npm ls @aspose/3d تأكيد النسخة هي 24.12.0 أو أحدث.

GtfFormat.getInstance() يعود غير محدد هذا يشير إلى نسخة غير متوافقة بين الرئيسي @aspose/3d حزمة ونسخة قديمة مخفية.حذف node_modules و package-lock.json,ثم يهرب npm install مرة أخرى .

النسيج يفتقر إلى الإنتاج GLB ضمان binaryMode = true يتم تعيينها لإنتاج GLB ذاتية الحاوية.لإخراج glTF JSON، يجب أن تكون ملفات الصورة النسيج موجودة بجانب ملف الإخطار لأنها مرجعية عن طريق المسار النسبي.

خطأ النوع: لا يمكن تخصيص حجة من نوع “GltfSaveOptions” تأكد من كلاهما Scene و GltfSaveOptions يتم استيرادها من نفس المثال المدمج.المثبتات المختلطة (العالمية + المحلية) يمكن أن تسبب اختلالات في الواجهة.

الأسئلة المتكررة (FAQ)

ما الفرق بين GLTF و GLB؟? ألفا 2 (.gltf) تخزين الرسم البياني للمشهد كملف JSON القابل للقراءة للإنسان مع منفصلة .bin أضف تعليق حول: WEB (.glb- إدراج كل شيء في حاوية ثنائية واحدة. binaryMode = true من أجل GLB،, false لـ JSON GLTF.

هل يمكنني تصدير مشهد تم إنشاؤه بالكامل في الرمز (لا ملف المصدر)؟? نعم، خلق A Scene,إضافة Node الأجسام، المرفقة Mesh أو غيرها من الكيانات، ثم الاتصال scene.save().لا تحتاج المشهد إلى أن يأتي من ملف محمول.

هل تعتبر شركة GSTF خالية من الخسائر؟? بالنسبة للجيومترية والتحولات، نعم. يتم خريطة المواد إلى خصائص المادة GLTF PBR حيثما كان ذلك ممكنا. يمكن أن لا توجد امتدادات مادة FBX الخاصة بالدوران بشكل مثالي.

هل يمكنني تصديرها إلى STL أو 3MF بدلاً من ذلك؟? نعم: النموذج هو نفسه؛ استيراد النمط المقابل *SaveOptions و *Format.getInstance():

import { StlSaveOptions, StlFormat } from '@aspose/3d/formats/stl';
const opts = new StlSaveOptions();
scene.save('output.stl', StlFormat.getInstance(), opts);

هل يُنقل موقع “السباحة” بشكل غير متزامن؟? لا . scene.save() يُنظّم في شريط العمال إذا كنت بحاجة إلى تجنب حجب الحدث أثناء الصادرات الكبيرة.

ما هي الإصدارات التي تدعمها Node.js؟? Node.js 18، 20، و 22+ لا يتم دعم NODE.Js 16 أو السابق.

انظر أيضا

 العربية