【问题标题】:OpenGL - How can I get individual rotating?OpenGL - 我怎样才能获得单独的旋转?
【发布时间】:2014-10-19 03:36:46
【问题描述】:

我遇到了 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()

void SetProjection( int nWinSizeX , int nWinSizeY )
{
    cImgmgr1.Init_Viewport( 540 , 599 , nWinSizeX , nWinSizeY );
    cImgmgr2.Init_Viewport( 40 , 299 , nWinSizeX , nWinSizeY );
    cImgmgr3.Init_Viewport( 540 , 299 , nWinSizeX , nWinSizeY );
    cImgmgr4.Init_Viewport( 1040 , 299 , nWinSizeX , nWinSizeY );
    cImgmgr5.Init_Viewport( 540 , -1 , nWinSizeX , nWinSizeY );

    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    glOrtho( 0.0 , 1280 , 0.0 , 768 , -10000.0 , 10000.0 );

    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();
    glTranslatef( (200 / 2) , (170 / 2) , 0 );
}

和 SetStateSetting()

void SetStateSettings()
{
    glEnable( GL_BLEND );
    glBlendFunc( GL_SRC_ALPHA , GL_ONE_MINUS_SRC_ALPHA );
    glEnable( GL_TEXTURE_2D );

    cImgmgr1.Init_Sprite( "data\\Image\\symbol01_Pay\\" );
    cImgmgr2.Init_Sprite( "data\\Image\\symbol01_Pay\\" );
    cImgmgr3.Init_Sprite( "data\\Image\\symbolTemp_Pay\\" );
    cImgmgr4.Init_Sprite( "data\\Image\\symbol01_Pay\\" );
    cImgmgr5.Init_Sprite( "data\\Image\\symbol01_Pay\\" );
}

这里是 glutDisplayFunc() 和 glutIdleFunc() 的 Update(),

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();
}

和 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();
}

它们一起旋转,看起来像是共享 FLIP_VERTICAL 和 FLIP_HORIZONTAL。

那么,我怎样才能将它们的矩阵分开以使单个实例工作?

【问题讨论】:

    标签: opengl matrix rotation rendering instances


    【解决方案1】:

    发布的代码有几个问题:

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

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

    要解决这两个问题,您需要更改调用顺序,并在为特定绘图调用应用转换时使用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 Core Profile 或 OpenGL ES 2.0 或更高版本的教程。

    【讨论】:

    • 谢谢你的提示,Reto。我修改了 Render_Sprite() 但现在旋转不起作用。刚刚冻结的矩阵。天哪。
    • 您总是将旋转角度设置为 1.0。 glRotatef() 的角度以度为单位,旋转 1 度几乎不会引起注意。
    • 天啊!非常感谢你!祝你有美好的一天~
    猜你喜欢
    • 2011-06-04
    • 1970-01-01
    • 2017-05-25
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多