Rhino+Grasshopper

【Rhino+Python】Rhino 8で各レイヤごとにFBX形式でUE5にエクスポートするスクリプトの使い方

レイヤ構造をUE5のアクターと同じ構造にする。

Rhino8のレイヤ構造

椅子のレイヤ構造

親ディレクトリ子1 ディレクトリ子2 ディレクトリ
ChairSeat
Legs
Leg_Frame
Cushion
各種FBXデータ

PCのレイヤ構造

親ディレクトリ子1 ディレクトリ子2 ディレクトリ
PCBody_Base
Body_Maine
Light
Glass
各種FBXデータ

ドアのレイヤ構造

親ディレクトリ子1 ディレクトリ子2 ディレクトリ
DoorWindow_Frame
Window
Board
Door_Knob
Door_Latch
Hinge
各種FBXデータ
Door_FrameHinge
Frame
各種FBXデータ

各レイヤごとにFBX形式でエクスポート

FBX形式でエクスポートする場合はDCCツールからUE5にエクスポートする必要があります。

一つ一つのレイヤのオブジェクトをエクスポートしていってはエクスポートだけにかなりの時間を有してしまいます。

例えば、椅子1つにつき、6レイヤあるとすれば、6回オブジェクトをエクスポートしなくてはなりません。その場合は、1回につき約30秒としても180秒(3分)かかります。さらに、フォルダの作成をする時間も必要なので、+3分として、インテリアエレメントのエクスポートにかかる時間が1つあたり約6分ほどかかると推定できます。

一つの部屋をエクスポートすることを考えると、インテリアエレメントの数×6分程度かかるということになります。インテリアエレメントが仮に30個だとしても180分(3時間)もの時間がエクスポートにかかってしまう計算になります。

これをワンクリック(約10秒)で済ませるスクリプトを以下の記事で紹介しております。

スクリプトの概要

このスクリプトは、指定したディレクトリ(Documents)に各レイヤごとにフォルダを作成し、その中に対応するFBXファイルをエクスポートします。親レイヤおよびその子レイヤもすべて処理します。

スクリプト

以下が、実際のスクリプトです。必要な部分をコピーして、Pythonスクリプトエディタに貼り付けてください。

import rhinoscriptsyntax as rs
import os

def export_layers_to_fbx(base_export_directory, origin):
    def create_directory(path):
        if not os.path.exists(path):
            os.makedirs(path)

    def export_layer_objects(layer, export_directory, origin):
        objects = rs.ObjectsByLayer(layer, True)
        if objects:
            rs.SelectObjects(objects)
            fbx_filename = os.path.join(export_directory, f"{layer.replace('::', '_')}.fbx")
            rs.Command(f'-_Export "{fbx_filename}" _Origin {origin[0]},{origin[1]},{origin[2]} _Enter _Enter', True)
            rs.UnselectAllObjects()

    def process_layers(layers, parent_layer="", parent_directory=base_export_directory, exported_layers=set()):
        for layer in layers:
            if parent_layer and not layer.startswith(parent_layer + "::"):
                continue
            sublayers = [l for l in layers if l.startswith(layer + "::") and l != layer]
            if rs.IsLayerVisible(layer) and layer not in exported_layers:
                current_layer_path = os.path.join(parent_directory, layer.replace("::", "_"))
                create_directory(current_layer_path)
                export_layer_objects(layer, current_layer_path, origin)
                exported_layers.add(layer)
                if sublayers:
                    process_layers(sublayers, layer, current_layer_path, exported_layers)

    layers = rs.LayerNames()
    if not layers:
        print("No layers found.")
        return

    process_layers(layers)

# エクスポート先のディレクトリを指定(任意のフォルダのパスを指定)
base_export_directory = r"任意のフォルダのパスを指定"

# ユーザーに原点を指定してもらう
origin = rs.GetPoint("Specify origin point for export")
if origin:
    export_layers_to_fbx(base_export_directory, origin)
else:
    print("Export cancelled. No origin point specified.")

スクリプトの説明

  1. import os: Pythonの標準ライブラリosをインポートします。これにより、ファイルパスの操作が可能になります。
  2. create_directory 関数: 指定されたパスのディレクトリが存在しない場合に作成します。
  3. export_layer_objects 関数: 指定されたレイヤのオブジェクトを選択し、FBX形式でエクスポートします。
  4. process_layers 関数: レイヤ階層を再帰的に処理し、親レイヤおよびその子レイヤごとに対応するフォルダを作成し、各レイヤのオブジェクトをそのフォルダにFBX形式でエクスポートします。
  5. base_export_directory: エクスポート先のベースディレクトリをDocumentsに設定します。

実行手順

  1. Rhinoを管理者権限で実行する: Rhinoのショートカットを右クリックし、「管理者として実行」を選択します。
  2. Pythonスクリプトエディタを開く: Rhinoを開き、コマンドラインに「EditPythonScript」と入力し、Enterキーを押します。
  3. スクリプトを読み込む: エディタ内で「ファイル」→「開く」を選択し、保存したスクリプトファイルを開きます。
  4. スクリプトを実行: スクリプトを開いた状態で、エディタの上部にある「実行」ボタンをクリックします。これでスクリプトが実行され、デスクトップ上の「RhinoExports」フォルダに各レイヤおよびその子レイヤごとのフォルダが作成され、各フォルダに対応するFBXファイルがエクスポートされます。

スクリプトの使い方

  1. Rhinoを管理者権限で実行する:
  • Rhinoのショートカットを右クリックし、「管理者として実行」を選択します。
  1. Pythonスクリプトエディタを開く:
  • Rhinoを開き、コマンドラインに「EditPythonScript」と入力し、Enterキーを押します。これでPythonスクリプトエディタが開きます。
  1. スクリプトを読み込む:
  • スクリプトエディタ内で「ファイル」→「新規作成」を選択し、新しいスクリプトを作成します。その後、上記のスクリプトをエディタにコピー&ペーストします。
  1. スクリプトを実行する:
  • スクリプトを開いた状態で、エディタの上部にある「実行」ボタンをクリックします。これでスクリプトが実行されます。

結果の確認

スクリプトが正しく実行されると、デスクトップ上に「RhinoExports」というフォルダが作成され、その中に各レイヤごとのフォルダが作成されます。それぞれのフォルダには、対応するレイヤのオブジェクトがFBX形式で保存されています。

まとめ

このスクリプトを使うことで、Rhino 8で複数のレイヤにわたる3Dモデルを簡単にFBX形式でエクスポートすることができます。これにより、Rhino8からUnreal Engineへのエクスポートする際の手順を短縮することができます。

-Rhino+Grasshopper
-, ,