كيفية تحميل النماذج 3D في TypeScript
وَالْمُتَّقِينَ @aspose/3d يمنح الحزمة تطبيق TypeScript و Node.js API بسيط لفتح ملفات المشهد 3D. Scene هو الهدف الجذر: الاتصال scene.open() مع مسار الملفات وخيارات التحميل الاختيارية-محددة النموذج، ثم عبور scene.rootNode الوصول إلى الهندسة والمياه والتحولات.
خطوة بخطوة دليل
الخطوة 1: تثبيت @aspose/3d عبر npm
لا تتطلب أي أدوات بناء بائنية أو منصة محددة؛ فقط Node.js 18 أو بعد ذلك.
asposefoss/3d is not yet published — build from source until it ships. See the project README for build instructions.
بالنسبة لمشاريع TypeScript ، يتم ربط تعريفات النوع بالجمع:
##tsconfig.json: minimum required settings
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"strict": true
}
}الخطوة 2: استيراد المشهد والخيارات المحددة للشكل
كل تنسيق يعرض فئة المحمول الخاصة به والخيارات تحت مسار فرعي.إدخال فقط ما تحتاجه:
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';بالنسبة للفرمات الأخرى ، فإن النموذج هو نفسه:
import { GltfLoadOptions } from '@aspose/3d/formats/gltf';
import { FbxLoadOptions } from '@aspose/3d/formats/fbx';
import { StlLoadOptions } from '@aspose/3d/formats/stl';الخطوة 3: افتح ملف 3D باستخدام scene.open()
خلق أ Scene الحالة، ثم الاتصال scene.open() مع مسار الملف وبديل خيارات الشحن.المكالمة متزامنة.
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const scene = new Scene();
const options = new ObjLoadOptions();
options.enableMaterials = true;
scene.open('model.obj', options);
console.log('Scene loaded successfully');تحميل من A Buffer بالفعل في الذاكرة (مفيدة في سياقات خالية من الخادم أو البث):
import * as fs from 'fs';
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const buffer = fs.readFileSync('model.obj');
const scene = new Scene();
scene.openFromBuffer(buffer, new ObjLoadOptions());الخطوة 4: إزالة العقدة من خلال المشهد
المسرحية هي شجرة مستديرة في scene.rootNode.كل واحد منهم Node يمكن أن تحتوي على أوعية الأطفال و إمكانية الاختيار. entity (الصوت، الكاميرا، الضوء، الخ).
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const scene = new Scene();
scene.open('model.obj', new ObjLoadOptions());
function visitNode(node: any, depth: number = 0): void {
const indent = ' '.repeat(depth);
console.log(`${indent}Node: ${node.name}`);
if (node.entity) {
console.log(`${indent} Entity type: ${node.entity.constructor.name}`);
}
for (const child of node.childNodes) {
visitNode(child, depth + 1);
}
}
visitNode(scene.rootNode);الخطوة 5: الوصول إلى بيانات الورق عبر نقاط التحكم
عندما يكون كيان النود هو Mesh,يمكنك قراءة نقاط التحكم الخام (المتحولات) من controlPoints كل إدخال هو واحد Vector4 مع x, y, z,و ، و w المكونات .
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const scene = new Scene();
scene.open('model.obj', new ObjLoadOptions());
for (const node of scene.rootNode.childNodes) {
if (!node.entity) continue;
const entity = node.entity;
// Check if the entity is a Mesh by duck-typing controlPoints
if ('controlPoints' in entity) {
const mesh = entity as any;
console.log(`Mesh "${node.name}": ${mesh.controlPoints.length} vertices`);
// Print first three vertices
for (let i = 0; i < Math.min(3, mesh.controlPoints.length); i++) {
const v = mesh.controlPoints[i];
console.log(` v[${i}]: x=${v.x.toFixed(4)}, y=${v.y.toFixed(4)}, z=${v.z.toFixed(4)}`);
}
}
}الخطوة 6: إعداد ObjLoadOptions لتشغيل المواد
ObjLoadOptions يظهر الخصائص للسيطرة على كيفية مرافقة .mtl يتم حل المواد والملفات النصية.
import { Scene } from '@aspose/3d';
import { ObjLoadOptions } from '@aspose/3d/formats/obj';
const options = new ObjLoadOptions();
options.enableMaterials = true; // parse .mtl file if present
const scene = new Scene();
scene.open('model.obj', options);
// Inspect materials attached to nodes
for (const node of scene.rootNode.childNodes) {
if (node.material) {
console.log(`Material on "${node.name}": ${node.material.constructor.name}`);
}
}مشكلات و تصحيحات مشتركة
الخطأ: لا يمكن العثور على الوحدة ‘@aspose/3d/formats/obj’ تتطلب أسفل الطرق تنسيق نود.جس 12.7+ صادرات الحزمة.تأكد من أنك على نورد.جيس 18 أو أحدث.إذا كنت تستخدم TypeScript، إعداد "moduleResolution": "node16" أو "bundler" في tsconfig.json.
scena.rootNode.childNodes فارغة بعد فتح() بعض ملفات OBJ تستخدم نهايات خط غير قياسية أو يفتقر إلى خط جديد.تحقق من أن الملف صالحة OBD عن طريق فتحه في محرر نصي. ObjLoadOptions وليس الجينريك LoadOptions: تُطلب خيارات النموذج المحددة لإرسالها بشكل صحيح.
تداول الفوركس لديها صفر طول قد يكون الماسح المحمول ولكن لا يحتوي على الهندسة (على سبيل المثال، مجموعة فارغة في OBJ). mesh.polygonCount فحص قبل إدخال الأقواس.
الذاكرة عالية جداً بالنسبة للملفات الكبيرة تحميل من بوفر مع scene.openFromBuffer() لا يقلل من ذروة الذاكرة: يجب أن يكون الملف بأكمله مرفقًا.للملفات الكبيرة (> 100 ميغابايت) تأكد من أن عملية Node.js لديها ما يكفي من التخزين: node --max-old-space-size=4096 yourScript.js.
الخطأ النوعي: “الشركة” من نوع “غير معروف” وَالْمُتَّقِينَ entity الممتلكات مكتوبة على نطاق واسع.Cast to any أو إلى فئة معينة (Mesh, Camera,، وما إلى ذلك) اعتمادا على ما تتوقعه في المشهد الخاص بك.
الأسئلة المتكررة (FAQ)
ما هي الإصدارات التي يمكن تحميلها مع scene.open()؟? OBJ، glTF 2.0 (.gltf + .bin)، GLB، STL، 3MF، FBX، و COLLADA ( .dae) كلها مدعومة للاستيراد. *LoadOptions فئة لكل شكل.
هل يمكنني تحميل ملف دون تحديد الخيارات؟? نعم . scene.open('model.glb') يعمل دون خيارات للتنسيقات التي لا تتطلب ترتيب خاص.الخيارات المباشرة موصى بها لـ OBJ لأن القرار المادي يعتمد على enableMaterials.
هل يحدث التحميل بشكل غير متزامن؟? لا . scene.open() و scene.openFromBuffer() يُنظر إلى ما هو متزامن، أو يَدْخِل في شريط عمل. setImmediate إذا كنت بحاجة إلى الحفاظ على دورة الأحداث استجابة.
هل يتم دعم الصادرات من OBJ؟? نعم.تدعم تصدير OBJ من خلال scene.save('output.obj').- من .mtl يتم كتابة الملفات تلقائيًا إلى جانب .obj ملف .
أين يتوقع ملف .mtl عند تحميل OBJ؟? وبالتالي فإن المشتري يبحث عن .mtl الملفات التي تم الإشارة إليها داخل OBJ (mtllib اتخاذ إجراءات (التوجيه) فيما يتعلق بملف OBJ. تأكد من أن كلا الملفين في نفس المجلد.