モディファイアのミラー軸を直したい。


オブジェクトを回転した後に、
シンメトリモディファイアやミラーモディファイアを掛けると、
反転のための軸が傾いてしまっている。
この傾きを直したい。

ユーティリティーからXformのリセットを行えば解決できるけど、
オブジェクトのトランスフォームもリセットされてしまう。

オブジェクトのトランスフォームを維持したまま、
ミラーの軸だけリセットしたい。
どうすれば良いか?

▼解決方法
一度だけなら、
モディファイアのトランスフォームに対して、
オブジェクトの反転したトランスフォームを掛ければいい。

何度も処理を行うなら、
単位行列に対して、オブジェクトの反転したトランスフォームを掛けた値を
ミラーモディファイアのトランスフォームに入れれば良い。

▼例
状況:回転したオブジェクトにミラーモディファイア掛けた状態
ミラー軸も傾いている。

ミラーモディファイアを掛けたオブジェクトを選択した状態で、
以下のスクリプトを実行すると、ミラーのトランスフォームが原点に移動する。

hako1 = $.transform
hako2 = matrix3 1
hako3 = hako2 * inverse hako1

mo =  $.modifiers[1]
mo.mirror_center.transform = hako3

↓シンメトリモディファイアの場合のスクリプト

hako1 = $.transform
hako2 = matrix3 1
hako3 = hako2 * inverse hako1

mo =  $.modifiers[1]
mo.mirror = hako3

▼説明

●まずトランスフォームについて
オブジェクトのトランスフォームに対して、
そのオブジェクトの反転したトランスフォームを掛けると、
移動・回転・スケールがリセットされた状態になる。

↑これと同じ。
ミラーのトランスフォームに対して、
オブジェクトの反転したトランスフォームを掛ければ、
原点に行ってくれる。

※原点にある様に見えるだけであって、
数値的には原点にあるわけではない。

※何度も同じ処理を行いたいなら、
単位行列 × オブジェクトの反転したtransform
でなければならない。

ミラーのトランスフォームに対して、
オブジェクトの反転したトランスフォームを掛けて、
ミラー軸がワールド原点にある様に見える値になってくれるのは一度だけ。

何故なら、一度処理を行うと、
ミラーのトランスフォームは単位行列ではなくなるから。
(単位行列というのはまっさらなトランスフォームの事)

ミラーのトランスフォームが単位行列ではなくなると、
二回目からは意図した計算結果にならなくなる。

なので計算する際は、ミラーのトランスフォームを取得せずに、
単位行列 × オブジェクトの反転したtransform
でなければならない。

これなら何度計算しても、
ミラー軸がワールド原点にある様に見える値になってくれる。

▼YとZの位置は維持して欲しい
単純に、ミラーのトランスフォーム位置に、
xの値をゼロにしたオブジェクトのトランスフォーム位置を入力するとズレる。

ミラーのトランスフォームにとって、
基準座標・原点はオブジェクトのトランスフォームなので、
そのままワールド基準の位置を入れようとしてもズレる。

どうすればいいのか?

位置のxをゼロにしたオブジェクトのトランスフォームに対して、
ワールド原点にある様に見えるミラーのトランスフォームを掛ける。

xをゼロにしたオブジェクトのtransform × ワールド原点にある様に見えるミラーのtransform

掛ける順番は大事。
ワールド基準のトランスフォーム × 基準となるトランスフォーム
この順番でなければいけない。

hako1 = $.transform
hako2 = matrix3 1
hako3 = hako2 * inverse hako1

hako4 = matrix3 1
hako4.pos = $.pos
hako4.pos.x = 0

mo = $.modifiers[1]
mo.mirror_center.transform = hako4 * hako3

これでミラーのYとZ位置を維持する事が出来た。

↓コメント付き

hako1 = $.transform
--↑選択したオブジェクトのトランスフォームを変数hako1へ入れる。

hako2 = matrix3 1
--↑単位行列を作り、変数hako2へ入れる。
--単位行列とはまっさらな状態のトランスフォーム

hako3 = hako2 * inverse hako1
--↑変数hako2内のトランスフォームに対して、
--変数hako1内のトランスフォーム(反転したオブジェクトのトランスフォーム)を掛け、
--変数hako3に入れる。

hako4 = matrix3 1
--↑単位行列を作り、変数hako4へ入れる。

hako4.pos = $.pos
--↑変数hako4内のトランスフォームに対して、
--選択したオブジェクトの位置を入れる。

hako4.pos.x = 0
--↑変数hako4内のトランスフォームのx位置をゼロにする。

mo = $.modifiers[1]
--↑上から1つ目のモディファイアを取得し、変数moに入れる。

mo.mirror_center.transform = hako4 * hako3
--↑モディファイアのトランスフォームを、
--変数hako4に変数hako3を掛けた値にする。

↓スクリプトをボタン化
 スクリプトを全選択してツールバーへドラッグ&ドロップするだけ。
 [3dsMax]スクリプトをボタン化する

↓ミラーの位置と回転にスクリプトコントローラーを設定してボタン要らずに。

↓スクリプトコントローラーの中身

▼雑記
初心者向けなんだけど、初心者では解決できない問題だった。

ミラーモディファイアに、
ミラー軸をワールド原点に固定するチェックボックスがあれば良かった。
もしくは、ピックしたノードのトランスフォームをミラー軸として使うとか。

そのうちにMax Creation Graphを使って、そんなモディファイアを作りたい。

▼参考リンク
3ds Max 2019 ヘルプ: ノード変換プロパティ
3ds Max 2019 ヘルプ: ノード変換プロパティの使い方
3ds Max 2019 ヘルプ: Matrix3 値
3ds Max 2019 ヘルプ: 基点調整および変換のリセット メソッド

広告

コメントを残す

メールアドレスが公開されることはありません。

スパム対策用の計算式と画像認証です。↓の欄を入力しないとコメントが出来ません。 *

*