夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

BlenderPythonでメッシュをフォーマットを指定してエクスポートする

本日はBlender Python枠です。

BlenderではワールドメニューからGUIを使用してオブジェクトを他ツールで使用できるフォーマットでエクスポートすることができます。

 今回はGLFT,OBJ,USDZの拡張子について、それぞれPythonスクリプトでのエクスポート方法を見ていきます。

 スクリプトでのエクスポート方法は自作のアドオンなどに使用できます。

〇FBX形式でのエクスポート

FBX形式については以前に取り組んでいます。

redhologerbera.hatenablog.com

〇GLTF形式でのエクスポート

GLTF形式でのエクスポートは次のような実装になります。

import bpy

#選択中のオブジェクトを取得
obj = bpy.context.active_object

# メッシュであることを確認
if obj.type == 'MESH':
    # エクスポートパス
    export_path = "C:/tmp/test.gltf".format(obj.name)

    # エクスポートの実行
    bpy.ops.export_scene.gltf(filepath=export_path)

    print(f"{obj.name} was successfully exported to {export_path}")
else:
    print("The active object is not a mesh.")

このコードを実行するとtest.glbという名前でGLTF形式のモデルがエクスポートされます。

ここでの肝は次の一文です。

    bpy.ops.export_scene.gltf(filepath=export_path)

bpy.opsBlenderの操作を行うAPIですがexport_sceneはBlenderで提供されているフォーマットでシーンを書き出すことができます。

今回はgltf()と指定しており、gltf形式でエクスポートをしています。

引数は今回はファイルパスのみを指定していますが、次のようなオプションが使用できます。

bpy.ops.export_scene.gltf(filepath='', check_existing=True, export_import_convert_lighting_mode='SPEC', gltf_export_id='', export_use_gltfpack=False, export_gltfpack_tc=True, export_gltfpack_tq=8, export_gltfpack_si=1.0, export_gltfpack_sa=False, export_gltfpack_slb=False, export_gltfpack_vp=14, export_gltfpack_vt=12, export_gltfpack_vn=8, export_gltfpack_vc=8, export_gltfpack_vpi='Integer', export_gltfpack_noq=True, export_format='', ui_tab='GENERAL', export_copyright='', export_image_format='AUTO', export_image_add_webp=False, export_image_webp_fallback=False, export_texture_dir='', export_jpeg_quality=75, export_image_quality=75, export_keep_originals=False, export_texcoords=True, export_normals=True, export_gn_mesh=False, export_draco_mesh_compression_enable=False, export_draco_mesh_compression_level=6, export_draco_position_quantization=14, export_draco_normal_quantization=10, export_draco_texcoord_quantization=12, export_draco_color_quantization=10, export_draco_generic_quantization=12, export_tangents=False, export_materials='EXPORT', export_unused_images=False, export_unused_textures=False, export_colors=True, export_attributes=False, use_mesh_edges=False, use_mesh_vertices=False, export_cameras=False, use_selection=False, use_visible=False, use_renderable=False, use_active_collection_with_nested=True, use_active_collection=False, use_active_scene=False, export_extras=False, export_yup=True, export_apply=False, export_shared_accessors=False, export_animations=True, export_frame_range=False, export_frame_step=1, export_force_sampling=True, export_animation_mode='ACTIONS', export_nla_strips_merged_animation_name='Animation', export_def_bones=False, export_hierarchy_flatten_bones=False, export_hierarchy_flatten_objs=False, export_armature_object_remove=False, export_optimize_animation_size=True, export_optimize_animation_keep_anim_armature=True, export_optimize_animation_keep_anim_object=False, export_negative_frame='SLIDE', export_anim_slide_to_zero=False, export_bake_animation=False, export_anim_single_armature=True, export_reset_pose_bones=True, export_current_frame=False, export_rest_position_armature=True, export_anim_scene_split_object=True, export_skins=True, export_influence_nb=4, export_all_influences=False, export_morph=True, export_morph_normal=True, export_morph_tangent=False, export_morph_animation=True, export_morph_reset_sk_data=True, export_lights=False, export_try_sparse_sk=True, export_try_omit_sparse_sk=False, export_gpu_instances=False, export_action_filter=False, export_nla_strips=True, export_original_specular=False, will_save_settings=False, export_hierarchy_full_collections=False, filter_glob='*.glb')

docs.blender.org

USDZ形式でのエクスポート

bpy.ops.export_sceneではfbxやgltfをエクスポートできますが、USDZの場合はexport_sceneに含まれていません。

そのためwm.usd_export(filepath)を使用します。

Wm Operators - Blender Python API

wmとはウィンドウマネージャーを意味します。

USDZのエクスポートするコードは次のようになります。

import bpy

# Select the active object
obj = bpy.context.active_object

# Check if the active object is a mesh
if obj.type == 'MESH':
    # Set the export path
    export_path = "C:/tmp/test.usdz".format(obj.name)

    # Export the selected mesh to USDZ
    bpy.ops.wm.usd_export(filepath=export_path)

    print(f"{obj.name} was successfully exported to {export_path}")
else:
    print("The active object is not a mesh.")

このコードを実行することで選択中のメッシュがusdzとして出力されます。

本日は以上です。