الخصائص والوظائف
يوفر 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 الوحدة توفر جميع أنواع الرياضيات الهندسية اللازمة لبناء المسرح والتفتيش.
| الفصول الدراسية | الهدف |
|---|---|
Vector2 | 2D floating-point vector (UV coordinates) |
Vector3 | 3D double-precision vector (positions, normals) |
Vector4 | 4D double-precision vector (homogeneous coordinates) |
FVector3 | 3D single-precision vector (compact storage) |
Quaternion | التمثيل الدوار دون قفل جيمبال |
Matrix4 | 4×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}")تحميل و حفظ الخيارات
كل تنسيق مدعوم لديه فئة الخيارات المقابلة التي تسيطر على سلوك التفريغ والتسلسل.
| الفصول الدراسية | شكل | الممتلكات الرئيسية |
|---|---|---|
ObjLoadOptions | OBJ | enable_materials, flip_coordinate_system, normalize_normal, scale |
StlSaveOptions | STL | الوضع الثنائي 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()اتصلت بـ Multiplescene.save()المكالمات أكثر كفاءة من الحمل المتكرر. - عند معالجة الحزم الكبيرة ، قم بإنشاء واحد
ObjLoadOptionsأوStlSaveOptionsمثال واستخدامها مرة أخرى في جميع الملفات بدلا من بناء خيارات جديدة كائن لكل ملف.
خطأ التعامل مع
- الرافعة
scene.open()وscene.save()مكالمات فيtry/exceptالكتل عند معالجة الملفات غير الموثوق بها أو المستخدم.إبلاغ اسم المجلد في استثناء الرسائل لتبسيط التفريغ في الأنابيب المجموعة.
القضايا المشتركة
| مسألة | سبب | القرار |
|---|---|---|
| يظهر الماس بعد تحميلها | نظام التنسيق المختلطة | التعاون ObjLoadOptions.flip_coordinate_system |
| العادة هي صفر الطول | الملفات المصدرية لديها غير طبيعية | مجموعة ObjLoadOptions.normalize_normal = True |
| المواد غير المحمولة من OBJ | enable_materials تم وضعها على False | مجموعة ObjLoadOptions.enable_materials = True (هذا هو بالفعل الافتراض) |
| المشهد يحمل ولكن جميع العقد فارغة | الملفات باستخدام تنسيق FBX | FBX بارسر في التقدم؛ استخدام 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: كيان مصدر ضوء ، قابل للترابط مع ANode.