Qt5版NeHe OpenGL教程之三:旋轉(zhuǎn)
這一課會(huì)把第二課中的三角形繞Y軸逆時(shí)針旋轉(zhuǎn)45°,正方形繞X軸順時(shí)針旋轉(zhuǎn)45°
頭文件中添加兩個(gè)變量表示三角形和正方形旋轉(zhuǎn)的角度。
private: ????QOpenGLContext?*m_context; ????GLfloat rtri; //?用于三角形的角度 ????GLfloat rquad; //?用于正方形的角度
在構(gòu)造函數(shù)中賦值
Lesson3::Lesson3(QWindow?*parent)?: ????QWindow(parent) ??,?m_context(0) { ????setSurfaceType(QWindow::OpenGLSurface); ????rtri=45.0f; ??//?三角形的旋轉(zhuǎn)角度 ????rquad=-45.0f;?//?正方形的旋轉(zhuǎn)角度 }
接下來(lái)需要修改render函數(shù)
void?Lesson3::render() { ????glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); ????glViewport(0,0,(GLint)width(),(GLint)height());?//?重置當(dāng)前視口 ????glMatrixMode(GL_PROJECTION);????????????????????//?選擇投影矩陣 ????glLoadIdentity();???????????????????????????????//?重置投影矩陣為單位矩陣 ????//?glu庫(kù)函數(shù)Qt不支持,但是glu庫(kù)函數(shù)是對(duì)gl庫(kù)函數(shù)的封裝,方便使用。因此我們可以自己 ????//?寫一個(gè)類似gluPerspective的函數(shù)myPerspective,用于設(shè)置透視。 ????//gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f); ????myPerspective(45.0,(GLfloat)width()/(GLfloat)height(),0.1,100.0); ????glMatrixMode(GL_MODELVIEW);//?選擇模型視圖矩陣 ????glLoadIdentity();??????????//?重置模型視圖矩陣為單位矩陣 ????glTranslatef(-1.5f,0.0f,-6.0f);?//?左移1.5單位,并移入屏幕6.0 ????glRotatef(rtri,0.0f,1.0f,0.0f); //?繞Y軸旋轉(zhuǎn)三角形 ????glBegin(GL_TRIANGLES); //?繪制三角形 ????glColor3f(1.0f,0.0f,0.0f); //?設(shè)置當(dāng)前色為紅色 ????glVertex3f(?0.0f,?1.0f,?0.0f); //?上頂點(diǎn) ????glColor3f(0.0f,1.0f,0.0f); //?設(shè)置當(dāng)前色為綠色 ????glVertex3f(-1.0f,-1.0f,?0.0f); //?左下 ????glColor3f(0.0f,0.0f,1.0f); //?設(shè)置當(dāng)前色為藍(lán)色 ????glVertex3f(?1.0f,-1.0f,?0.0f); //?右下 ????glEnd();????????????????????????//?三角形繪制結(jié)束 ????//?注意:這里用原來(lái)的glTranslatef(3.0f,0.0f,0.0f);?換成了下面這兩句 ????glLoadIdentity(); ????glTranslatef(1.5f,0.0f,-6.0f);??//?右移1.5單位,并移入屏幕6.0 ????glRotatef(rquad,1.0f,0.0f,0.0f);//?繞X軸旋轉(zhuǎn)四邊形 ????glColor3f(0.5f,0.5f,1.0f); ????//?一次性將當(dāng)前色設(shè)置為紫色 ????glBegin(GL_QUADS); //?繪制正方形 ????glVertex3f(-1.0f,?1.0f,?0.0f); //?左上 ????glVertex3f(?1.0f,?1.0f,?0.0f); //?右上 ????glVertex3f(?1.0f,-1.0f,?0.0f); //?左下 ????glVertex3f(-1.0f,-1.0f,?0.0f); //?右下 ????glEnd(); ????//?正方形繪制結(jié)束 }
運(yùn)行效果
glRotatef函數(shù)的用法:
函數(shù)原型:
? ? ? void glRotated(GLdouble angle,GLdouble x,GLdouble y,GLdouble z)
? ? ? void glRotatef(GLfloat angle,GLfloat x,GLfloat y,GLdouble z)
函數(shù)說(shuō)明:
? ? ?這兩個(gè)函數(shù)用來(lái)計(jì)算旋轉(zhuǎn)矩陣,該矩陣圍繞原點(diǎn)到點(diǎn)(x,y,z)的向量逆時(shí)針旋轉(zhuǎn)angle度。
關(guān)于逆時(shí)針與順時(shí)針,可用右手定則:
即手握住某個(gè)坐標(biāo)軸,大拇指指向某軸的正方向,其余四個(gè)手指的彎曲方向即為繞某軸旋轉(zhuǎn)的逆時(shí)針?lè)较?;反之為順時(shí)針?lè)较颉?/p>