كيفية حفظ المشاهد ثلاثية الأبعاد في بايثون
يتيح لك Aspose.3D FOSS for Python حفظ Scene إلى أي تنسيق إخراج مدعوم باستخدام استدعاء Scene.save() واحد. يتم الكشف عن التنسيق تلقائيًا عندما تمرّر مسار ملف؛ بالنسبة للخيارات المتقدمة مثل الإخراج الثنائي أو تضمين القوام، تقوم بتوفير كائن خيارات حفظ مخصص للتنسيق.
دليل خطوة بخطوة
الخطوة 1: تثبيت الحزمة
قم بتثبيت Aspose.3D FOSS من PyPI. لا توجد مكتبات أصلية مطلوبة.
pip install aspose-3d-fossالإصدارات المدعومة من Python: 3.7، 3.8، 3.9، 3.10، 3.11، 3.12.
الخطوة 2: استيراد الفئات المطلوبة
على الأقل تحتاج Scene. استورد المصدّر الخاص بالصيغة أو فئة خيارات الحفظ فقط عندما تحتاج إلى سلوك غير افتراضي.
from aspose.threed import Sceneلخيارات الخاصة بالتنسيق:
from aspose.threed.formats.gltf import GltfSaveOptions, GltfExporter
from aspose.threed.formats.stl import StlFormat, StlSaveOptions
from aspose.threed.formats.fbx import FbxExporter, FbxSaveOptions
from aspose.threed.formats.collada import ColladaExporter, ColladaSaveOptionsالخطوة 3: تحميل مشهد
حمّل مشهدًا موجودًا من القرص باستخدام Scene.from_file(). المكتبة تكتشف تنسيق المصدر تلقائيًا من امتداد الملف. لبناء مشهد من الصفر بدلاً من ذلك، راجع كيفية بناء Mesh في Python.
# Load from an existing file — format auto-detected from extension
scene = Scene.from_file("input.obj")بدلاً من ذلك، افتح مشهدًا بخيارات صريحة عبر Scene.open():
from aspose.threed import Scene
scene = Scene()
scene.open("input.fbx")الخطوة 4: حفظ إلى STL
استدعِ Scene.save() بمسار .stl. بشكل افتراضي يكون الإخراج ASCII STL. لكتابة STL ثنائي (ملف أصغر، بدون رأس قابل للقراءة البشرية) استخدم StlSaveOptions.
# ASCII STL — format detected from the .stl extension
scene.save("output.stl")
# Binary STL — smaller file size
from aspose.threed.formats.stl import StlFormat, StlSaveOptions
stl_format = StlFormat()
options = stl_format.create_save_options()
options.binary_mode = True
scene.save("output_binary.stl", options)الخطوة 5: حفظ إلى glTF أو GLB
يمكن تصدير ملفات GLTF 2.0 باستخدام GltfExporter وGltfSaveOptions. اضبط binary_mode = True لإنتاج حزمة ثنائية .glb مكتفية ذاتيًا؛ اضبط binary_mode = False لتنسيق .gltf القائم على JSON.
import io
from aspose.threed.formats.gltf import GltfExporter, GltfSaveOptions
# Text glTF
options = GltfSaveOptions()
options.binary_mode = False
options.file_name = "output.gltf"
exporter = GltfExporter()
with open("output.gltf", "wb") as f:
stream = io.BytesIO()
exporter.export(scene, stream, options)
f.write(stream.getvalue())
# Binary GLB
options_glb = GltfSaveOptions()
options_glb.binary_mode = True
options_glb.file_name = "output.glb"
stream_glb = io.BytesIO()
exporter.export(scene, stream_glb, options_glb)
with open("output.glb", "wb") as f:
f.write(stream_glb.getvalue())الخطوة 6: حفظ إلى FBX
يتم تصدير مشاهد FBX عبر FbxExporter. استخدم FbxSaveOptions لتمكين الضغط أو تضمين القوام في ملف الإخراج.
from aspose.threed.formats.fbx import FbxExporter, FbxSaveOptions
options = FbxSaveOptions()
options.enable_compression = True
options.embed_textures = False # keep textures as separate files
exporter = FbxExporter()
exporter.save(scene, "output.fbx", options)الخطوة 7: حفظ إلى OBJ أو Collada (DAE)
بالنسبة لـ OBJ و Collada، مرّر مسار الملف مباشرةً إلى Scene.save(). المكتبة تكتشف الصيغة من الامتداد.
# OBJ — format auto-detected from .obj extension
scene.save("output.obj")
# Collada DAE — with material and coordinate-system options
from aspose.threed.formats.collada import ColladaExporter, ColladaSaveOptions
options = ColladaSaveOptions()
options.enable_materials = True
options.flip_coordinate_system = False
options.indented = True
exporter = ColladaExporter()
exporter.export(scene, open("output.dae", "wb"), options)المشكلات الشائعة والحلول
ملف الإخراج فارغ بعد scene.save()
عادةً ما يعني ذلك أن عقدة الجذر للمشهد لا تحتوي على عقد فرعية ذات هندسة. تحقق من أن كل عقدة شبكة تم إرفاقها بـ scene.root_node قبل استدعاء save. تحقق من len(scene.root_node.child_nodes) بعد بناء المشهد.
AttributeError عند بناء هندسة الشبكة
فئة Mesh تخزن الرؤوس كقائمة نقاط تحكم داخلية. للحصول على أنماط بناء الشبكة التفصيلية، راجع مقالة كيفية بناء شبكة في بايثون التي تغطي إنشاء المضلعات، عناصر الرؤوس، وبيانات UV.
إخراج GLB أكبر من المتوقع
Binary GLB يدمج جميع بيانات الهندسة والملمس داخل الملف. إذا تم تعيين GltfSaveOptions.flip_tex_coord_v إلى True، يتم تضمين تمريرة إضافية لقلب الإحداثيات. قم بتعيينه إلى False إذا لم تكن بحاجة إلى قلب نسيج المحور V.
استيراد/تصدير FBX يفقد المواد
تصدير مادة FBX يتحكم به FbxSaveOptions.export_legacy_material_properties. اضبطه على True لكتابة كتل مادة FBX القياسية التي يمكن للأدوات الطرفية قراءتها.
Collada DAE لا يتضمن المواد
قم بتعيين ColladaSaveOptions.enable_materials = True (وهو False بشكل افتراضي) قبل التصدير.
الأسئلة المتكررة
ما الصيغ التي يمكن لـ Aspose.3D FOSS for Python تصديرها؟
تدعم المكتبة التصدير إلى: STL، glTF 2.0 (نص وGLB ثنائي)، FBX، OBJ، Collada (DAE)، و3MF. اكتشاف الصيغة يتم تلقائيًا عندما تمرّر سلسلة مسار ملف إلى Scene.save()؛ تقرأ المكتبة الامتداد لتحديد المصدر المناسب.
هل هناك واجهة برمجة تطبيقات تصدير تدفقية تتجنب الكتابة إلى القرص؟
نعم. GltfExporter.export(scene, stream, options) يكتب إلى أي io.BytesIO أو كائن شبيه بالملف. يمكنك تمرير المخزن المؤقت في الذاكرة مباشرةً إلى استجابة الويب أو معالجة إضافية دون لمس نظام الملفات.
كيف يمكنني تحويل مشهد من تنسيق إلى آخر؟
حمّل المشهد باستخدام Scene.from_file("input.fbx") واحفظه باستخدام scene.save("output.gltf"). تتولى المكتبة التحويل في الذاكرة؛ لا حاجة لملفات وسيطة.
هل يمكنني حفظ مشاهد فرعية متعددة في ملفات منفصلة؟
الوصول إلى scene.sub_scenes للتكرار على كل مشهد فرعي، إنشاء كائن Scene جديد، إرفاق العقد ذات الصلة، واستدعاء save() على كل منها.
هل Scene.save() يكتب فوق الملفات الموجودة بصمت؟
نعم. لا تُصدر المكتبة خطأ إذا كان الملف الهدف موجودًا بالفعل؛ بل تقوم بالكتابة فوقه. أضف فحصًا لوجود الملف في الشيفرة الخاصة بك إذا كنت بحاجة إلى الحماية من الكتابة فوق الملفات عن طريق الخطأ.