0

月が太陽の周りを回転するように、一方が他方の周りを回転する 2 つの円を作成しました。

z 軸を下方向に移動し、y 軸を中心に回転を適用してオブジェクトを周回させました。yRotation * ZTranslation * (0,0,0,1) の行列乗算を計算する必要があります。

すなわち

(cos(angle)   0  sin(angle)  0  ) ( 1  0  0   0   ) ( 0 )
(    0        1      0       0  ) ( 0  1  0   0   ) ( 0 )
(-sin(angle)  0  cos(angle)  0  ) ( 0  0  1 zTran ) ( 0 ) 
(    0        0      0       1  ) ( 0  0  0   1   ) ( 1 )

これどうやってするの?

4

1 に答える 1

0

円について話しているので、2D アプリケーションを作成していると思います。

OpenGL では、次の座標があります。

   Y
   |
   |
   |
   O---- X
  /
 /
Z

これは、2D アプリケーションが XY 空間にあり、Z がモニターに対して (そして外側に向かって) 垂直であることを意味します。

したがって、円が他の円の周りを回っている場合、まず円を XY 平面 (たとえば Y 軸) で平行移動し、次にZ軸で回転を適用することを意図していたはずです。

したがって、行列の乗算は次のようになります。

(cos(angle)   sin(angle)  0  0 ) ( 1  0  0   0   ) ( circle_center_x )
(-sin(angle)  cos(angle)  0  0 ) ( 0  1  0 yTran ) ( circle_center_y ) 
(    0            0       1  0 ) ( 0  0  1   0   ) (        0        )
(    0            0       0  1 ) ( 0  0  0   1   ) (        1        )

または単に2Dで:

(cos(angle)   sin(angle) 0 ) ( 1  0   0   ) ( circle_center_x )
(-sin(angle)  cos(angle) 0 ) ( 0  1 yTran ) ( circle_center_y ) 
(    0            0      1 ) ( 0  0   1   ) (        1        )

OpenGL 関数の使用:

glRotatef(angle, 0, 0, 1);
glTranslatef(0, yTran, 0);
glBegin(GL_LINE_LOOP);
for (...)
    /* points of circle around circle_center_x/y */
glEnd();

OpenGL では、行列は右側で乗算されることに注意してください。glRotatefそのため、 の前に書くと、平行移動のglTranslatefに回転が適用されます。

于 2012-12-07T15:08:33.467 に答える