الميزات والوظائف

الميزات والوظائف

Aspose.3D FOSS for Python يوفر واجهة برمجة تطبيقات كاملة للرسم البياني للمشهد لقراءة وإنشاء وكتابة محتوى ثلاثي الأبعاد بعدة صيغ معيارية في الصناعة. توثّق هذه الصفحة كل مجال ميزة رئيسي مع أمثلة شفرة Python تعمل تستخدم واجهة برمجة التطبيقات الفعلية للمكتبة.

التثبيت والإعداد

قم بتثبيت المكتبة من PyPI بأمر واحد:

pip install aspose-3d-foss

لا توجد حزم نظام إضافية أو امتدادات أصلية أو سلاسل أدوات المترجم مطلوبة. المكتبة هي Python صافية وتدعم Python 3.7 حتى 3.12 على Windows و macOS و Linux.

للتحقق من التثبيت:

from aspose.threed import Scene

scene = Scene()
print("Aspose.3D FOSS installed successfully")
print(f"Root node name: {scene.root_node.name}")

الميزات والوظائف

دعم الصيغ

Aspose.3D FOSS for Python يقرأ ويكتب الصيغ التالية:

تنسيقامتدادقراءةكتابةملاحظات
Wavefront OBJ.objنعمنعم.دعم تحميل مواد .mtl
STL (ثنائي).stlنعمنعمتم التحقق من الجولة (39 اختبارًا)
STL (ASCII).stlنعمنعمتم التحقق من الجولة
glTF 2.0.gltfنعمنعمتم الحفاظ على مخطط المشهد الكامل
GLB (glTF ثنائي).glbنعمنعمحاوية ثنائية بملف واحد
COLLADA.daeنعمنعمهيكلية المشهد والمواد
3MF.3mfنعمنعمصيغة التصنيع الإضافي
FBX.fbxجزئيلاالمحلل اللغوي يعمل؛ المحلل يحتوي على أخطاء معروفة

تحميل OBJ مع الخيارات

ObjLoadOptions يتحكم في كيفية تحليل ملفات OBJ:

from aspose.threed import Scene
from aspose.threed.formats import ObjLoadOptions

options = ObjLoadOptions()
options.enable_materials = True        # Load accompanying .mtl file
options.flip_coordinate_system = False # Preserve original handedness
options.normalize_normal = True        # Normalize vertex normals to unit length
options.scale = 1.0                    # Apply a uniform scale factor at load time

scene = Scene()
scene.open("model.obj", options)

print(f"Loaded {len(scene.root_node.child_nodes)} top-level nodes")

الحفظ إلى STL

StlSaveOptions يتحكم في الإخراج الثنائي مقابل ASCII وإعدادات أخرى خاصة بـ STL:

from aspose.threed import Scene
from aspose.threed.formats import StlSaveOptions

scene = Scene.from_file("model.obj")
options = StlSaveOptions()
scene.save("output.stl", options)

رسم بياني للمشهد

جميع المحتوى ثلاثي الأبعاد مُنظم كشجرة من Node الكائنات. جذر الشجرة هو scene.root_node. يمكن لكل عقدة أن تحتوي على عقد فرعية وتحمل Entity (شبكة، كاميرا، أو إضاءة) بالإضافة إلى Transform.

التنقل في تسلسل المشهد الهرمي

from aspose.threed import Scene

scene = Scene.from_file("model.glb")

def traverse(node, depth=0):
    indent = "  " * depth
    entity_type = type(node.entity).__name__ if node.entity else "none"
    print(f"{indent}{node.name} [{entity_type}]")
    for child in node.child_nodes:
        traverse(child, depth + 1)

traverse(scene.root_node)

إنشاء مشهد برمجياً

from aspose.threed import Scene, Node, Entity
from aspose.threed.entities import Mesh
from aspose.threed.utilities import Vector3

scene = Scene()
root = scene.root_node

##Create a child node and position it
child = root.create_child_node("my_object")
child.transform.translation = Vector3(1.0, 0.0, 0.0)
child.transform.scaling = Vector3(2.0, 2.0, 2.0)

scene.save("constructed.glb")

فحص GlobalTransform

GlobalTransform يعطي تحويل الفضاء العالمي لعقدة بعد تجميع جميع تحويلات الأسلاف:

from aspose.threed import Scene

scene = Scene.from_file("model.dae")

for node in scene.root_node.child_nodes:
    gt = node.global_transform
    print(f"Node: {node.name}")
    print(f"  World translation: {gt.translation}")
    print(f"  World scale: {gt.scale}")

واجهة برمجة تطبيقات Mesh

ال Mesh تُتيح الكيان الوصول إلى بيانات الهندسة بما في ذلك نقاط التحكم (الرؤوس)، المضلعات، وعناصر الرؤوس للاتجاهات، إحداثيات UV، والألوان.

قراءة هندسة Mesh

from aspose.threed import Scene
from aspose.threed.formats import ObjLoadOptions

options = ObjLoadOptions()
options.enable_materials = True
options.flip_coordinate_system = False

scene = Scene()
scene.open("model.obj", options)

for node in scene.root_node.child_nodes:
    if node.entity is None:
        continue
    mesh = node.entity
    print(f"Mesh: {node.name}")
    print(f"  Vertices: {len(mesh.control_points)}")
    print(f"  Polygons: {len(mesh.polygons)}")

الوصول إلى عناصر الرؤوس

عناصر الرؤوس تحمل بيانات لكل رأس أو لكل مضلع. أكثر العناصر شيوعًا هي المعايير، إحداثيات UV، ألوان الرؤوس، ومجموعات التنعيم:

from aspose.threed import Scene
from aspose.threed.entities import VertexElementNormal, VertexElementUV

scene = Scene.from_file("model.obj")

for node in scene.root_node.child_nodes:
    if node.entity is None:
        continue
    mesh = node.entity

    # Iterate vertex elements to find normals and UVs
    for element in mesh.vertex_elements:
        if isinstance(element, VertexElementNormal):
            print(f"  Normals count: {len(element.data)}")
        elif isinstance(element, VertexElementUV):
            print(f"  UV count: {len(element.data)}")

نظام المواد

Aspose.3D FOSS يدعم نوعين من المواد: LambertMaterial (تظليل انتشاري) و PhongMaterial (تظليل انعكاسي). يتم تحميلهما تلقائيًا من ملفات .mtl عند استخدام ObjLoadOptions مع enable_materials = True.

قراءة المواد من OBJ

from aspose.threed import Scene
from aspose.threed.shading import LambertMaterial, PhongMaterial
from aspose.threed.formats import ObjLoadOptions

options = ObjLoadOptions()
options.enable_materials = True

scene = Scene()
scene.open("model.obj", options)

for node in scene.root_node.child_nodes:
    mat = node.material
    if mat is None:
        continue
    print(f"Node: {node.name}")
    if isinstance(mat, PhongMaterial):
        print(f"  Type: Phong")
        print(f"  Diffuse: {mat.diffuse_color}")
        print(f"  Specular: {mat.specular_color}")
    elif isinstance(mat, LambertMaterial):
        print(f"  Type: Lambert")
        print(f"  Diffuse: {mat.diffuse_color}")

تعيين مادة برمجيًا

from aspose.threed import Scene, Node
from aspose.threed.shading import PhongMaterial
from aspose.threed.utilities import Vector3

scene = Scene.from_file("model.glb")

material = PhongMaterial()
material.diffuse_color = Vector3(0.8, 0.2, 0.2)   # Red diffuse
material.specular_color = Vector3(1.0, 1.0, 1.0)  # White specular

##Apply to the first mesh node
for node in scene.root_node.child_nodes:
    if node.entity is not None:
        node.material = material
        break

scene.save("recolored.glb")

أدوات رياضية

ال aspose.threed.utilities الوحدة توفر جميع أنواع الرياضيات الهندسية اللازمة لبناء المشهد وفحصه.

الفئةالغرض
Vector22D floating-point vector (UV coordinates)
Vector33D double-precision vector (positions, normals)
Vector44D double-precision vector (homogeneous coordinates)
FVector33D single-precision vector (compact storage)
Quaternionتمثيل الدوران بدون قفل الجيمبال
Matrix44×4 transformation matrix
BoundingBoxصندوق احتواء محاذى للمحاور مع زوايا الحد الأدنى/الأقصى

العمل مع التحويلات

from aspose.threed.utilities import Vector3, Quaternion, Matrix4
import math

##Build a rotation quaternion from axis-angle
axis = Vector3(0.0, 1.0, 0.0)          # Y-axis
angle_rad = math.radians(45.0)
q = Quaternion.from_angle_axis(angle_rad, axis)

print(f"Quaternion: x={q.x:.4f} y={q.y:.4f} z={q.z:.4f} w={q.w:.4f}")

##Convert to rotation matrix
mat = q.to_matrix()
print(f"Rotation matrix row 0: {mat[0, 0]:.4f} {mat[0, 1]:.4f} {mat[0, 2]:.4f}")

حساب صندوق الحد

from aspose.threed import Scene

scene = Scene.from_file("model.stl")

# NOTE: mesh.get_bounding_box() is a stub — it always returns an empty BoundingBox()
# regardless of geometry. Compute bounds manually from control_points:
for node in scene.root_node.child_nodes:
    if node.entity is None:
        continue
    mesh = node.entity
    pts = mesh.control_points  # returns a copy of the vertex list
    if not pts:
        continue
    xs = [p.x for p in pts]
    ys = [p.y for p in pts]
    zs = [p.z for p in pts]
    print(f"Mesh: {node.name}")
    print(f"  Min: ({min(xs):.3f}, {min(ys):.3f}, {min(zs):.3f})")
    print(f"  Max: ({max(xs):.3f}, {max(ys):.3f}, {max(zs):.3f})")

الرسوم المتحركة

Aspose.3D FOSS يوفر نموذجًا للرسوم المتحركة يعتمد على AnimationClip, AnimationNode, KeyFrame, و KeyframeSequence. بيانات الرسوم المتحركة المخزنة في الملفات المحملة (glTF, COLLADA) يمكن الوصول إليها عبر هذه الكائنات.

قراءة مقاطع الرسوم المتحركة

from aspose.threed import Scene

scene = Scene.from_file("animated.glb")

for clip in scene.animation_clips:
    print(f"Clip: {clip.name}  ({clip.start:.2f}s – {clip.stop:.2f}s)")
    for anim_node in clip.animations:
        print(f"  Animation node: {anim_node.name}")
        for sub in anim_node.sub_animations:
            print(f"    Sub-animation: {sub.name}")
        for bp in anim_node.bind_points:
            print(f"    Bind point: {bp.name}")

خيارات التحميل والحفظ

كل تنسيق مدعوم له فئة خيارات مقابلة تتحكم في سلوك التحليل والتسلسل.

فئةتنسيقالخصائص الرئيسية
ObjLoadOptionsOBJenable_materials, flip_coordinate_system, normalize_normal, scale
StlSaveOptionsSTLوضع الإخراج الثنائي مقابل ASCII
(glTF يستخدم الإعدادات الافتراضية)glTF / GLBيتم حفظ مخطط المشهد والمواد تلقائيًا

أمثلة على الاستخدام

المثال 1: تحويل تنسيق OBJ إلى STL

تحويل ملف OBJ (مع المواد) إلى STL ثنائي، مع طباعة إحصائيات الشبكة أثناء العملية:

from aspose.threed import Scene
from aspose.threed.formats import ObjLoadOptions
from aspose.threed.formats import StlSaveOptions

##Load OBJ with material support
load_opts = ObjLoadOptions()
load_opts.enable_materials = True
load_opts.flip_coordinate_system = False
load_opts.normalize_normal = True

scene = Scene()
scene.open("input.obj", load_opts)

##Report what was loaded
total_vertices = 0
total_polygons = 0
for node in scene.root_node.child_nodes:
    if node.entity is not None:
        mesh = node.entity
        total_vertices += len(mesh.control_points)
        total_polygons += len(mesh.polygons)
        print(f"  {node.name}: {len(mesh.control_points)} vertices, {len(mesh.polygons)} polygons")

print(f"Total: {total_vertices} vertices, {total_polygons} polygons")

##Save as STL
save_opts = StlSaveOptions()
scene.save("output.stl", save_opts)
print("Saved output.stl")

المثال 2: تجميع دفعة من glTF إلى GLB

إعادة حفظ دليل يحتوي على ملفات glTF + قوام منفصلة كملفات ثنائية GLB مستقلة:

import os
from aspose.threed import Scene

input_dir = "gltf_files"
output_dir = "glb_files"
os.makedirs(output_dir, exist_ok=True)

for filename in os.listdir(input_dir):
    if not filename.endswith(".gltf"):
        continue
    src = os.path.join(input_dir, filename)
    dst = os.path.join(output_dir, filename.replace(".gltf", ".glb"))
    scene = Scene.from_file(src)
    scene.save(dst)
    print(f"Packed {filename} -> {os.path.basename(dst)}")

المثال 3: فحص رسم بياني للمشهد وتقرير التصدير

استعراض رسم بياني للمشهد في ملف COLLADA، جمع إحصائيات لكل شبكة، وطباعة تقرير منظم:

from aspose.threed import Scene

scene = Scene.from_file("assembly.dae")

report = []

def collect(node, path=""):
    full_path = f"{path}/{node.name}" if node.name else path
    if node.entity is not None:
        mesh = node.entity
        gt = node.global_transform
        report.append({
            "path": full_path,
            "vertices": len(mesh.control_points),
            "polygons": len(mesh.polygons),
            "world_x": gt.translation.x,
            "world_y": gt.translation.y,
            "world_z": gt.translation.z,
        })
    for child in node.child_nodes:
        collect(child, full_path)

collect(scene.root_node)

print(f"{'Path':<40} {'Verts':>6} {'Polys':>6} {'X':>8} {'Y':>8} {'Z':>8}")
print("-" * 78)
for entry in report:
    print(
        f"{entry['path']:<40} "
        f"{entry['vertices']:>6} "
        f"{entry['polygons']:>6} "
        f"{entry['world_x']:>8.3f} "
        f"{entry['world_y']:>8.3f} "
        f"{entry['world_z']:>8.3f}"
    )

نصائح وأفضل الممارسات

اختيار التنسيق

  • glTF 2.0 / GLB هو تنسيق التبادل الموصى به للمشاهد التي تشمل موادًا، وحركات، وتسلسلات هرمية معقدة. يفضَّل GLB (ثنائي) على glTF (نص + ملفات خارجية) من أجل القابلية للنقل.
  • STL هو الخيار المناسب عندما يكون المستهلك اللاحق مقطعًا (slicer) أو أداة CAD أو أي أداة تحتاج فقط إلى الهندسة. لا يحتوي STL على بيانات مواد أو حركات.
  • OBJ يحظى بدعم واسع وهو خيار جيد عندما يجب تبادل بيانات المواد مع أدوات أقدم. احرص دائمًا على إبقاء ملف .mtl بجانب ملف .obj.

أنظمة الإحداثيات

  • تستخدم التطبيقات المختلفة اتفاقيات يد مختلفة. اضبط ObjLoadOptions.flip_coordinate_system = True عند استيراد ملفات OBJ من أدوات تستخدم نظام إحداثيات يد يميني إذا كان خط أنابيبك يتوقع إحداثيات يد يسارية، والعكس بالعكس.
  • تحقق من اتفاقية المحاور للأصل المصدر قبل تطبيق أي انعكاس. يؤدي الانعكاس مرتين إلى تشويه الهندسة.

التطبيع

  • اضبط دائمًا ObjLoadOptions.normalize_normal = True عندما يتوقع خط الأنابيب اللاحق متجهات عادية موحدة (على سبيل المثال، عند تمرير المتجهات العادية إلى الظل أو إجراء حسابات إضاءة بنقطة الضرب). المتجهات العادية غير الموحدة من ملفات OBJ ذات الصياغة الضعيفة تسبب تشوهات إضاءة.

الأداء

  • حمّل الملفات مرة واحدة وحوّل مخطط المشهد الموجود في الذاكرة (in‑memory scene graph) بدلاً من إعادة التحميل من القرص لكل صيغة إخراج. واحدة Scene.from_file() استدعاء يتبعه عدة scene.save() الاستدعاءات أكثر كفاءة من التحميل المتكرر.
  • عند معالجة دفعات كبيرة، أنشئ كائنًا واحدًا ObjLoadOptions أو StlSaveOptions مثيل وأعد استخدامه عبر جميع الملفات بدلاً من إنشاء كائن options جديد لكل ملف.

معالجة الأخطاء

  • غلف scene.open() و scene.save() الاستدعاءات في try/except كتل عند معالجة ملفات غير موثوقة أو ملفات مقدمة من المستخدم. أبلغ عن اسم الملف في رسائل الاستثناء لتبسيط تصحيح الأخطاء في خطوط الأنابيب الدفعية.

المشكلات الشائعة

مشكلةالسببالحل
تظهر الشبكة معكوسة بعد التحميلعدم توافق اتجاهية نظام الإحداثياتتبديل ObjLoadOptions.flip_coordinate_system
المتجهات العمودية ذات طول صفرملف المصدر يحتوي على متجهات عمودية غير مُعَدَّلةتعيين ObjLoadOptions.normalize_normal = True
المواد غير محملة من OBJenable_materials هو False (افتراضي)تعيين ObjLoadOptions.enable_materials = True
يتم تحميل المشهد لكن جميع العقد فارغةالملف يستخدم تنسيق FBXمحلل FBX قيد التطوير؛ استخدم OBJ أو STL أو glTF بدلاً من ذلك
النموذج صغير جدًا أو كبيرالملف المصدر يستخدم وحدات غير متريّةتطبيق ObjLoadOptions.scale لتحويل إلى الوحدة المستهدفة
AttributeError تشغيل mesh.polygonsكيان Node ليس Meshاحمِ بـ if node.entity is not None قبل الوصول إلى خصائص entity
ملف GLB مرفوض من قبل العارضتم الحفظ بـ .gltf امتداداستخدم .glb الامتداد عند الاستدعاء scene.save() لتفعيل binary container

الأسئلة المتكررة

ما إصدارات Python المدعومة؟? Python 3.7, 3.8, 3.9, 3.10, 3.11, و 3.12 كلها مدعومة. المكتبة هي Python صافية بدون امتداد أصلي، لذا تعمل على أي منصة يعمل عليها CPython.

هل للمكتبة أي تبعيات خارجية؟? لا. Aspose.3D FOSS لـ Python يستخدم فقط مكتبة Python القياسية. يتم تثبيته كأمر واحد pip install aspose-3d-foss أمر دون أي خطوات لاحقة.

هل يتم دعم FBX؟? تم تنفيذ محلل FBX ويمكنه تحليل تدفق الرموز الثنائي لـ FBX، لكن مُنشئ مخطط المشهد فوق المحلل يحتوي على أخطاء معروفة وليس جاهزًا للإنتاج. استخدم OBJ أو STL أو glTF أو COLLADA أو 3MF للاستخدام الإنتاجي الموثوق.

هل يمكنني استخدام Aspose.3D FOSS في منتج تجاري؟? نعم. المكتبة مُصدرة تحت رخصة MIT، التي تسمح بالاستخدام في البرمجيات المملوكة والتجارية دون دفع إتاوات، بشرط تضمين إشعار الترخيص.

كيف يمكنني الإبلاغ عن خطأ أو طلب تنسيق؟? افتح مشكلة في المستودع. أرفق ملفًا بسيطًا لإعادة الإنتاج وإصدار Python، نظام التشغيل، وإصدار المكتبة من pip show aspose-3d-foss.


ملخص مرجع API

الفئات الأساسية

  • Scene: حاوية المستوى الأعلى لمشهد ثلاثي الأبعاد. نقطة الدخول إلى open(), from_file(),، و save().
  • Node: عقدة شجرة في رسم المشهد. تحمل entity, transform, global_transform, material, child_nodes,، و name.
  • Entity: الفئة الأساسية للكائنات المرفقة بالعقد (Mesh, Camera, Light).
  • Transform: الموضع، الدوران (Quaternion)، والقياس في الفضاء المحلي لعقدة.
  • GlobalTransform: تحويل للفضاء العالمي للقراءة فقط يتم حسابه بتجميع جميع التحويلات للأجداد.

الهندسة

  • Mesh: شبكة مضلّعات مع control_points (قائمة الرؤوس) و polygons.
  • VertexElementNormal: متجهات العموديات لكل رأس أو لكل مضلع.
  • VertexElementUV: إحداثيات القوام UV لكل رأس.
  • VertexElementVertexColor: بيانات اللون لكل رأس.
  • VertexElementSmoothingGroup: تعيينات مجموعات التنعيم للمضلعات.

المواد

  • LambertMaterial: نموذج التظليل المنتشر مع diffuse_color : و emissive_color.
  • PhongMaterial: نموذج التظليل اللامع يضيف specular_color : و shininess.

: أدوات رياضية (aspose.threed.utilities)

  • Vector2: متجه ثنائي الأبعاد.
  • Vector3: متجه ثلاثي الأبعاد بدقة مزدوجة.
  • Vector4: متجه رباعي الأبعاد بدقة مزدوجة.
  • FVector3: متجه ثلاثي الأبعاد بدقة أحادية.
  • Quaternion: كواتيرنيون الدوران مع from_angle_axis() : و to_matrix().
  • Matrix4: مصفوفة تحويل 4×4.
  • BoundingBox: صندوق احتواء محاذى للمحاور مع minimum : و maximum : زوايا.

الرسوم المتحركة

  • AnimationClip: حاوية مسماة لمجموعة من قنوات الرسوم المتحركة وإطاراتها المفتاحية.
  • AnimationNode: بيانات الرسوم المتحركة لكل عقدة داخل المقطع.
  • KeyFrame: إطار مفتاح واحد مع الوقت والقيمة.
  • KeyframeSequence: تسلسل مرتب لإطارات المفاتيح لخاصية متحركة واحدة.

خيارات التحميل / الحفظ

  • ObjLoadOptions: إعدادات التحميل الخاصة بـ OBJ: enable_materials, flip_coordinate_system, normalize_normal, scale.
  • StlSaveOptions: إعدادات الحفظ الخاصة بـ STL (الوضع الثنائي مقابل وضع ASCII).

الكاميرات والأضواء

  • Camera: كيان الكاميرا مع إعدادات الإسقاط، قابل للإرفاق بـ Node.
  • Light: كيان مصدر الضوء، قابل للإرفاق بـ Node.
 العربية