パーツごとにオブジェクトを分割!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/









