0
                  O
                 position 2



 O                             Y
 object                      ( x,y,z )
 position 1

Q角度で固定点(x、y、z)に従ってオブジェクトを回転させたい。opengl を使用すると、どうすればそれを行うことができますか?

オブジェクトは位置 1 から位置 2 に移動します。

私は Q, (x,y,z) を知っています。

私はやった:

glPushMAtrix ()
glTranslatef ( -x, -y, -z ) ;
glRotatef ( Q, 1.0f, 0.0f, 0.0f );

glCylinder ( /*argument*/ ) 
glPopMatriX ()
4

1 に答える 1

1

3D 空間で回転していて、オブジェクト、角度、および回転の中心しか知らない場合、タスクは定義されていません。3D 空間では、点ではなく、特定の軸を中心にのみ回転できます。

コード例から、X 軸を中心に回転しています。それがあなたが本当に望んでいることだと思います。

これを実現するには、座標系の原点を回転の中心に変換し、回転を実行して座標系を元に戻す必要があります。

glTranslatef(-x, -y, -z);
glRotatef(Q, 1.0, 0.0, 0.0);
glTranslatef(x, y, z);
// draw the object

オブジェクトの初期位置と最終位置がわかっている場合は、回転軸を計算できます。(3 点は常に平面とその法線を定義するため。) ベクトル表記では、このように表示されます (軸方向が間違っている可能性があります。オブジェクトが反対方向に回転する場合は、軸または角度の符号を変更します)。

axis = vec(center_of_rotation - initial_position, center_of_rotation - final_position)

またはもう少し「ダミー用」

float X1[3]; // initial position
float X2[3]; // final position
float O[3]; // orign of rotation

float OX1[3]; OX1[0] = X1[0] - O[0]; OX1[1] = X1[1] - O[1]; OX1[2] = X1[2] - O[2];
float OX2[3]; OX2[0] = X2[0] - O[0]; OX2[1] = X2[1] - O[1]; OX2[2] = X2[2] - O[2];

float axis[3]; // vector product OX1 and OX2
axis[0] = OX1[1]*OX2[2]-OX1[2]*OX2[1];
axis[1] = OX1[2]*OX2[0]-OX1[0]*OX2[2];
axis[2] = OX1[0]*OX2[1]-OX1[1]*OX2[0];
于 2012-11-30T14:17:48.090 に答える