本記事内で公開している全ての情報について、その完全性、正確性、適用性、有用性等いかなる保証も行っておりません。
これらの情報のご利用により、何らかの不都合や損害が発生したとしても、当社は何らの責任を負うものではありません。
自己責任でご使用ください。
2018/06/26
前回は『制御する側(ctrlA)』と『制御される側(cubeA)』が同じ軸、位置の場合、についてご紹介しました。
今回は『制御する側(ctrlA)』と『制御される側(cubeA)』が異なる軸、位置の場合、についてご紹介します。
matrixを使用する上で、
アトリビュートと空間について理解しておく必要があります。
よく使用するtranslate、rotate、scaleといったアトリビュートは
「親を基準とした相対値」を表現しています。
例えば、下図のオブジェクト(cube)の原点について考えてみましょう。
cubeには親ノードがありませんが、
仮に『ワールド空間自体がcubeの親』と考えた場合、
cubeのtranslate、rotate、scaleの値は、ワールド空間を基準とした相対値となります。
ワールド空間は三次元空間そのもの(原点はグリッド(0,0,0))の座標なので、
つまり、絶対値(絶対座標)です。
cubeのTranslate、Rotateの値を0にすると、ワールド空間の原点の位置に戻ります。
では次に、cubeが親ノード(cube_space)に格納されているケースで考えてみます。
cube_spaceのアトリビュートには、先ほどのcubeと同じ値が設定されています。
cubeのTranslate、Rotateの値は(0,0,0)です。
この場合、
cubeのtranslate、rotate、scaleの値は、cube_spaceを基準とした相対値となります。
試しにcubeを移動、回転させて、
Translate、Rotateの値を0に戻してみます。
cubeは親(cube_space)の位置に戻ります。
つまり、cube_spaceの空間内(ローカル空間)でのcubeの原点はcube_spaceになります。
次に、cubeを親(cube_space)階層から外してみます。
cubeの親がcube_spaceからワールド空間に変わりました。
もちろん、親の空間がワールド空間に変わったので相対値も変化します。
Translate、Rotateの値を0にすると、ワールド空間の原点の位置に戻ります。
チャンネルボックスに表示されているTranslate、Rotate、Scaleの値は
親を基準とした相対値であることを覚えておいてください。
では、本題に戻ります。
[構成要素]
①今回はコントローラもジオメトリも、それぞれ別の軸、位置に設定されています。
前回の「matrix接続方法」と同様の方法で接続していきましょう。
制御される側のcubeAを複製して、ctrlAにペアレントします。
②複製したcubeA1のアトリビュートを確認します。
先ほどまでは
[tx:ty:tz = 0,0,0]
[rx:ry:rz = 0:0:0]
[sx:sy:sz = 1:1:1]
でしたが、値が変わっています。
cubeA_spaceの階層(空間)から、
軸も位置も異なるctrlAの階層(空間)に移動したためです。
③値に変化があるので、matrix情報をsetAttrする必要があります。
※『matrixその②~matrix接続方法~』記事の「matrixの接続方法」の4番目の内容です。
multMatrixを作成し、multMatrixのmatrixIn[0]に複製したcubeA1のmatrix値をsetAttrします。
④前回と同様、共通の親を探し(今回はdifferentAxisノード)、
制御する側からされる側までのmatrixを接続します。
cubeA1は上記③でmatrix値を取得したので必要ありません。削除しましょう。
⑤あとはTranslateの接続です。
今回のケースでは、ctrlAとcubeAのtranslateを直接接続してはいけません。
試しに接続して挙動を確認します。
ctrlAはctrlA_space空間の相対値(座標)、
cubeAはcubeA_space空間の相対値(座標)
で移動するため、異なる軸で移動することになります。
⑥decomposeMatrixのoutputTranslateとcubeAのtranslateを接続します。
コントローラとジオメトリの軸も位置も異なりますが、
コントローラの全ての挙動がジオメトリに反映されています。
チャンネルボックスに表示されているtranslate、rotate、scaleの値は「親を基準とした相対値」です。
つづく。