3DS Maxの作業中に、オブジェクトの数が多くなりすぎてシーンが重くなる為、オブジェクトを外部参照に置き換えて運用する必要がありました。
その際に、MaxScriptで、ポイントヘルパー(Point)のトランスフォームを取得していた箇所が、外部参照オブジェクト(XRefObject)だと上手く行かず、ハマった為にメモとして残しておきます。
使用したオブジェクト
使用したオブジェクトのモディファイアは、以下の画像の通りです。特に特別変なモディファイアが入っている事はありません。
JT_rock1_root_002オブジェクト(外部参照オブジェクト)は、JT_rock1_root_001オブジェクト(ポイントオブジェクト)を外部参照にして配置しているだけで同じものです。
トランスフォームを取得する
MaxScriptのオブジェクトには、トランスフォームに関する情報を取得する方法として、下の方法があります。
プロパティ |
---|
$.toransform.position/rotation/scale |
$.position/rotation/scale |
$ は、何らかのオブジェクトです。
$.toransformは、行列(3x3の浮動小数点数)になっています。
問題
直面した問題の原因としては、大きく二つありました。
- 外部参照オブジェクト(XRefObject)の $.position / $.rotation / $.scale が正しく取れない
- \$.rotation と $.transform.rotation がw成分以外逆になったクォータニオンが返って来ている
Point型とXRefObject型のトランスフォームをダンプしてみた結果が下の画像です。
赤い枠は、座標成分で、緑の枠は、回転成分です。
まず、Point型の座標成分は、『$.position』でも『$.toransform.position』でも、一致している事が読み取れます。
また、回転成分も同じく、『$.rotation』でも『$.toransform.rotation』を使用しても、一致しています。
では、外部参照オブジェクトを見ていきます。
XRefObject型の座標成分は、『$.toransform.position』では、正しい数値を返しているみたいですが、『$.position』では、(0,0,0)を返しており、正しく座標情報を返していません。
また、回転成分も同じく、『$.toransform.rotation』と『$.rotation』の結果が一致しておらず、どちらの情報を信じていいのか判断付きません。
原因
- 座標成分
$.toransform.position から読み取れる数値が正しい事が分かった為、こちらをそのまま使用しています。
- 回転成分
< XRefObject >.transform.rotationのxyz成分が反転したクォータニオンを返している事が分かりました。こちらを参考にしました。
その為、< XRefObject >.transform.rotationの符号を反転して使用する事で解決しました。
- 拡大・縮小成分
補足調査で、scaleについても検証しましたが、rotationの用に符号が反転した成分を返す事は無かった為、そのまま使用しています。
参考
* https://discourse.techart.online/t/3ds-max-transform-rotation-issues/926