كيفية تحسين نماذج ثلاثية الأبعاد في Python
المشكلة
يمكن أن تكون ملفات النماذج ثلاثية الأبعاد الكبيرة بطيئة في التحميل والنقل. عند العمل مع Aspose.3D في Python، هناك خطوات عملية يمكنك اتخاذها لتقليل حجم الملف وإزالة البيانات غير الضرورية للمشهد؛ أساسًا عن طريق التصدير إلى صيغة ثنائية مضغوطة وتقليم العقد غير المستخدمة من رسم بياني المشهد.
المتطلبات المسبقة
- Python 3.7 أو أحدث
aspose-3d-fossالحزمة مثبتة عبرpip install aspose-3d-foss- ملف إدخال ثلاثي الأبعاد (OBJ، STL، FBX، glTF، أو 3MF)
تقنيات التحسين
تحويل إلى تنسيق ثنائي مضغوط
إحدى أكثر الطرق فعالية لتقليل حجم الملف هي تصدير المشهد إلى ثنائي glTF (.glb). تنسيق GLB يدمج الهندسة والمواد في ملف ثنائي واحد، وهو أصغر بكثير وأسرع في التحميل مقارنةً بالتنسيقات النصية مثل OBJ أو ASCII FBX.
from aspose.threed import Scene, FileFormat
scene = Scene.from_file("model.obj")
scene.save("model.glb", FileFormat.GLTF2_BINARY)فحص وعدّ الشبكات
قبل المعالجة، من المفيد معرفة عدد عقد الشبكة التي يحتويها المشهد. يساعد ذلك في تحديد المشاهد الكبيرة أو المعقدة بشكل غير متوقع.
from aspose.threed import Scene
from aspose.threed.entities import Mesh
scene = Scene.from_file("model.obj")
mesh_count = 0
for node in scene.root_node.child_nodes:
if isinstance(node.entity, Mesh):
mesh_count += 1
print(f" Mesh '{node.name}': {len(node.entity.control_points)} vertices, "
f"{node.entity.polygon_count} polygons")
print(f"Total meshes: {mesh_count}")إزالة العقد غير المستخدمة (المستبعدة)
العقد التي تم وضع علامة استبعاد عليها لا تُظهر. تحديد وتجاوز هذه العقد أثناء التصدير يقلل من بصمة المشهد. ال excluded الخاصية هي خاصية في Entity, ليست استدعاءً للطريقة.
from aspose.threed import Scene
from aspose.threed.entities import Mesh
scene = Scene.from_file("model.obj")
active_nodes = []
for node in scene.root_node.child_nodes:
entity = node.entity
if entity is not None and not entity.excluded:
active_nodes.append(node.name)
print(f"Active (non-excluded) nodes: {active_nodes}")مثال على الكود
هذا المثال يحمل مشهدًا، ويُبلغ عن إحصائيات الشبكة، ويحفظها بتنسيق GLB المدمج: التحسين العملي الرئيسي المتاح عبر Aspose.3D.
from aspose.threed import Scene, FileFormat
from aspose.threed.entities import Mesh
# Load the input model
scene = Scene.from_file("input.obj")
# Inspect mesh count and vertex totals
total_vertices = 0
for node in scene.root_node.child_nodes:
if isinstance(node.entity, Mesh):
mesh = node.entity
total_vertices += len(mesh.control_points)
print(f"Total vertices before export: {total_vertices}")
# Save to compact binary GLB: smaller and faster to load than OBJ
scene.save("output.glb", FileFormat.GLTF2_BINARY)
print("Saved as GLB (binary glTF)")ملاحظات حول نطاق التحسين
Aspose.3D لا يوفر خوارزميات تقليل الشبكة أو خفض عدد المضلعات. يتم تقليل حجم الملف أساسًا من خلال:
- التصدير إلى تنسيقات ثنائية (GLB بدلاً من OBJ أو ASCII FBX)
- تجاوز العقد المستبعدة أو الفارغة أثناء منطق المعالجة الخاص بك
الادعاءات بشأن تحسينات النسبة المئوية المحددة أو تقليل الذاكرة تعتمد على بيانات الإدخال الخاصة بك ولا يمكن ضمانها بشكل عام.