スキニングの話(1)
どうせ暇だしスキニングについて書いてみる。
スキニングとは3Dアニメーションで使われる手法で、ポリゴン内部にボーンを仕込んでおき、ボーンを動かすことでポリゴンを変形させる手法である。
骨格構造はジョイント(関節)の集合である。
そしてジョイントとは単なる点ではなく、ジョイントを原点とする座標系を意味すると考えたほうがよい。それぞれのジョイントに座標系があるわけだ。
各ポリゴンはそれぞれのジョイント(で定義される座標系)からどれだけ影響されているかという重みを与えられている。
ではボーンは何かというと、親子関係のあるジョイント間を線で結んだだけのものである。人間にとってわかりやすくするための便宜上のものといえる。
まず初期姿勢(rest pose)で考えよう。
両手を左右に伸ばして立っているあの姿勢である。
でジョイントを原点とする座標系からモデル空間へ変換行列を表すことにする。
たとえばを原点とする座標系の原点は、モデル空間での座標は、で表すことができる。
同様に、でジョイントを原点とする座標系からジョイントを原点とする座標系に変換する行列としよう。
ジョイントは親から順にと繋がっているとすると、ジョイントを原点とする座標系をモデル空間に変換する行列は、
と書ける。 またモデル空間からジョイントを原点とする座標系への変換は、この行列の逆行列であり、
と書ける。
さてアニメーションとは、を時刻によって刻々と変化させていくことに他ならない。
行列は初期姿勢のときの行列として用いたため、アニメーションにより変化したときの行列はで表すことにしよう。
時刻でのジョイントからモデル空間への変換行列をとする。
同様に
である。
ある初期姿勢でのメッシュ上の点がジョイントにのみ影響されているとしよう。
このとき点の、ジョイントを原点とする座標系での座標は、 となる。
この点を時刻でのモデル空間での座標に変換すると、
となる。これがボーンアニメーションの基本である。
しばしばとまとめて書かれることもある。
ここまでは点がジョイントのみに影響されるとしてきたが、複数のジョイントに影響される場合も同様であり、ジョイントにそれぞれ重みで影響されるとした場合、
とする方法がLinear Blend Skinningである。 この方法は広く用いられ、そしてしばしば問題を引き起こす。(つづく)