OpenGL-如何获得单个旋转?

OpenGL-如何获得单个旋转?,opengl,matrix,rotation,rendering,instances,Opengl,Matrix,Rotation,Rendering,Instances,我对OpenGL矩阵系统有一些问题 我做了如下五个例子。我想让他们的个人工作 C_IMGMGR cImgmgr1( 200 , 170 ); C_IMGMGR cImgmgr2( 200 , 170 ); C_IMGMGR cImgmgr3( 200 , 170 ); C_IMGMGR cImgmgr4( 200 , 170 ); C_IMGMGR cImgmgr5( 200 , 170 ); 这是主要的, int main( int argc, char** argv ) { int

我对OpenGL矩阵系统有一些问题

我做了如下五个例子。我想让他们的个人工作

C_IMGMGR cImgmgr1( 200 , 170 );
C_IMGMGR cImgmgr2( 200 , 170 );
C_IMGMGR cImgmgr3( 200 , 170 );
C_IMGMGR cImgmgr4( 200 , 170 );
C_IMGMGR cImgmgr5( 200 , 170 );
这是主要的,

int main( int argc, char** argv )
{
    int nWinSizeX = 1280;
    int nWinSizeY = 768;

    glutInit( &argc , argv );
    mainWindow = CreateMain( nWinSizeX , nWinSizeY );

    SetProjection( nWinSizeX , nWinSizeY );
    SetStateSettings();

    NowFrameMove();

    return 1;
}
和SetProjection()

和SetStateSetting()

下面是glutDisplayFunc()和glutIdleFunc()的更新()

和IMGMGR类

void C_IMGMGR::Process( E_RENDER_MODE eMode )
{
    if( m_nFrame >= m_nFileCount )
        m_nFrame = 0;

    switch ( eMode )
    {
    case NORMAL :
        break;
    case FLIP_VERTICAL :
        m_fRotationAngle = 1.0F;
        m_fRotationX = 1.0F;
        break;
    case FLIP_HORIZONTAL :
        m_fRotationAngle = 1.0F;
        m_fRotationY = 1.0F;
        break;
    case FAN_LEFT :
        m_fRotationAngle = 1.0F;
        m_fRotationZ = 1.0F;
        break;
    case FAN_RIGHT :
        m_fRotationAngle = 1.0F;
        m_fRotationZ = -1.0F;
        break;
    case TRANSLATE_VERTICAL :
        break;
    case TRANSLATE_HORIZONTAL :
        break;
    }
}

void C_IMGMGR::Render_Sprite( int nFrame )
{
    glBindTexture( GL_TEXTURE_2D , m_pLoadedSprite[nFrame] );

    glViewport( m_nViewPortX , m_nViewPortY , m_nScreenW , m_nScreenH );

    glPushMatrix();
    glRotatef( m_fRotationAngle , m_fRotationX , m_fRotationY , m_fRotationZ );
    glTranslatef( m_fTranslateX , m_fTranslateY , m_fTranslateZ );
    glScalef( m_fScaleX , m_fScaleY , m_fScaleZ );

    glBegin( GL_QUADS );
    glTexCoord2f( 0.0F , 1.0F); glVertex2f( -(float)m_nImgX_half , -(float)m_nImgY_half);
    glTexCoord2f( 1.0F , 1.0F); glVertex2f( (float)m_nImgX_half , -(float)m_nImgY_half);
    glTexCoord2f( 1.0F , 0.0F); glVertex2f( (float)m_nImgX_half , (float)m_nImgY_half);
    glTexCoord2f( 0.0F , 0.0F); glVertex2f( -(float)m_nImgX_half , (float)m_nImgY_half);
    glEnd();
    glPopMatrix();
}
它们一起旋转,看起来像是共享垂直翻转和水平翻转


那么,我如何将它们的矩阵分离出来以用于单个实例的工作呢?

发布的代码有几个问题:

  • OpenGL作为状态机运行。当进行绘制调用时,它使用绘制调用时设置的状态。因此,如果应将转换应用于绘图调用,则需要在绘图调用之前指定转换

  • 相关的调用,如
    glRotatef()
    glTranslatef()
    修改当前变换矩阵。除非您对此做些什么,否则这些调用中的每一个都会将指定的转换与以前的当前转换相结合。如果您只是为每个draw调用进行一些这样的调用,那么所有的转换都将被合并

要解决这两个问题,您需要更改调用的顺序,并在为特定绘图调用应用转换时,使用
glPushMatrix()
glPopMatrix()
保存/恢复以前的转换。代码将如下所示:

glPushMatrix();
glRotatef( m_fRotationAngle , m_fRotationX , m_fRotationY , m_fRotationZ );
glTranslatef( m_fTranslateX , m_fTranslateY , m_fTranslateZ );
glScalef( m_fScaleX , m_fScaleY , m_fScaleZ );

glBegin( GL_QUADS );
glTexCoord2f( 0.0F , 1.0F); glVertex2f( -(float)m_nImgX_half , -(float)m_nImgY_half);
glTexCoord2f( 1.0F , 1.0F); glVertex2f( (float)m_nImgX_half , -(float)m_nImgY_half);
glTexCoord2f( 1.0F , 0.0F); glVertex2f( (float)m_nImgX_half , (float)m_nImgY_half);
glTexCoord2f( 0.0F , 0.0F); glVertex2f( -(float)m_nImgX_half , (float)m_nImgY_half);
glEnd();

glPopMatrix();

我希望您已经意识到,此代码中使用的几乎所有OpenGL调用都已弃用,并且在现代版本的OpenGL中不再可用。如果您想学习当前的OpenGL,请查找OpenGL核心配置文件或OpenGL ES 2.0或更高版本的教程。

谢谢您的提示,请重新阅读。我修改了Render_Sprite(),但现在旋转不起作用。只是冷冻矩阵。天哪,你总是把旋转角度设置为1.0。
glRotatef()
的角度以度为单位,旋转1度几乎不会引起注意。哦,天哪!非常感谢你,再见!祝你今天愉快~
void Update()
{
    //////////////////////////////////////////////////////////////////////////
    //Process
    cImgmgr1.Process( FLIP_VERTICAL );
    cImgmgr2.Process( FLIP_HORIZONTAL );
    cImgmgr3.Process( NORMAL );
    cImgmgr4.Process( NORMAL );
    cImgmgr5.Process( NORMAL );
    //////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////
    //Render
    glClearColor( 0.0F , 0.0F , 0.0F , 0.0F );
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    glClearDepth( 1.0 );

    cImgmgr1.Render_Sprite( cImgmgr1.Get_Frame() );
    cImgmgr2.Render_Sprite( cImgmgr2.Get_Frame() );
    cImgmgr3.Render_Sprite( cImgmgr3.Get_Frame() );
    cImgmgr4.Render_Sprite( cImgmgr4.Get_Frame() );
    cImgmgr5.Render_Sprite( cImgmgr5.Get_Frame() );
    //////////////////////////////////////////////////////////////////////////
    glutSwapBuffers();
}
void C_IMGMGR::Process( E_RENDER_MODE eMode )
{
    if( m_nFrame >= m_nFileCount )
        m_nFrame = 0;

    switch ( eMode )
    {
    case NORMAL :
        break;
    case FLIP_VERTICAL :
        m_fRotationAngle = 1.0F;
        m_fRotationX = 1.0F;
        break;
    case FLIP_HORIZONTAL :
        m_fRotationAngle = 1.0F;
        m_fRotationY = 1.0F;
        break;
    case FAN_LEFT :
        m_fRotationAngle = 1.0F;
        m_fRotationZ = 1.0F;
        break;
    case FAN_RIGHT :
        m_fRotationAngle = 1.0F;
        m_fRotationZ = -1.0F;
        break;
    case TRANSLATE_VERTICAL :
        break;
    case TRANSLATE_HORIZONTAL :
        break;
    }
}

void C_IMGMGR::Render_Sprite( int nFrame )
{
    glBindTexture( GL_TEXTURE_2D , m_pLoadedSprite[nFrame] );

    glViewport( m_nViewPortX , m_nViewPortY , m_nScreenW , m_nScreenH );

    glPushMatrix();
    glRotatef( m_fRotationAngle , m_fRotationX , m_fRotationY , m_fRotationZ );
    glTranslatef( m_fTranslateX , m_fTranslateY , m_fTranslateZ );
    glScalef( m_fScaleX , m_fScaleY , m_fScaleZ );

    glBegin( GL_QUADS );
    glTexCoord2f( 0.0F , 1.0F); glVertex2f( -(float)m_nImgX_half , -(float)m_nImgY_half);
    glTexCoord2f( 1.0F , 1.0F); glVertex2f( (float)m_nImgX_half , -(float)m_nImgY_half);
    glTexCoord2f( 1.0F , 0.0F); glVertex2f( (float)m_nImgX_half , (float)m_nImgY_half);
    glTexCoord2f( 0.0F , 0.0F); glVertex2f( -(float)m_nImgX_half , (float)m_nImgY_half);
    glEnd();
    glPopMatrix();
}
glPushMatrix();
glRotatef( m_fRotationAngle , m_fRotationX , m_fRotationY , m_fRotationZ );
glTranslatef( m_fTranslateX , m_fTranslateY , m_fTranslateZ );
glScalef( m_fScaleX , m_fScaleY , m_fScaleZ );

glBegin( GL_QUADS );
glTexCoord2f( 0.0F , 1.0F); glVertex2f( -(float)m_nImgX_half , -(float)m_nImgY_half);
glTexCoord2f( 1.0F , 1.0F); glVertex2f( (float)m_nImgX_half , -(float)m_nImgY_half);
glTexCoord2f( 1.0F , 0.0F); glVertex2f( (float)m_nImgX_half , (float)m_nImgY_half);
glTexCoord2f( 0.0F , 0.0F); glVertex2f( -(float)m_nImgX_half , (float)m_nImgY_half);
glEnd();

glPopMatrix();