2014-10-19 48 views
-2

我在OpenGL矩陣系統中遇到了一些問題。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(),

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旋轉。

那麼,我怎樣才能分離他們的矩陣爲個人實例工作?

回答

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或更高版本的教程。

+0

謝謝你的提示,Reto。我修改了Render_Sprite(),但現在旋轉不起作用。只需凍結矩陣。我的天啊。 – JYO 2014-10-19 06:05:08

+0

您總是將旋轉角度設置爲1.0。 'glRotatef()'的角度是以度爲單位給出的,旋轉1度幾乎不會引起注意。 – 2014-10-19 06:13:54

+0

哦,天啊!非常感謝你!祝你有美好的一天〜 – JYO 2014-10-19 06:40:40