パーツごとにオブジェクトを分割!3dsMaxスクリプト紹介

パーツごとにオブジェクトを分割!3dsMaxスクリプト紹介

こんにちは、福永です。

今回は「オブジェクト分割」を一瞬で行えるスクリプトを紹介します。
3ds Maxで作業していると、

  • アタッチされたオブジェクトをパーツごとに分けたい

  • 面(ポリゴン)1枚ごとに分けたい

といった場面がありますよね。
手作業だと非常に手間がかかりますが、このスクリプトを使えば一発で解決できます。

スクリプト① 要素別に分割

オブジェクト内の要素(Element)単位で分割できます。
例えば「椅子の脚、アーム、座、背」といったように、要素ごとに自動で切り分けられます。

fn detachEachElement obj =
(
    if classof obj != Editable_Poly do
    (
        messageBox "Editable Poly オブジェクトを選択してください。"
        return false
    )

    local totalFaces = polyop.getNumFaces obj
    local processedFaces = #{}
    
    for f = 1 to totalFaces where not processedFaces[f] do
    (
        -- このフェイスが属する要素全体を取得
        local elementFaces = polyop.getElementsUsingFace obj #{f}
        processedFaces += elementFaces
        
        -- 要素をデタッチ
        polyop.setFaceSelection obj elementFaces
        polyop.detachFaces obj elementFaces delete:false asNode:true
    )

    subObjectLevel = 0
    return true
)

-- 実行
if selection.count == 1 then
(
    detachEachElement selection[1]
)
else
(
    messageBox "1つのオブジェクトを選択してください。"

※実行方法:対象オブジェクトを選択 → スクリプトを実行するだけ。


スクリプト② ポリゴン別に分割

オブジェクトをポリゴン1枚ごとに分割します。
用途は限られますが、モデリング方法によってはかなり時間短縮になります。

-- オブジェクトを取得
selObjs = selection as array

-- 選択チェック
if selObjs.count == 0 then
(
    messageBox "オブジェクトを選択してください。"
)
else
(
    undo "Split Faces" on
    (
        for obj in selObjs do
        (
            -- Editable Poly に変換
            convertToPoly obj
            local faceCount = polyop.getNumFaces obj

            for i = 1 to faceCount do
            (
                -- 新しいオブジェクトを作成して、面を複製
                local newObj = copy obj
                convertToPoly newObj

                -- 対象の1面を保持し、それ以外を削除
                local allFaces = #{1..faceCount}
                local keepFace = #{i}
                local deleteFaces = allFaces - keepFace

                -- 不要な面を削除
                polyop.deleteFaces newObj deleteFaces keep:true

                -- 名前を付ける(元オブジェクト名_面番号)
                newObj.name = obj.name + "_face" + i as string

                -- 表示更新
                update newObj
            )

            hide obj -- 元のオブジェクトは非表示(任意)
        )
    )
    messageBox "面ごとの分割が完了しました。"
)

※実行すると元オブジェクトは自動で非表示になり、フェイス単位のオブジェクトが新しく作られます。使用

まとめ

今回紹介したスクリプトを使うことで、オブジェクト分割の手間を大幅に削減できます。

  • 要素別に分割 → 部品ごとに切り分け可能

  • ポリゴン別に分割 → 面単位で分割できる

モデリングやデータ変換の効率化にぜひ役立ててみてください!


現在シェルパグループでは、一緒に働く仲間を募集中!
建築パース、3DCG、UnrealEngine、Unity、プログラミングに興味のある方は
是非リクルートサイトをご覧ください!

■リアルな3DCG制作の仕事をしたい方必見!
https://sherpa-recruit.jp/