クォータニオンのサンプルコード

このコードで使っている要素は、回転軸と回転角からクォータニオンを得ると、クォータニオンの積,クォータニオンを行列に変換するだけである。
クォータニオンの共役と挟んで掛け算して、とか球面線形補間がどうの、なんて複雑なことはしていない。

ページにファイルが添付されていません。

//http://marina.sys.wakayama-u.ac.jp/~tokoi/?date=20040321
    void move(int x, int y)
    {
        if(quaternionflag){
            //移動量を計算 画面の中で何%ぐらい動いたか?
            double dx = (x - previous_x) * 1.0/WINWIDTH;
            double dy = (y - previous_y) * 1.0/WINHEIGHT;
 
            //クォータニオンの長さ
            double length = sqrt(dx * dx + dy * dy);
 
            if (length != 0.0) {
                //M_PIは適当な換算係数 piにしておくと、画面いっぱい動かした時にちょうど一回転になる
                double radian = length * M_PI;
                double theta = sin(radian) / length;
                CQuaternion after( cos(radian), dy * theta, dx * theta, 0.0);//回転後の姿勢
 
                target_quaternion = after * current_quaternion;
                target_quaternion.GetRotationMatrix(rotation_matrix);
                target_quaternion.PrintQuaternion("回転");
 
            }
        }else{//平行移動
            trans[0]+=translate_speed*(x-mouse_down[0]);
            trans[1]+=-translate_speed*(y-mouse_down[1]);//yは上下逆
            mouse_down[0]=x;
            mouse_down[1]=y;
        }
    }

エラー

なんか、画面が歪む。。。!!??
回転軸の長さをちゃんと1.0にしないと変な回転行列になって、画面が歪むよ。

サポートサイト Wikidot.com quaternion