العمل مع المسرحية الرسوم البيانية
جميع المحتوى 3D في Aspose.3D FOSS for TypeScript يعيش داخل Scene وَمِنْهُمْ مَا يَتَوَلَّى كَالشَّجَرِ الْأَعْلَى Node فهم هذه الهرمات هي الأساس لبناء وتحميل ومعالجة أي ملف 3D.
التثبيت
قم بتثبيت الحزمة من npm قبل تشغيل أي من الرمز في هذا الدليل:
asposefoss/3d is not yet published — build from source until it ships. See the project README for build instructions.تأكد من أنك tsconfig.json بما في ذلك "module": "commonjs" و "moduleResolution": "node" لتوفير التصحيح الصحيح للطريق السفلي.
مشاهدة فيلم Graph Concepts
يحتوي الرسم البياني على ثلاثة أرباع:
| طائر | الفصول الدراسية | دور |
|---|---|---|
| المشهد | Scene | الحاوية العليا - حوض rootNode, animationClips,و ، و assetInfo. |
| نودا | Node | يمكن أن يكون لديك عقدة الطفل، وكيان، وتحويل، والمواد. |
| الكيانات | Mesh, Camera, Light, … | المحتوى المرفق إلى عقدة.النقطة تحمل على كمية واحدة على الأقل من الكيانات. |
سلسلة التراث للكتل الرئيسية هي:
A3DObject
└─ SceneObject
├─ Node (tree structure)
└─ Entity
└─ Geometry
└─ Mesh (polygon geometry)scene.rootNode لا تخلقها يدوياً، بل تقوم بإنشاء عقدة أطفال تحتها.
الخطوة الأولى: إنشاء مشهد
import { Scene } from '@aspose/3d';
const scene = new Scene();
console.log(scene.rootNode.name); // '' (empty string — the root node is created with no name)
و جديد Scene يبدأ مع عقدة جذر فارغة وليس هناك مقاطع الرسوم المتحركة. يمكنك إنشاء المحتوى عن طريق ربط عقدات الطفل.
الخطوة 2: إضافة أظافر الأطفال
استخدام createChildNode() - أن يزرع الشجرة، والطريقة تعيد الطريق الجديد. Node,يمكنك إرسال مكالمات أخرى من أي مستوى:
import { Scene } from '@aspose/3d';
const scene = new Scene();
const parent = scene.rootNode.createChildNode('parent');
const child = parent.createChildNode('child');
console.log(scene.rootNode.childNodes.length); // 1 (parent)
console.log(parent.childNodes.length); // 1 (child)
أسماء النقاط هي صفوف عشوائية. الأسماء لا تحتاج إلى أن تكون فريدة من نوعها، ولكن استخدام أسماك ذات مغزى يجعل رمز عبر أسهل في التفريغ.
الخطوة 3: إنشاء مقلاة وإعداد الأقواس
Mesh هو الطبقة الجيومترية الأولية.إضافة مواقع العمود الفقري عن طريق الضغط على Vector4 القيم داخل mesh.controlPoints,ثم اتصل createPolygon() تحديد الوجوه حسب مؤشر Vertex:
import { Scene } from '@aspose/3d';
import { Mesh } from '@aspose/3d/entities';
import { Vector4 } from '@aspose/3d/utilities';
const scene = new Scene();
const child = scene.rootNode.createChildNode('parent').createChildNode('child');
const mesh = new Mesh('cube');
mesh.controlPoints.push(new Vector4(0, 0, 0, 1));
mesh.controlPoints.push(new Vector4(1, 0, 0, 1));
mesh.controlPoints.push(new Vector4(1, 1, 0, 1));
mesh.controlPoints.push(new Vector4(0, 1, 0, 1));
mesh.createPolygon(0, 1, 2, 3); // quad face using all four vertices
child.entity = mesh;
console.log(mesh.controlPoints.length); // 4
console.log(mesh.polygonCount); // 1
Vector4 وتستخدم المنسوجات المتطابقة: w المكون هو 1 من أجل المواقف و 0 من أجل الويكتيرات.
الخطوة 4: إعداد تحويلات النود
كل عقدة لديها transform الممتلكات مع translation, rotation,و ، و scaling.- Set translation - تحريك العقد فيما يتعلق بوالدها:
import { Scene } from '@aspose/3d';
import { Mesh } from '@aspose/3d/entities';
import { Vector4, Vector3 } from '@aspose/3d/utilities';
const scene = new Scene();
const parent = scene.rootNode.createChildNode('parent');
const child = parent.createChildNode('child');
const mesh = new Mesh('cube');
mesh.controlPoints.push(new Vector4(0, 0, 0, 1));
mesh.controlPoints.push(new Vector4(1, 0, 0, 1));
mesh.controlPoints.push(new Vector4(1, 1, 0, 1));
mesh.controlPoints.push(new Vector4(0, 1, 0, 1));
mesh.createPolygon(0, 1, 2, 3);
child.entity = mesh;
child.transform.translation = new Vector3(2.0, 0.0, 0.0);globalTransform يقدم المصفوفة التحويلية عالم الفضاء (قراءة فقط) ، محسوبة عن طريق إخفاء جميع تحولات الأجداد.
الخطوة الخامسة: اجتياز الشجرة
اكتب وظيفة تجد لزيارة كل عقدة.تحقق من node.entity و node.childNodes على كل مستوى :
function traverse(node: any, depth = 0): void {
const indent = ' '.repeat(depth);
const entityType = node.entity ? node.entity.constructor.name : 'none';
console.log(`${indent}${node.name} [${entityType}]`);
for (const child of node.childNodes) {
traverse(child, depth + 1);
}
}
traverse(scene.rootNode);بالنسبة للهيارقة التي تم إنشاؤها أعلاه ، فإن النتيجة ستكون:
[none]
parent [none]
child [Mesh]اسم العقد الجذر هو سلك فارغ لأنه Scene وخلقها بدون اسم.
يحفظ دائمًا الوصول إلى الكيان مع فحص صفر قبل إلقاء القبض على نوع محدد.لا تحمل كل عقدة كيان.
الخطوة 6: حفظ إلى glTF أو GLB
استخدام GltfSaveOptions التحكم في تنسيق النتيجة.إعداد binaryMode = true إنتاج واحد من المحتويات الذاتية .glb الملف؛ اتركه false من أجل JSON .gltf + .bin الجانب الثاني :
import { Scene } from '@aspose/3d';
import { Mesh } from '@aspose/3d/entities';
import { Vector4, Vector3 } from '@aspose/3d/utilities';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';
const scene = new Scene();
const parent = scene.rootNode.createChildNode('parent');
const child = parent.createChildNode('child');
const mesh = new Mesh('cube');
mesh.controlPoints.push(new Vector4(0, 0, 0, 1));
mesh.controlPoints.push(new Vector4(1, 0, 0, 1));
mesh.controlPoints.push(new Vector4(1, 1, 0, 1));
mesh.controlPoints.push(new Vector4(0, 1, 0, 1));
mesh.createPolygon(0, 1, 2, 3);
child.entity = mesh;
child.transform.translation = new Vector3(2.0, 0.0, 0.0);
const saveOpts = new GltfSaveOptions();
saveOpts.binaryMode = true; // write a single .glb file
scene.save('scene.glb', GltfFormat.getInstance(), saveOpts);
console.log('Scene saved to scene.glb');مرسوم GltfFormat.getInstance() كما هو الحال في النموذج، فإن المكتبة تستخدم الكود الصحيح بغض النظر عن ملحق الملف.
نصائح وأفضل الممارسات
- استخدام
createChildNode()بدلاً من بناءNodeمباشرة:createChildNode()يصل العلاقة بين الوالدين والطفل تلقائيًا ويسجل عقدة في الشجرة. - التحقق
node.entityقبل الوصول إلى ممتلكات الكيان: العديد من العقد (العقدة المجموعة، العظام، المحل) لا تحمل أي كيان. دائما الحراسة مع صفر التحقق أوinstanceofاختبار . - مجموعة
translationعلى أوعية الأطفال وليس على الأقواس الموسعة: تعديلtransform.translationغير مدمر ويمكن أن تتكون مع التحولات الأبوية. - تفضيلات
binaryMode = trueمن أجل GLB: واحد واحد.glbالملفات سهلة التوزيع، وتحميلها في المتصفحات، واستيرادها إلى محركات الألعاب أكثر من الانقسام..gltf+.binفي شكل . - عبر
for...ofعلىchildNodes: تجنب التصنيف الرقمي ؛ استخدم غير قابل للتصنيع مباشرة للحصول على التوافق إلى الأمام.
القضايا المشتركة
| الأعراض | ربما السبب | تصحيح |
|---|---|---|
child.entity = mesh لا تأثير على الصادرات. | الكيان المخصص لمستوى النود الخاطئ | توزيع entity إلى عقدة الورق، وليس إلى عصا مجموعة |
node.entity دائماً هو null | فقط التحقق rootNode نفسها | استدعاء في node.childNodes; rootNode لا يوجد في الكيانات |
| تحويل غير مرآة في GLB المشاهد | globalTransform لا تحديث | globalTransform يتم حسابها على حفظ؛ إعداد transform.translation قبل أن يطلب scene.save() |
وبدأت شركة GLB تنتج منفصلة .bin الجانب | binaryMode الافتراضات إلى false | مجموعة saveOpts.binaryMode = true |
انظر أيضا
- الخصائص والوظائف: إشارة API الكاملة لجميع مناطق الميزات.
- شكل الدعم: تم دعم تنسيقات 3D ، القدرة على القراءة / الكتابة ، وخيارات التنسيق.
- كيفية إنشاء 3D Mesh ببرمجة