elecperlのブログ

elecperlのブログ

ブログの説明を入力します。

Amebaでブログを始めよう!
OpenGLで任意の軸でモデルを回転させるにはオイラー角ではなくクォータニオンを用いるらしい、
といっても色々な資料をみてもイマイチ理解できない。とりあえずネット上の資料を参考に
任意軸回転をする関数を書いてみた。
引数にGLfloat型3要素の配列に回転軸、GLfloat型に回転角度(ラジアン)をいれてやれば回転がかかる。回転軸は正規化されていること。

void AxisRotate( GLfloat axis[3], GLfloat theta )
{
GLfloat M[16];
M[0] = (axis[0]*axis[0]) * (1 - cos(theta)) + cos(theta);
M[1] = axis[0]*axis[1]*(1-cos(theta))+axis[2]*sin(theta);
M[2] = axis[0]*axis[2]*(1-cos(theta))-axis[1]*sin(theta);
M[3] = 0.0;

M[4] = axis[0]*axis[1]*(1-cos(theta))-axis[2]*sin(theta);
M[5] = axis[1]*axis[1]*(1-cos(theta))+cos(theta);
M[6] = axis[1]*axis[2]*(1-cos(theta))+axis[0]*sin(theta);
M[7] = 0.0;

M[8] = axis[0]*axis[2]*(1-cos(theta))+axis[1]*sin(theta);
M[9] = axis[1]*axis[2]*(1-cos(theta))-axis[0]*sin(theta);
M[10] = axis[2]*axis[2]*(1-cos(theta))+cos(theta);
M[11] = 0.0;

M[12] = 0.0;
M[13] = 0.0;
M[14] = 0.0;
M[15] = 1.0;

glMultMatrixf( M );
return;
}