オブジェクトを回転した後に、
シンメトリモディファイアやミラーモディファイアを掛けると、
反転のための軸が傾いてしまっている。
この傾きを直したい。
ユーティリティーから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をゼロにしたオブジェクトのトランスフォームに対して、
ワールド原点にある様に見えるミラーのトランスフォームを掛ける。
掛ける順番は大事。
ワールド基準のトランスフォーム × 基準となるトランスフォーム
この順番でなければいけない。
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 ヘルプ: 基点調整および変換のリセット メソッド