BACKBONE RIG&TA EXPERTS

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

2018/06/26

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

前回は『制御する側(ctrlA)』と『制御される側(cubeA)』が同じ軸、位置の場合、についてご紹介しました。
今回は
『制御する側(ctrlA)』と『制御される側(cubeA)』が異なる軸、位置の場合、についてご紹介します。

 

とその前に!
matrixを使用する上で、アトリビュート空間について理解しておく必要があります。

 


アトリビュートとは

よく使用するtranslate、rotate、scaleといったアトリビュートは「親を基準とした相対座標」を表現しています。
アトリビュート値を [tx:ty:tz = 0,0,0]、[rx:ry:rz = 0:0:0]、[sx:sy:sz = 1:1:1] にすると、親の位置に移動します。

例えば、下図のオブジェクト(cube)の原点について考えてみましょう。

ワールド空間での原点は、グリッドの(0,0,0)の位置です。
cubeには親がなく、『ワールド空間』に存在しています。
仮に『ワールド空間自体がcubeの親』と考えてみます。
アトリビュートは親を基準とした相対座標を表現しているため、
cubeのアトリビュートはワールド空間を基準とした相対座標となります。
(ワールド空間は三次元空間そのものの座標なので、すなわち絶対座標です。
cubeのTranslate、Rotateのアトリビュート値を0にすると、ワールド空間の原点、グリッドの(0,0,0)の位置に戻ります。

 

では次に、cubeが親ノード(cube_space)に格納されているケースで考えてみましょう。
cube_spaceのアトリビュートには、先ほどのcubeと同じ値が設定されています。

 

cubeのTranslate、Rotateのアトリビュート値は共に(0,0,0)です。
アトリビュートは親を基準とした相対座標を表現しているため、
cubeのアトリビュートは、cube_spaceを基準とした相対座標となります。
cubeを移動、回転させてTranslate、Rotateのアトリビュート値を0にすると、cubeの親であるcube_spaceの位置に戻ります。
cube_spaceはcubeのローカル空間での原点といえます。


 

cubeを階層から外してみます。
cubeの親がcube_spaceからワールド空間に変わったため、Translate、Rotateのアトリビュート値が変わります。
cubeのTranslate、Rotateのアトリビュート値を0にすると、ワールド空間の原点
の位置に戻ります。

 

このように、親によってアトリビュートの値が変化することを覚えておいてください。
では、本題に戻ります。

 


~『制御する側(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]

・青:Z軸、赤:X軸、緑:Y軸
①今回はコントローラもジオメトリもそれぞれ別の軸、位置に設定されています。
前回の「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の階層(空間)に移動したためです。

 

③アトリビュート値に変化があるので、multMatrixにmatrix情報をsetAttrする必要があります。
multMatrixを作成し、multMatrixのmatrixIn[0]に複製したcubeA1のmatrix値をsetAttrします。

 

④あとは前回と同様、共通の親を探し(今回はdifferentAxisノード)、制御する側からされる側まで
multMatrixとdecomposeMatrixで繋ぎます。
cubeA1は上記③でmatrix値を取得したので必要ありません。削除しましょう。

 

⑤あとはTranslateです。
今回のケースではctrlAとcubeAのtranslateを直接繋いではいけません。
試しに繋いで挙動を確認してみます。

ctrlAはctrlA_space空間内での相対座標として移動、
cubeAはcubeA_space空間内での相対座標として移動するため、
異なる軸で移動することになります。


⑥decomposeMatrixのoutputTranslateとcubeAのtranslateを繋いで完成です。
コントローラとジオメトリの軸も位置も異なりますが、コントローラの全ての挙動がジオメトリに反映されています。

つづく。

 

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