LoginSignup
0
0

More than 1 year has passed since last update.

MaxScriptで参照オブジェクトのトランスフォームを取得が出来なかった話

Posted at

3DS Maxの作業中に、オブジェクトの数が多くなりすぎてシーンが重くなる為、オブジェクトを外部参照に置き換えて運用する必要がありました。
その際に、MaxScriptで、ポイントヘルパー(Point)のトランスフォームを取得していた箇所が、外部参照オブジェクト(XRefObject)だと上手く行かず、ハマった為にメモとして残しておきます。

使用したオブジェクト

使用したオブジェクトのモディファイアは、以下の画像の通りです。特に特別変なモディファイアが入っている事はありません。
JT_rock1_root_002オブジェクト(外部参照オブジェクト)は、JT_rock1_root_001オブジェクト(ポイントオブジェクト)を外部参照にして配置しているだけで同じものです。

  • 【ポイントオブジェクト】JT_rock1_root_001オブジェクト
    Pointオブジェクト.png

  • 【外部参照オブジェクト】JT_rock1_root_002オブジェクト
    XRefObjectオブジェクト.png

トランスフォームを取得する

MaxScriptのオブジェクトには、トランスフォームに関する情報を取得する方法として、下の方法があります。

プロパティ
$.toransform.position/rotation/scale
$.position/rotation/scale

$ は、何らかのオブジェクトです。
$.toransformは、行列(3x3の浮動小数点数)になっています。

問題

直面した問題の原因としては、大きく二つありました。

  • 外部参照オブジェクト(XRefObject)の $.position / $.rotation / $.scale が正しく取れない
  • \$.rotation と $.transform.rotation がw成分以外逆になったクォータニオンが返って来ている

Point型とXRefObject型のトランスフォームをダンプしてみた結果が下の画像です。
赤い枠は、座標成分で、緑の枠は、回転成分です。

スクリーンショット 2022-08-22 195846.png

まず、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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0