2010-05-14
■[M3G] ノードのアライメント
アライメントはビルボードとかある軸に対して整列させたい時に使用する。
M3GではsetAlignment()で対象を指定し、align()メソッドを呼ぶと整列する。
アライメント対象はseAlignment()で指定するかalign()の引数で毎回指定しても良い。
アライメントの一般的なルールは
- z軸を合わせる
- y軸を合わせる
計算式はM3Gの仕様書に載っているので読めばわかる。
ごく普通に回転軸と回転角度を計算しているだけ。
計算中は行列で行うので格納するときにangle-axis形式に直す。
(実は結構めんどくさくて行列を一回クォータニオンにしてからangle-axis形式にしないといけない)
ちゃっちゃと実装してしまおう。
■[株式] 今日の日経平均株価。
このところ乱降下してますね。強気と弱気が1日単位で入れ替わる感じ。
基本的に経済は回復しつつあるので心配する必要はないと思うが。
10,440.63 ▼ −179.92 (−1.694%) 始値 10,453.40 高値 10,468.15 安値 10,414.44
■[M3G] matrix2quaternion
Game Engine Architectureに乗っているコードをそのまま写したら何か変。
AngleAxis形式で120,(1,0,0)を表す回転行列を作って matrix2quat でクォータニオンに変換して表示すると 240,(-1,0,0)と表示される。
右回りも左回りも最終的な到達地点は同じなのでアライメントの実装には何も問題はないが
matrix2quat の実装としては不十分な気がする。
……いろいろ考えたが別にこれで不都合は出ないような気がする。これで良しとしよう。
数値計算上の誤差が出る
やっぱりどうしても計算途中であり得ない値になる場合がある。
内積計算の dot(a,b) がマイナスになるのが何とも。aとbが垂直の時0が最低だろうと思いきや-0.00000001ぐらいになる時がある。あと1.0を超えることもある。やっぱり計算するたびに(0,1)にクランプしないと駄目だな。
ただ毎回やるのもCPUがもったいない話で。
単位クォータニオンの回転軸が失われる問題
回転軸(1,0,0),回転角度0をクォータニオンにすると(0,0,0),1 回転軸が失われるのが問題だ。
これはクォータニオンの性質上回避できない。
問題はM3Gの仕様上TransformableクラスのsetOrientationがAngleAxisフォームで
180度回転が難しい
どうしても外積が0になるので回転軸が定まらない。
というかぴったり0になってくれない。うーむ。
仕様書には
if the target vector and the axis are opposite, the exact rotation path is impolementation dependent, but must be deteministic.
と書いてあるから=0の時だけ特別扱いしてやればいいはず。
あとこれだけ直せば完成のハズ……
■[M3G] Node::align()の実装
出来た。ハズ。0とか180とか値も処理できる。
しかし数字だけ見ていても合っているのか間違えているのかよく分からない。
やはりウォークスルーシステムを作らないと確認にならない。
しばらく休憩したら作る。
ウォークスルー
中央の1枚が通常の板ポリ、左右の2枚がカメラにZ軸をalignしている。
うーーん、残念バグっている。
180度を超えて回転すると斜める(?)。
いや違うな120〜210度の間がバグっている。
またけったいなバグを……
matrix2quatが間違えているで確定。
さて何を間違えたか……
--> OK.直した。ちょっと実装をミスった
Zアライメント無し、Yアライメント有り
重大なことに気がついた。
基本的には(1)Z軸を合わせて(2)Z軸を動かさないでY軸を可能な限り合わせる、のだが
仕様書には
If alignment is set for one axis only, that rotation is perfomed like rotation.
とある。Z軸のアライメントが無いときはY軸のアライメントは(1)と同じ動作にしないといけない。
しまった動作違う。修正する。
しかし巨大if文で分けるのはな……何か考える。
今日中に終わらせたい。
やはり動作がおかしい気がする
ぐるぐるひたすら回すとやはりどうも動作がおかしいような気がする。
これ左右の板ポリは回転せずに常にカメラの方を向くのが正しい動作だよな???
(今一つ自信がない。どういう動作をすると正しいのか考えないと分からなかったりする)
そうだよな、2軸自由度があれば常に(カメラから見て静止しているように)カメラの方を向けるはず。
何かがおかしい。
時間切れアウト。
今日中に何とかしたかった。


