| ||||||||
|
||||||||
|
Windows関連 Solaris関連 画像入出力 その他アルゴリズムなど |
自由軸回転を行う1.オイラー角
オイラー角での回転
矢印のように斜めに回したくなることもある。
2.クォータニオン
3.とりあえず、答え
#define RADIAN( n ) ( ( n ) * ( 3.1415926535897932384626 / 180.0 ) )
void FreeRotate( float n[3], float r )
{
float v[16];
float w =(float)cos( RADIAN( r ) / 2.0f );
float w2 = w * w;
float s = (float)sin( RADIAN( r ) / 2.0f );
float x = n[0] * s;
float y = n[1] * s;
float z = n[2] * s;
float x2 = x * x;
float y2 = y * y;
float z2 = z * z;
v[0] = w2 + x2 - y2 - z2;
v[4] = 2 * ( ( x * y ) - ( w * z ) );
v[8] = 2 * ( ( x * z ) + ( w * y ) );
v[12] = 0.0f;
v[1] = 2 * ( ( x * y ) + ( w * z ) );
v[5] = w2 - x2 + y2 - z2;
v[9] = 2 * ( ( y * z ) - ( w * x ) );
v[13] = 0.0f;
v[2] = 2 * ( ( x * z ) - ( w * y ) );
v[6] = 2 * ( ( y * z ) + ( w * x ) );
v[10] = w2 - x2 - y2 + z2;
v[14] = 0.0f;
v[3] = 0.0f;
v[7] = 0.0f;
v[11] = 0.0f;
v[15] = 1.0f;
glMultMatrixf( v );
}
この関数を、プログラム中の適当なことろに配置して、呼び出してやってください。あとは勝手に何とかしてくれると思います。 glTranslatef( x, y, z ); /* 本来回転軸にいてほしい位置まで、移動 */
4.関数の解説
5.その他
6.注意事項
7.とりあえず、サンプル
|
|||||||
|
|
||||||||