الخصائص والوظائف

الخصائص والوظائف

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

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

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

asposefoss/3d is not yet published — build from source until it ships. See the project README for build instructions.

لا تتطلب حزم نظام إضافية أو امتدادات أصلية، أو سلسلة أدوات المنسوج.المكتبة هي 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 يقرأ ويكتب في النماذج التالية:

شكلالتمديدقراءةكتبملاحظات
OBJ.objنعمنعمWavefront OBJ؛ .mtl المواد تحميل مدعومة
STL.stlنعمنعمالخيارات الثنائية و ASCII؛ التحقق من الدوران
GLTF.gltf / .glbنعمنعمGLTF 2.0 JSON و 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)

مشاهدة Graph

كل محتوى 3D يتم تنظيمه كشجرة من 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 يمنح الكيان إمكانية الوصول إلى بيانات الهندسة بما في ذلك نقاط التحكم (المتحولات) والعديد من العناصر، وعناوين المتحولين للطبيعة الطبيعية والأشعة فوق البنفسجية والألوان.

قراءة الماس الهندسة الجيومترية

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)}")

إستخدام عناصر Vertex

العناصر الخفية تحمل البيانات الخفيفة أو الخلفية.الأعضاء الأكثر شيوعا هي العادات، وتنسيقات الأشعة فوق البنفسجية، والألوان الخفیفة، ومجموعات التخفيف:

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مربع الحدود المرتبط بالحافة مع زوايا min/max

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

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الوضع الثنائي vs. ASCII النتيجة
(يستخدم GST مع الافتراضات)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 Packing

إعادة حفظ دليل من ملفات 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 هو الخيار الصحيح عندما يكون المستهلك السفلي هو خياطة أو أداة CAD أو أي أدوات تحتاج فقط إلى الهندسة الجيولوجية.
  • OBJ يتم دعمها على نطاق واسع وخيار جيد عندما يتعين تبادل البيانات المادية مع الأدوات القديمة.

نظم التنسيق

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

المعيار

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

أداء

  • تحميل الملفات مرة واحدة وتحويل الرسم البياني في ذاكرة بدلا من إعادة تحميلها من القرص لكل تنسيق النتيجة. Scene.from_file() اتصلت بـ Multiple scene.save() المكالمات أكثر كفاءة من الحمل المتكرر.
  • عند معالجة الحزم الكبيرة ، قم بإنشاء واحد ObjLoadOptions أو StlSaveOptions مثال واستخدامها مرة أخرى في جميع الملفات بدلا من بناء خيارات جديدة كائن لكل ملف.

خطأ التعامل مع

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

القضايا المشتركة

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

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

ما هي الإصدارات التي تدعمها Python؟? يتم دعم Python 3.7 و3.8 و39.9 و10.311 و4.12 جميعًا.المكتبة هي Python النقية مع عدم وجود امتداد أصلية ، لذلك تعمل على أي منصة حيث يعمل CPython.

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

هل يتم دعم FBX؟? يتم تنفيذ التوكينيز FBX ويمكن أن يقطع تدفق التوكيز الثنائي FB X ، ولكن بناء المسرحية على أعلى التكينيزر لديه أخطاء معروفة وليس جاهزا للإنتاج.

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

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


إشارة API

الفصول الأساسية

  • Scene: حاوية من المستوى العلوي لمشهد 3D. نقطة الدخول ل 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 Per-vertex.
  • VertexElementVertexColor: البيانات اللونية Per-vertex.
  • VertexElementSmoothingGroup: مكونات مجموعة البوليغون.

المواد

  • LambertMaterial: نموذج الشمس المزعجة مع diffuse_color و emissive_color.
  • PhongMaterial: نموذج الظل الضوئي إضافة specular_color و shininess.

أدوات التداول (aspose.threed.utilities)

  • Vector2:2D فيكتور.
  • Vector3:3D وكتور دقة مزدوجة.
  • Vector4:4D وكتور دقة مزدوجة.
  • FVector3:3D وكتور دقة واحدة.
  • 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: كيان مصدر ضوء ، قابل للترابط مع A Node.
 العربية