我在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旋轉。
那麼,我怎樣才能分離他們的矩陣爲個人實例工作?
謝謝你的提示,Reto。我修改了Render_Sprite(),但現在旋轉不起作用。只需凍結矩陣。我的天啊。 – JYO 2014-10-19 06:05:08
您總是將旋轉角度設置爲1.0。 'glRotatef()'的角度是以度爲單位給出的,旋轉1度幾乎不會引起注意。 – 2014-10-19 06:13:54
哦,天啊!非常感謝你!祝你有美好的一天〜 – JYO 2014-10-19 06:40:40