كيفية إنشاء 3D Mesh ببرمجة في TypeScript
Aspose.3D FOSS for TypeScript يسمح لك بإنشاء الهندسة 3D بالكامل في الرمز دون تحميل أي ملف. يمكنك تعريف المواقف العمودية على أنها نقاط التحكم، وتحديد وجوه البولينغون حسب المؤشر، وإرفاق عناصر العود الاختياري مثل العادية أو الأشعة فوق البنفسجية أو الألوان العودة. يمكن حفظ النتيجة إلى أي تنسيق قابل للكتابة: glTF، GLB، STL، FBX، أو COLLADA.
المعايير
- Node.js 18 أو أحدث
- TypeScript 5.0 أو أحدث
@aspose/3dتثبيت (انظر الخطوة 1)
خطوة بخطوة دليل
الخطوة 1: تثبيت @aspose/3d
asposefoss/3d is not yet published — build from source until it ships. See the project README for build instructions.
لا تتطلب الإضافات الأصلية أو مكتبات النظام.يتضمن الحزمة تعريفات نوع TypeScript.
الحد الأدنى tsconfig.json:
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"moduleResolution": "node",
"esModuleInterop": true,
"strict": true
}
}الخطوة 2: إنشاء مشهد ونوود
أ أ Scene هو حاوية المستوى الأعلى.يجب أن تكون جميع الهندسة المرتبطة بـ Node داخل المشهد:
import { Scene } from '@aspose/3d';
const scene = new Scene();
const node = scene.rootNode.createChildNode('triangle');createChildNode(name) يخلق عقدة تسمى ويصلها كطفل من عقد الحالي. Node الموضوع هو حيث سوف تصل إلى الماس في الخطوة 7.
الخطوة الثالثة: إنشاء كائن ميتش
Mesh يحتفظ بمواقف العمود الفقري وتحديدات البوليغون.تصميم واحد مع اسم اختياري:
import { Mesh } from '@aspose/3d/entities';
const mesh = new Mesh('triangle');يبدأ الماس فارغًا: لا أعمدة ولا وجوه.أضفها في الخطوات التالية.
الخطوة 4: إضافة نقاط التحكم (المتقدمين)
نقاط التحكم هي المواقف الخلفية في الفضاء المحلي. Vector4 القيم داخل mesh.controlPoints.المكون الرابع (w) هو 1 بالنسبة للمواقف :
import { Vector4 } from '@aspose/3d/utilities';
mesh.controlPoints.push(new Vector4(0.0, 0.0, 0.0, 1.0)); // index 0
mesh.controlPoints.push(new Vector4(1.0, 0.0, 0.0, 1.0)); // index 1
mesh.controlPoints.push(new Vector4(0.5, 1.0, 0.0, 1.0)); // index 2
يمكنك الإشارة إلى هذه المواقف من خلال مؤشرها القائم على الصفر عند تحديد وجوه البوليغون.
الخطوة الخامسة: إنشاء وجوه البوليغون
createPolygon() يحدد وجهًا عن طريق إدراج المؤشرات العمودية في ترتيب.ثلاثة مؤشرات تجعل مثلثًّا:
mesh.createPolygon(0, 1, 2);يمكنك أيضًا تعريف الربع (أربعة مؤشرات) أو المجموعات العشوائية للتنسيقات التي تدعمها.للمكتبة glTF ، ستتجول مكتبات n-gons و quads تلقائيًّا على الصادرات.
الخطوة 6: إضافة Vertex Normals
العادات تحسين جودة التصوير.استخدام mesh.createElement() لإنشاء A VertexElementNormal, جمع الفكتير العادي في صف ، ثم الاتصال setData() وَقَالَ الْمُحَرَّم: لِأَنَّهُ data يعود المضغوط نسخة دفاعية - الضغط عليه لا يؤثر. FVector3 (الضغط الوحيد) للبيانات العادية، لا Vector4.
import { VertexElementNormal } from '@aspose/3d/entities';
import { VertexElementType, MappingMode, ReferenceMode } from '@aspose/3d/entities';
import { FVector3 } from '@aspose/3d/utilities';
const normals = mesh.createElement(
VertexElementType.NORMAL,
MappingMode.CONTROL_POINT,
ReferenceMode.DIRECT
) as VertexElementNormal;
// Build the normal array, then call setData() — do NOT push to normals.data
normals.setData([
new FVector3(0, 0, 1), // normal for vertex 0 (pointing +Z)
new FVector3(0, 0, 1), // normal for vertex 1
new FVector3(0, 0, 1), // normal for vertex 2
]);MappingMode.CONTROL_POINT 1 عادي لكل Vertex. ReferenceMode.DIRECT يعني أن مجموعة البيانات يتم فهرسةها مباشرة من قبل مؤشر البوليغون الوركس.
الخطوة 7: ضع الماسح الضوئي واحفظه إلى glTF
إعطاء الماس إلى العقد عبر node.entity,ثم حفظ المشهد:
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';
node.entity = mesh;
const saveOpts = new GltfSaveOptions();
scene.save('triangle.gltf', GltfFormat.getInstance(), saveOpts);
console.log('Triangle mesh saved to triangle.gltf');إنتاج حاوية واحدة ذاتية .glb الملف بدلاً من ذلك، إعداد saveOpts.binaryMode = true وتغيير ملف النشر التمديد إلى .glb.
مثال كامل
وفيما يلي النص الكامل الذي يجمع بين جميع الخطوات المذكورة أعلاه:
import { Scene } from '@aspose/3d';
import { Mesh, VertexElementNormal } from '@aspose/3d/entities';
import { VertexElementType, MappingMode, ReferenceMode } from '@aspose/3d/entities';
import { Vector4, FVector3 } from '@aspose/3d/utilities';
import { GltfSaveOptions, GltfFormat } from '@aspose/3d/formats/gltf';
const scene = new Scene();
const node = scene.rootNode.createChildNode('triangle');
const mesh = new Mesh('triangle');
mesh.controlPoints.push(new Vector4(0.0, 0.0, 0.0, 1.0));
mesh.controlPoints.push(new Vector4(1.0, 0.0, 0.0, 1.0));
mesh.controlPoints.push(new Vector4(0.5, 1.0, 0.0, 1.0));
mesh.createPolygon(0, 1, 2);
const normals = mesh.createElement(
VertexElementType.NORMAL,
MappingMode.CONTROL_POINT,
ReferenceMode.DIRECT
) as VertexElementNormal;
// setData() is the correct API — normals.data returns a defensive copy; pushing to it has no effect
normals.setData([
new FVector3(0, 0, 1),
new FVector3(0, 0, 1),
new FVector3(0, 0, 1),
]);
node.entity = mesh;
const saveOpts = new GltfSaveOptions();
scene.save('triangle.gltf', GltfFormat.getInstance(), saveOpts);
console.log('Triangle mesh saved to triangle.gltf');الركض مع ts-node:
npx ts-node triangle.tsالقضايا المشتركة
| مسألة | سبب | تصحيح |
|---|---|---|
mesh.controlPoints.length 0 بعد push | لا يذكر أي نود | ضغط قبل التخصيص node.entity;- لا يهم الأمر، ولكن التحقق من الإشارة. |
| التصدير يخلق الهندسة الجيولوجية الفارغة | node.entity لا تخصيص | ضمان node.entity = mesh قبل أن يطلب scene.save() |
| الحساب العادي غير متوافق | أريلي انتقل إلى setData() أقصر من controlPoints | إضافة واحدة FVector3 الدخول حسب نقطة التحكم عند استخدامها MappingMode.CONTROL_POINT |
| مشاهدة GlTF العرض الأسود | العادات التي تظهر داخلها | العكس من النظام في createPolygon ( على سبيل المثال ،., 0, 2, 1• إلغاء الـ Vector Normal |
| TypeScript: لا توجد ملكية ’normals.data' | طريق الاستيراد الخاطئ | استيراد VertexElementNormal من @aspose/3d/entities,وليس من @aspose/3d الجذور |
الأسئلة المتكررة
هل يمكنني إنشاء الكوايدات بدلاً من المثلث؟? نعم، قم بتوجيه أربعة مؤشرات إلى createPolygon(0, 1, 2, 3).المكتبة ثلاثية الأبعاد الكوات أثناء التصدير إلى تنسيقات تتطلب مثلث (glTF، STL).
ما الفرق بين MappingMode.CONTROL_POINT و MappingMode.POLYGON_VERTEX? CONTROL_POINT يضع قيمة واحدة لكل Vertex. POLYGON_VERTEX تخزين قيمة واحدة لكل زوج من البوليغون-الخلفية، مما يسمح مختلف المعايير في نفس الخلف عندما ينتمي إلى عدة البوليون (الأطراف الصلبة).
هل أحتاج إلى ثلاثية الأبعاد قبل أن أستمر في STL؟? لا. تتعامل المكتبة مع ثلاثية تلقائيًا عند تصديرها إلى تنسيقات تتطلب ثلاثي الأبعاد.يمكنك تعريف الربع و n-gons في المسح وتخزينها مباشرة إلى STL.
كيف يمكنني إضافة إحداثيات UV؟? استخدام mesh.createElementUV(TextureMapping.Diffuse, MappingMode.CONTROL_POINT, ReferenceMode.DIRECT) لإنشاء A VertexElementUV,ثم اتصل setData([...]) مع مجموعة من FVector2 أو FVector3 قيمة - واحد لكل نقطة التحكم. data يعود المضغوط نسخة؛ لا تدفعها مباشرة.
هل يمكنني بناء العديد من المراحل في مشهد واحد؟? نعم.إنشاء العديد من العقدة تحت scene.rootNode وَقَالَ الْمُسْلِم: فَإِنَّهُ لَا يَعْبُدُ مَنْ أَحَبُّ. Mesh لكل عقدة من entity الممتلكات .