2018/06/26

matrixその③~異なる軸のノードをmatrixで繋ぐ~

BACKBONEの福本です。
matrix続きです。
まだまだ続きます。

前回は『制御する側(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値は
親を基準とした相対値
であることを覚えておいてください。
では、本題に戻ります。

 

『制御する側(ctrlA)』と『制御される側(cubeA)』が異なる軸、位置の場合

[構成要素]

  • コントローラ(ctrlA)とジオメトリ(cubeA)がdifferentAxisという共通の親ノードに格納されている。
  • コントローラ(ctrlA)とジオメトリ(cubeA)が異なる軸、位置である。
  • コントローラ(ctrlA)の値
    [tx:ty:tz = 0,0,0]
    [rx:ry:rz = 0:0:0
    ]
    [sx:sy:sz = 1:1:1]
  • コントローラの親ノード(ctrlA_space)の値
    [tx:ty:tz = 0,0,0]
    [rx:ry:rz = 90:0:90]
    [sx:sy:sz = 1:1:1]
  • ジオメトリ(cubeA)の値
    [tx:ty:tz = 0,0,0]
    [rx:ry:rz = 0:0:0]
    [sx:sy:sz = 1:1:1]
  • ジオメトリの親ノード(cubeA_space)の値
    [tx:ty:tz = 0.1,-1,0.5]
    [rx:ry:rz = 30:-30:-30]
    [sx:sy:sz = 1:1:1]
  • 赤:X軸、緑:Y軸、青:Z軸

①今回はコントローラもジオメトリも、それぞれ別の軸、位置設定されています。
前回の「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の値は「親を基準とした相対値」です。
つづく。

 

※免責事項※
本記事内で公開している全ての情報について、その完全性、正確性、適用性、有用性等いかなる保証も行っておりません。
これらの情報のご利用により、何らかの不都合や損害が発生したとしても、当社は何らの責任を負うものではありません。
自己責任でご使用ください。


ブログTOPへ戻る