العمل مع المسرحية الرسوم البيانية

العمل مع المسرحية الرسوم البيانية

جميع المحتوى 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

انظر أيضا

 العربية