arXiv探訪

興味の赴くままに数学するだけ

自前のボーン(スキニング)アニメーション

ディズニー研究所? の論文

Binh Huy Le, Jessica K.Hodgins. Real-time Skeletal Skinning with Optimized Centers of Rotation. Disney Research.

を見つけて、試したくなりUnityで組んでみた。

一般的なソフトウェアで使われるLBS(Linear Blend Skinning)はボーンの変換行列にウェイトを掛けて頂点の位置を決定する手法。数学的にも簡単でハードウェア上に回路として実現できるので高速に実行できる。欠点は関節付近の変形が著しいのと、ウェイトを付ける作業がとんでもなく大変だということ。怠るとモデルの肩がぶっ壊れたりする。ただ骨格を上手く作ったり職人レベルのウェイト付けで回避はできる。

論文の主法は、Optimized Centers of Rotationを事前計算することで、LBSと同程度の計算量で破綻の少ない変形を可能にするというもの。ウェイトに「近さ」を導入して、その「近さ」で重み付けられたLBSとのズレが最小になるように変形する。……と書いても良く分からないと思うので詳しくは論文を見てね。

で、Unityでの実装なんだけど、LBSはそれなりにできた(と思う)。しかしUnity上での行列やクォータニオンの扱い方がいまいちよく分からないのと、Unityが行列演算に滅法弱いということが判明したので、OCoRの方は正直ちゃんと出来ているのかすら良く分からない。

f:id:mathmathniconico:20170310213108p:plain

f:id:mathmathniconico:20170310213114p:plain

f:id:mathmathniconico:20170310213116p:plain

f:id:mathmathniconico:20170310213118p:plain

f:id:mathmathniconico:20170310213120p:plain

紫色の四角形がボーン。二番目と三番目の角度がパラメータで、上から(0, 0)(初期状態), (45, 0), (45, 45), (90, 45), (90, 90)(度)となっている。白丸がLBSによる頂点、青丸がOCoRによる頂点。

頂点が少ないからか、やり方が間違っているのか、OCoRでの位置がLBSと殆ど変わらない。わずかにゆとりがある程度だろうか。うーむ、やはりちゃんとしたモデルでテストするべきなのかもしれない。

ところで、新しいゲームエンジンXenkoが4月にリリースされるみたい。Unityと同じくC#で開発できる。APIマニュアル見る限り、行列演算が充実してて便利そう。ちゃんと組むならこっちでやりたいかも。

それまでにクォータニオンも勉強しなきゃだなぁ。

29.線型無関連

目次

まだ公開していないPDFにおいて、前回の記事の最後に、有限次ガロア拡大における「縦」の関係について加筆しました。ブログ上では更新するつもりはないので簡単に述べておくと、有限次ガロア拡大{ L/K }の中間体{ E }に対し、{ E/K }ガロア拡大となる同値条件({ \Phi(E)\lhd\mathrm{Aut}L/K })と、そのとき成り立つ群の完全系列

{ 1\rightarrow\mathrm{Aut}L/E\rightarrow\mathrm{Aut}L/K\rightarrow\mathrm{Aut}E/K\rightarrow 1 }

の証明です。

で、今回は「横」の関係を調べてみようという話になります。

線型無関連

一般的な拡大の状況を考える。{ \Omega/k }を体の拡大、{ K, L }をその中間体とする。{ K }{ L }に対して線型無関連(linearly disjoint)とは、{ k }上一次独立な{ x_{1}, \dotsc, x_{n}\in K }が、{ KL }において{ L }上一次独立であることをいう。*1

命題 以下は同値である。

  • { K }{ L }に対して線型無関連。
  • { L }{ K }に対して線型無関連。

(証明)上から下を示せば十分である。{ y_{1}, \dotsc, y_{n}\in L }{ k }上一次独立とし、{ x_{1}, \dotsc, x_{n}\in K }により{ x_{1}y_{1}+\dotsb+x_{n}y_{n}=0 }{ KL }で成り立つとする。{ (x_{1}, \dotsc, x_{n})\neq (0, \dotsc, 0) }と仮定すれば、並び替えて{ x_{1}, \dotsc, x_{r} }が一次独立で、{ x_{i}=\sum_{j=1}^{r}a_{ij}x_{j} }と表せる。

{ \begin{align*}\sum_{i=1}^{n}x_{i}y_{i} &= \sum_{i=1}^{n}\sum_{j=1}^{r}a_{ij}x_{j}y_{i} \\ &= \sum_{j=1}^{r}\left(\sum_{i=1}^{n}a_{ij}y_{i}\right)x_{j} = 0 \end{align*} }

だが、仮定より{ x_{1}, \dotsc, x_{r}\in KL }{ L }上一次独立なので{ \sum_{i=1}^{n}a_{ij}y_{i}=0 }を得る。ところが{ y_{1}, \dotsc, y_{n}\in L }{ k }上一次独立だから{ a_{ij}=0 }を得る。これは矛盾する。{ \square }

以上により{ K }{ L }{ k }上線型無関連と言うこともできる。

さて、{ KL }{ K, L }より作られる{ \Omega }内の部分代数であるが、実はもう一つ代数を考えることができる。それは既に述べた{ K }{ L }テンソル{ K\otimes_{k}L }である。一般にテンソル積の普遍性より、{ k }-代数準同型({ K, L }-代数準同型とも見なせる。){ \gamma:x\otimes y\mapsto xy }を定めることが出来る。特にこれは全射だが、実は{ K }線型無関連なら単射となる。実際{ \sum x_{i}y_{i}=0 }とすれば、先ほどの証明と同様に{ x_{i}=\sum_{j=1}^{r}a_{ij}x_{j} }としてよく、

{ \begin{align*} \sum_{i}x_{i}\otimes y_{i} &= \sum_{i}\left(\sum_{j=1}^{r}a_{ij}x_{j}\right)\otimes y_{i} \\ &= \sum_{j}x_{j}\otimes\left(\sum_{i}a_{ij}y_{i}\right) \end{align*} }

より{ \gamma }で写せば

{ 0=\sum_{i}x_{i}y_{i}=\sum_{j}x_{j}\left(\sum_{i}a_{ij}y_{i}\right)=0 }

となるが、{ x_{1}, \dotsc, x_{r} }{ KL }上一次独立であることから{ \sum_{i}a_{ij}y_{i}=0 }が従う。故に{ \sum_{i}x_{i}\otimes y_{i}=\sum_{j}x_{j}\otimes 0=0 }となる。

では逆に{ \gamma:K\otimes_{k}L\rightarrow KL }単射のとき、{ K, L }は線型無関連となるだろうか。実は正しいのだが、それを証明するためにはテンソル積を具体的に見る必要がある。

体上のテンソル

まず次の補題を示しておく。

補題 { R }を環、{ M, N }{ R }-加群とする。{ \sum_{i}x_{i}\otimes y_{i}=0 }のとき、ある有限生成な部分加群{ M_{0}\subset M, N_{0}\subset N }が存在して、{ \sum_{i}x_{i}\otimes y_{i}=0 }{ M_{0}\otimes_{R}N_{0} }において成り立つ。

(証明)加群テンソル積の具体的な構成を思い出してみよう。{ M\otimes_{R}N }は、{ M\times N }を添え字とする自由加群{ F }を、ある部分加群{ Z }で割ることで作ることができた。{ \sum (x_{i}, y_{i})\mapsto 0 }だから、これは{ Z }の元である。従って{ Z }の生成系の有限和として書ける。つまり

{ \begin{align*} \sum (x_{i}, y_{i}) = \sum_{\mathrm{finite}} &\lambda^{m, m^{\prime}}_{n}( (m+m^{\prime}, n)-(m, n)-(m^{\prime}, n) ) \\ & +\lambda^{m}_{n, n^{\prime}}( (m, n+n^{\prime})-(m, n)-(m, n^{\prime}) ) \\ & +\mu^{\alpha}_{m, n}( (\alpha m, n)-\alpha(m, n) ) \\ & +\mu^{m, n}_{\alpha}( (m, \alpha n)-\alpha(m, n) ) \end{align*} }

と表せる。ここで現れた元を用いて{ M_{0}=\langle m, m^{\prime}\rangle, N_{0}=\langle n, n^{\prime}\rangle }と置けばよい。{ \square }

この補題により、テンソル積の議論は本質的に有限生成な状況に落とし込めることが分かる。

命題 { k }を体、{ U, V }{ k }上のベクトル空間とし、基底を{ (u_{i}), (v_{j}) }とする。このとき{ u_{i}\otimes v_{j} }{ U\otimes_{k}V }の一次独立な生成系(つまり{ U\otimes_{k}V }はベクトル空間でありその基底)をなす。

(証明){ W:=k^{mn} }として、双線型写像{ \left( \sum_{i}a_{i}u_{i}, \sum_{j}b_{j}v_{j} \right)\mapsto\sum_{ij}a_{i}b_{j}e_{ij} }を定める。(ただし{ e_{ij} }{ W }の基底。)普遍性より{ f:U\otimes_{k}V\rightarrow W }を得るが、これは明らかに全射である。また

{ 0=f\left(\sum c_{ij}u_{i}\otimes v_{i}\right)=\sum c_{ij}e_{ij} }

より{ c_{ij}=0 }が従うので単射であることも分かる。{ \square }

定理 { \Omega/k }を体の拡大、{ K, L }をその中間体とする。以下は同値である。

  • { K }{ L }は線型無関連である。
  • { \gamma:K\otimes_{k}L\rightarrow KL }は同型である。

(証明)上の議論より{ \gamma }単射なら線型無関連であることを示せば良い。{ x_{1}, \dotsc, x_{n}\in K }{ k }上一次独立とする。もし{ L }上一次独立でないなら、{ \sum x_{i}y_{i}=0 }となる非自明な{ y_{i} }が存在する。このとき{ f\left(\sum_{i}x_{i}\otimes y_{i}\right)=\sum_{i}x_{i}y_{i}=0 }だから、単射性より{ \sum_{i}x_{i}\otimes y_{i}=0 }を得る。補題より、有限生成な部分加群{ K_{0}, L_{0} }が取れて、{ K_{0}\otimes_{k}L_{0} }において{ \sum_{i}x_{i}\otimes y_{i}=0 }が成り立つ。{ K_{0}, L_{0} }はベクトル空間なので、特に{ L_{0} }の基底{ (\omega_{j}) }が取れる。今{ y_{i}=\sum_{j}c_{ij}\omega_{j} }と表せるとすると、

{ 0=\sum_{i}x_{i}\otimes y_{i}=\sum_{i, j}c_{ij}x_{i}\otimes\omega_{j} }

となる。ところで{ (x_{i}) }{ k }上一次独立なので部分空間を張り、命題より{ x_{i}\otimes\omega_{j} }はその基底となる。故に{ c_{ij}=0 }が従う。つまり{ y_{i}=0 }となり矛盾する。{ \square }

加群テンソルは一見良く分からない対象かもしれないが、体をモデルとすることで具体的な形を見ることができる。例えば{ K/k, L/k }が代数拡大なら、{ KL }の元も代数的である。つまり可逆であるから{ KL }は体を為す。特に{ K }{ L }が線型無関連でもあれば{ K\otimes_{k}L }は体を為すことが分かる。

一般に、{ K }{ L }{ k }上線型無関連なら{ K\cap L=k }が成り立つ。実際{ x\in K\backslash k }に対して{ 1, x }{ k }上一次独立となるから、線型無関連より{ L }上も一次独立となる。しかし{ x\in K }なら{ (-x)1+x=0 }となり矛盾する。逆は一考の価値があるがここではやらない。

所感

ちょっと量的に少ないので後で加筆するかもしれないし、しないかもしれない。

*1:{ KL }の代わりに{ \Omega }でも構わない。重要なのは{ L }の方。