リギングのメモを公開したり、出力したモーションがズレたり反転したりする問題との格闘のお話。
5/11追記:下記の足バタつきの問題は直りました。たぶん人生で一番内積が役に立った瞬間
いままでオイラー角に変換してから回転を代入して符号反転を防ぐ仕組みだったんですが、それでは不完全でした。
テキストに書き込む手前のクォータニオンのデータをappendでリスト(CompareRotationKey)に足していって、リストから前のキーと今のキーの内積を求めて、負なら符号を反転します。
これでクォータニオンで表現できる回転位置の二通りのうち、最小の経路が求まります。
このブログを参考にしました。
500行目あたりに以下のコードを追加してます。オイラー角のくだりは要らないのでコメントアウト。
TEMP.rotate(CurrentRotationMatrix) #ボーン初期回転をそのまま代入
CompareRotationKey.append(TEMP) #リストに書き込み前のデータを足す
BeforeKey = CompareRotationKey[CompareCounter-1] #前のキーを取得
CurrentKey = CompareRotationKey[CompareCounter] #今のキーを取得
if CurrentKey.dot(BeforeKey) < 0.0: #前のキーと今のキーで内積を求めて0未満なら
TEMP.negate() #符号の反転
CompareCounter += 1 #カウンターを1つ追加
UC用にいっそモーションつくり直すついでに全部2.7環境に持ってこよう全部リギングしてN3スクリプト書きなおしてとかやってました。
その過程のメモをとってて、本当にメモなので全然体裁整えてないですけど、それでも役に立つ時が来ると思って公開します。
リギングはモーション作るための事前の準備(セットアップ)だと思ってください。専門職があるぐらいには本当にややこしいです。
リギングメモ
大体はメモに書いたのであんまり書くことはないですが、GW中はズレる問題とフリップ問題について取り組んでました。
180度でフリップ起きるのはしょうがないですけど、そうではない箇所でもおきるようになってて、今はそれに頭悩ませてます。以下のドラウグルのような主に足が回ってしまう感じ。
zBonekeys.txtを見ると確かに符号が反転する箇所があるのでこれができるだけないように変換を変えたいところなんですが数学的な知識と、プログラミングの知識が足りずよく分からないです。 Blender上ではもちろん問題無いですが・・・。
>あすくまんさん
根源的には似たような現象なんですけど、
見た目同じでも数値上で二通りあるときに、補完距離が長い方選択してしまうから起きてるっぽいんですよね。変換式で解決できるといいのですが…
私もアニメーションを作っている際に足だけでなく手でも動画のような現象を見たことがありますが、たいていTGT_ForearmやController_Footを無理な角度や位置にしていて、そっちまで関節がまがらないよーってな具合で暴れているような感じでした。
blender上でも無理なひねりとして異常なサインがあらわれていて、そういった場合は手や足、肘膝を無理のない角度や位置に修正したらたいてい治まるので、おっしゃっているような不具合とは似て非なる現象なんだろうなー・・・
という素人の感想でした。