كيفية إنشاء 3D Mesh مع Aspose.3D في Python
Aspose.3D FOSS for Python يسمح لك بإنشاء الهندسة 3D بالكامل في الرمز: لا أداة نمذجة خارجية مطلوبة. Mesh,وَقَالَ الْمُسْلِمِينَ: (وَأَنَّهُ يَعْرِفُ أَيُّوبَ)control_points(وأما في التعريفات)polygons) ، إرفاق خصائص العمود الفقري الاختياري مثل المعتاد ، ثم حفظ المشهد إلى أي تنسيق مدعوم.
خطوة بخطوة دليل
الخطوة 1: قم بتثبيت الحزمة
تثبيت Aspose.3D FOSS من PyPI. لا تتطلب التمديدات الأصلية أو سلسلة أدوات المنسوجات.
asposefoss/3d is not yet published — build from source until it ships. See the project README for build instructions.
تحقق من التثبيت :
from aspose.threed import Scene
print("Aspose.3D FOSS ready")الإصدارات التي تدعمها Python: 3.7، 3.8، 39.9، 3.0، 3.11.
الخطوة 2: إنشاء مشهد ونوود
يجب أن يعيش كل مادة داخل مخطط مسرحي.إنشاء Scene إضافة اسم إلى Node لكي تتمكن من الحفاظ على الماس:
from aspose.threed import Scene
scene = Scene()
node = scene.root_node.create_child_node("triangle")يتم الحفاظ على اسم العقد في الملف المستورد وهو مفيد للتخفيف والتسجيل لاحقًا عبر node.get_child("triangle").
الخطوة الثالثة: إنشاء كائن ميتش
فورًا أ Mesh مع اسم وصف اختياري:
from aspose.threed.entities import Mesh
mesh = Mesh("triangle")يبدأ الماس فارغًا: لا عجلة، لا شرائح.
الخطوة 4: إضافة نقاط التحكم (المتقدمين)
نقطة التحكم هي مواقف الوركست، ويتم تخزين كل نقطتين كأحد Vector4(x, y, z, w) أين w=1 يظهر نقطة في الفضاء 3D:
from aspose.threed.utilities import Vector4
##Vertex 0: origin
# Note: control_points returns a copy of the internal vertex list.
# Appending to the returned copy discards the vertex silently.
# Use _control_points to mutate the backing list directly.
# This is a known library limitation — a public add_control_point() API is not yet available.
mesh._control_points.append(Vector4(0.0, 0.0, 0.0, 1.0))
##Vertex 1: 1 unit along X
mesh._control_points.append(Vector4(1.0, 0.0, 0.0, 1.0))
##Vertex 2: apex
mesh._control_points.append(Vector4(0.5, 1.0, 0.0, 1.0))
print(f"Vertices added: {len(mesh.control_points)}")أهمية : الـمـنـتـهـيmesh.control_points عودة أ نسخة من قائمة الورتيكس الداخلية (الإدخال يلقي) list(self._control_points)* دعوة mesh.control_points.append(v) يرفع على النسخة ، وليس على الوسادة ، لذلك يتم إزالة العمود الفقري بهدوء. mesh._control_points.append(v) إضافات إلى الأقواس.الوصول إلى الدولة الخاصة عبر _control_points هو عمل معروف؛ قد يتغير واجهة في نسخة مستقبلية من المكتبة.
الخطوة الخامسة: إنشاء وجوه البوليغون
تحديد توبولوجيا الوجه باستخدام مؤشرات الوركس. create_polygon().ثلاثة مؤشرات تنتج مثلثاً، وأربعة تنتيج كاد:
##Triangle: connect vertices 0 → 1 → 2
mesh.create_polygon(0, 1, 2)
print(f"Polygon count: {mesh.polygon_count}")بالنسبة لـ 4 أرقام ، يمكنك إرسال أربعة مؤشرات: mesh.create_polygon(0, 1, 2, 3).
يجب أن تكون المؤشرات موضعًا صالحًّا في control_points (بناء على 0، داخل نطاق).الترتيب الرياح هو ضد الساعة للطبيعيات الخارجية.
الخطوة 6: إضافة Vertex Normals
يتم تخزين العادات Vertex كأحد VertexElement يُرفع إلى الوسادة.استخدام mesh.create_element() مع VertexElementType.NORMAL, MappingMode.CONTROL_POINT,و ، و ReferenceMode.DIRECT:
from aspose.threed.entities import VertexElementType, MappingMode, ReferenceMode, VertexElementNormal
from aspose.threed.utilities import Vector4, FVector4
##Create the normal element (returns VertexElementNormal, a VertexElementFVector subclass)
normals: VertexElementNormal = mesh.create_element(
VertexElementType.NORMAL,
MappingMode.CONTROL_POINT,
ReferenceMode.DIRECT
)
##One normal per vertex: all pointing out of the XY plane (0, 0, 1)
normals.set_data([
FVector4(0, 0, 1, 0), # vertex 0
FVector4(0, 0, 1, 0), # vertex 1
FVector4(0, 0, 1, 0), # vertex 2
])
print("Normal layer attached.")MappingMode.CONTROL_POINT 1 عادي لكل Vertex. ReferenceMode.DIRECT يعني أن البيانات العادية يتم قراءتها في نفس الترتيب كما هي نقاط التحكم (لا إضافية مؤشر بوفير).
استخدام الويكتير الطبيعي FVector4(x, y, z, w) مع w=0 إشارة إلى اتجاه بدلاً من موقف. FVector4 هو فيكتور متدفق دقيق واحد؛ ويسمى Vertex البيانات في VertexElementFVector وتستخدم هذه الفئات.
الخطوة 7: ضع الشريط في العقدة واحفظه
إضافة الماس إلى العقد ، ثم حفظ المشهد:
node.add_entity(mesh)
scene.save("triangle.gltf")
print("Saved triangle.gltf")سجل العمل الكامل (جميع الخطوات المشتركة):
from aspose.threed import Scene
from aspose.threed.entities import Mesh, VertexElementType, MappingMode, ReferenceMode, VertexElementNormal
from aspose.threed.utilities import Vector3, Vector4, FVector4
scene = Scene()
node = scene.root_node.create_child_node("triangle")
mesh = Mesh("triangle")
##Add 3 vertices (x, y, z, w)
# Use _control_points to mutate the backing list directly (control_points returns a copy)
mesh._control_points.append(Vector4(0.0, 0.0, 0.0, 1.0))
mesh._control_points.append(Vector4(1.0, 0.0, 0.0, 1.0))
mesh._control_points.append(Vector4(0.5, 1.0, 0.0, 1.0))
##Create a triangle polygon
mesh.create_polygon(0, 1, 2)
##Add normals (create_element returns VertexElementNormal, a VertexElementFVector subclass)
normals: VertexElementNormal = mesh.create_element(VertexElementType.NORMAL, MappingMode.CONTROL_POINT, ReferenceMode.DIRECT)
normals.set_data([
FVector4(0, 0, 1, 0),
FVector4(0, 0, 1, 0),
FVector4(0, 0, 1, 0),
])
node.add_entity(mesh)
scene.save("triangle.gltf")القضايا المشتركة
| مسألة | القرار |
|---|---|
IndexError في create_polygon | تأكد من أن جميع المؤشرات داخل range(len(mesh.control_points)).المؤشرات على أساس 0 . |
| تصدير الخزف مع صفر الأوراق | mesh.control_points.append(...) يغيب الصمت عن الأقواس لأن الممتلكات تعيد نسخة. mesh._control_points.append(...) بدلاً من ذلك. |
| الحساب العادي لا يتطابق مع الحد الأدنى للارتباط | عند استخدامها MappingMode.CONTROL_POINT + ReferenceMode.DIRECT, normals.data يجب أن يكون بالضبط len(control_points) دخول . |
| ميتا غائبة من الملفات المحفوظة | تأكيد هذا node.add_entity(mesh) تم استدعاء قبل scene.save().لا يتم تصدير قوس غير مرفق بأي عقدة. |
| خطأ في ترتيب التمرير (يبدو الوجه غير مرئي) | يخلق ترتيب العمود الفقري المقاوم للساعة طبيعية خارجية. create_polygon لكي يضربها. |
polygon_count العودة 0 | polygon_count قراءة نفس القائمة كما polygons.إذا create_polygon لم يتم استدعاءها، والقائمة فارغة. |
| العادات تبدو غير صحيحة في المشاهدين | تأكد من أن جميع الويكترات العادية هي وحدة الطول. n / abs(n) أو تجاوز القيم المسبقة. |
الأسئلة المتكررة
ما الفرق بين Vector3 و Vector4 نقطة التحكم؟?
control_points متاجر Vector4 الموضوعات - The w المكون هو الإحداثيات المتجانسة: استخدام w=1 في مواقف Vertex و w=0 للتوجيهات مثل العادات. Vector3 يستخدم للتحولات (الترجمة، مقياس) ولكن ليس لتخزين الهندسة الجيومترية.
هل يمكنني بناء قوس مع الكوات بدلا من المثلثات؟?
نعم، اتصل بنا mesh.create_polygon(0, 1, 2, 3) مع أربعة مؤشرات لتحديد مربع.بعض الهدفات الحفاظ (STL، 3MF) يتطلب المثلثات وسوف تتجول المربعات تلقائيا. glTF و COLLADA الحفظ المربعين.
كيف يمكنني إضافة إحداثيات UV؟?
استخدام mesh.create_element_uv(TextureMapping.DIFFUSE, MappingMode.POLYGON_VERTEX) لإنشاء A VertexElementUV قناة التلفزيون، ثم تُنسب إلى data قائمة مع Vector4 إدخال: استخدام اتجاهات UV x و y; z و w 0 0 1 يجب أن يكون أول حجة TextureMapping كونها دائمة (مثل., TextureMapping.DIFFUSE) تحديد أي نسيج من القماش الطبقة UV ينتمي.
هل يحتاج الماس إلى عاديين للتصدير بشكل صحيح؟?
لا. العادات واضحة.إذا تم تجاهلها، فإن معظم المشاهدين حساب العادة من وجه إلى وجه من ترتيب التمرير البوليغون. إضافة صريحة لكل عادات يخلق ظلال أكثر سلاسة.
هل يمكنني إضافة عدة ألواح إلى عقدة واحدة؟?
نعم، اتصل بنا node.add_entity(mesh) كل مكالمة يضيف كيان جديد إلى node.entities.بعض النماذج يمكن أن تفرق عدة كيانات في واحد على التصدير.
كيف يمكنني تثريج الماس مع أنواع البوليغون المختلطة؟?
مكالمة mesh.triangulate() تحويل جميع الكوايدات و N-gons إلى المثلثات الموجودة.هذا مفيد قبل حفظها في تنسيقات تدعم فقط المراتب الثلاثية.