-2

3D オブジェクトを回転できますが、2D オブジェクトでは機能しないようです。

移動可能な (矢印を介して) 正方形を右に 90 度回転させたいと思います (回転の中心: 正方形の中心)。次のコードを思いつきました:

class CSquare : public CObject {
    SPoint pnta;         //left top corner of a square
    uint16 len;          //length
    bool bFill, bRotate; //filled? rotating?
    GLubyte color[4];    //filling color
    float angle;         //rotate for this

public:
    CSquare();
    CSquare(const CSquare &sqr);
    CSquare(SPoint &a, uint16 l, bool fill = false);
    CSquare(uint16 x, uint16 y, uint16 l, bool fill = false);

    void draw();
    void toggleRotate();
    void setColor(GLubyte r, GLubyte g, GLubyte b, GLubyte a);
    void setPoint(uint16 x, uint16 y);

    SPoint getPoint();
    uint16 getPosX();
    uint16 getPosY();
    uint16 getLength();
};

void CSquare::draw() {
  glPushMatrix();
  if (bRotate) 
    if (++angle < 360.0f) 
    {
        glTranslatef(pnta.nX + len/2, pnta.nY + len/2, 0);
        glRotatef(90, 0, 0, 1);
    }
    else angle = 0.0f;

  if (bFill == true) glBegin(GL_QUADS);
  else glBegin(GL_LINE_LOOP);
    glColor4ubv(color);
    glVertex2i(pnta.nX, pnta.nY);
    glColor4ub(255, 255, 0, 0); //temporary to visualise rotation effect
    glVertex2i(pnta.nX + len, pnta.nY);
    glColor4ub(0, 255, 0, 0);
    glVertex2i(pnta.nX + len, pnta.nY + len);
    glColor4ub(0, 0, 255, 0);
    glVertex2i(pnta.nX, pnta.nY + len);
  glEnd();
  glPopMatrix();
}

私のコードはある程度機能します。オブジェクトを回転させますが、目的の点に中心を置きません。

PS。必要に応じてアプリケーション全体をアップロードできます (Visual Studio 2010 プロジェクト、FreeGLUT と SDL を使用)。

4

1 に答える 1

1

実際には一定の角度で回転していないと仮定します。それがglRotatef(90, 0, 0, 1);転写エラーでない場合は、最初にそれを修正する必要があります。

つまり、回転は常に原点を中心に発生します。で形を描きます(pnta.nX, pnta.nY)。形状の中心を中心に回転させたいようです。そのためには、まずその点を原点に移動する必要があります。次に、回転を実行してから、ポイントを目的の場所に戻します。

glPushMatrix();
glTranslatef(pnta.nX + len/2, pnta.nY + len/2, 0);
glRotatef(angle, 0, 0, 1);
glTranslatef(-pnta.nX - len/2, -pnta.nY - len/2, 0);
drawShape();
glPopMatrix();

多くの場合、デフォルトで原点を中心としたジオメトリでオブジェクトをモデル化します。そうすれば、オブジェクトを回転させてから、その基準点を必要な場所に移動することができます。

于 2012-04-17T19:06:52.840 に答える