《基于MFC的OpenGL编程》Part 7 Colors
来源:互联网 发布:mac版炉石传说打不开 编辑:程序博客网 时间:2024/05/21 15:20
《基于MFC的OpenGL编程》Part 7 Colors
原文链接
资源链接
OpenGL支持两种颜色模式:RGBA和颜色索引模式,本文关注于前者。
Smooth Shading and Flat Shading
When Smooth Shading is specified, the color values are interpolated between vertices. If Flat Shading is specified, one vertex is selected as being representative of all the vertices, thus the entire primitive is displayed using one single color.
一个简单Demo
1、在CMy2OpenGLView.h中加入如下旋转控制变量:
GLfloat m_yRot;//将x,y旋转的角度,随时间不断地变化GLfloat m_xRot; BOOL m_bCubeMove;//加入控制后面立方体自旋的参数,防止画不同图时重影了
并在构造函数中初始化这两个成员变量:
CMy2OpenGLView::CMy2OpenGLView(){// TODO: add construction code herem_xRot=0.0f;m_yRot=0.0f;<span style="white-space:pre"></span><pre name="code" class="cpp" style="line-height: 19.5px;"><span style="white-space:pre"></span>m_bCubeMove<span></span>=FALSE;//注意这个啊m_xPos = 0.0f; m_yPos = 0.0f; m_xAngle = 0.0f; m_yAngle = 0.0f;
<span style="white-space:pre"></span>m_bPoint = FALSE; m_bLine = FALSE; m_bPolygon = FALSE; m_bTriangle = FALSE; m_bCube = FALSE; m_bTorus = FALSE; m_bTeapot = FALSE; m_bIcosahedron = FALSE; m_bSimpleCube = FALSE; m_bSun = FALSE;DayOfYear=1;HourOfDay=1;}2、在OnTimer函数中,修改绕x,y轴旋转的角度值:
void CMy2OpenGLView::OnTimer(UINT nIDEvent) {// TODO: Add your message handler code here and/or call defaultm_xRot = m_xRot + 0.5f; m_yRot = m_yRot + 0.5f;if(DayOfYear<=365)DayOfYear++;elseDayOfYear=1;if (HourOfDay<=24)//////////////////////////////////////////////////////////////HourOfDay++;elseHourOfDay=1;InvalidateRect(NULL,FALSE);CView::OnTimer(nIDEvent);}
3、加入两个菜单项,控制OpenGL的渲染模式:
void CMy2OpenGLView::OnShadingmodelSmooth() {// TODO: Add your command handler code hereglShadeModel(GL_SMOOTH); InvalidateRect(NULL,FALSE);}void CMy2OpenGLView::OnShadingmodelFlat() {// TODO: Add your command handler code hereglShadeModel(GL_FLAT);InvalidateRect(NULL,FALSE);}
4、在菜单项下添加OnObjectsCubemove()成员函数,代码如下:
void CMy2OpenGLView::OnObjectsCubemove() {// TODO: Add your command handler code here//画自旋转立方体 m_bCube = FALSE; m_bTorus = FALSE; m_bTeapot = FALSE; m_bIcosahedron = FALSE; m_bSimpleCube = FALSE; m_bSun = FALSE;m_bCubeMove =TRUE;m_bSunMove =FALSE; InvalidateRect(NULL,FALSE);}
注意:其他的OnObjectsCube()、OnObjectsTeapot()、OnObjectsCubeMove()、OnObjectsTorus()、OnObjectsIcosahedron()、OnObjectsSimpleCube()、OnObjectsSun()、OnObjectsSunMove()中,都要讲对应的成员函数添加进去,并设置成FALSE。其他的类似,每个都要设置一下,不然画图时要么会出现两个或者几个,要么会不出现。
5、在RenderScene3D(),中加入绘制代码,从if(m_bCubeMove)这句开始的:
运行效果:
void CMy2OpenGLView::RenderScene3D(){//Replace the current matrix with Identity MatrixglLoadIdentity(); glTranslatef(0.0f,0.0f,-5.0f); glRotatef(-30.0f,1.0f,1.0f,0.0f);//Draw a Teapot if(m_bTeapot) {glLoadIdentity();glTranslatef(m_xPos,m_yPos,-5.0f);glRotatef(m_xAngle,1.0f,0.0f,0.0f); glRotatef(m_yAngle,0.0f,1.0f,0.0f); glutWireTeapot(1.0f); }//Draw a Cubeif (m_bCube){glLoadIdentity();glTranslatef(m_xPos,m_yPos,-5.0f);glRotatef(m_xAngle,1.0f,0.0f,0.0f); glRotatef(m_yAngle,0.0f,1.0f,0.0f);glutWireCube(1.0f);}if (m_bTorus){glLoadIdentity();glTranslatef(m_xPos,m_yPos,-5.0f);glRotatef(m_xAngle,1.0f,0.0f,0.0f); glRotatef(m_yAngle,0.0f,1.0f,0.0f);glutWireTorus(0.5f,1.0f,50,50);}if (m_bIcosahedron){glLoadIdentity();glTranslatef(m_xPos,m_yPos,-5.0f);glRotatef(m_xAngle,1.0f,0.0f,0.0f); glRotatef(m_yAngle,0.0f,1.0f,0.0f);glutWireIcosahedron();}if (m_bSimpleCube){glPolygonMode(GL_FRONT_AND_BACK,GL_LINES);glLoadIdentity();glTranslatef(m_xPos,m_yPos,-5.0f);glRotatef(m_xAngle,1.0f,0.0f,0.0f); glRotatef(m_yAngle,0.0f,1.0f,0.0f);//front faceglBegin(GL_POLYGON);glColor3f(1.0f,0.0f,1.0f);glVertex3f(-1.0,-1.0,0.0);glColor3f(1.0f,1.0f,1.0f);glVertex3f(-1.0,1.0,0.0);glColor3f(1.0f,1.0f,0.0f);glVertex3f(1.0,1.0,0.0);glColor3f(0.0f,0.8f,1.0f);glVertex3f(1.0,-1.0,0.0);glEnd();//back faceglBegin(GL_POLYGON);glColor3f(0.0f,0.5f,0.0f);glVertex3f(-1.0,-1.0,-1.0);glColor3f(1.0f,0.8f,10.0f);glVertex3f(-1.0,1.0,-1.0);glColor3f(0.0f,0.0f,1.0f);glVertex3f(1.0,1.0,-1.0);glColor3f(1.0f,1.0f,0.0f);glVertex3f(1.0,-1.0,-1.0);glEnd();//left faceglBegin(GL_POLYGON);glColor3f(1.0f,0.5f,0.0f);glVertex3f(-1.0,-1.0,0.0);glColor3f(0.8f,0.0f,0.0f);glVertex3f(-1.0,1.0,0.0);glColor3f(0.0f,0.0f,1.0f);glVertex3f(-1.0,1.0,-1.0);glColor3f(0.0f,0.6f,1.0f);glVertex3f(-1.0,-1.0,-1.0);glEnd();//right faceglBegin(GL_POLYGON);glColor3f(1.0f,0.0f,0.0f);glVertex3f(1.0,-1.0,0.0);glColor3f(0.0f,1.0f,1.0f);glVertex3f(1.0,1.0,0.0);glColor3f(0.0f,0.0f,1.0f);glVertex3f(1.0,1.0,-1.0);glColor3f(1.0f,0.0f,1.0f);glVertex3f(1.0,-1.0,-1.0);glEnd();//top faceglBegin(GL_POLYGON);glColor3f(0.0f,1.0f,0.0f);glVertex3f(-1.0,1.0,0.0);glColor3f(0.0f,0.0f,1.0f);glVertex3f(-1.0,1.0,-1.0);glColor3f(1.0f,0.0f,0.0f);glVertex3f(1.0,1.0,-1.0);glColor3f(0.0f,0.5f,0.8f);glVertex3f(1.0,1.0,0.0);glEnd();//bottom faceglBegin(GL_POLYGON);glColor3f(0.0f,1.0f,0.0f);glVertex3f(-1.0,-1.0,0.0);glColor3f(0.0f,0.0f,1.0f);glVertex3f(-1.0,-1.0,-1.0);glColor3f(1.0f,0.0f,0.0f);glVertex3f(1.0,-1.0,-1.0);glColor3f(0.0f,0.5f,0.8f);glVertex3f(1.0,-1.0,0.0);glEnd();}//Draw the sun if (m_bSun){//绘制函数glTranslatef(0.0f,0.0f,-5.0f);//Draw the sun //Rotate the planet in its orbitglLoadIdentity();glTranslatef(m_xPos, m_yPos,-5.0f);glRotatef(m_xAngle,1.0f,0.0f,0.0f);glRotatef(m_yAngle,0.0f,1.0f,0.0f);glutWireSphere(1.0f,20,20);//Draw the PlanetglPushMatrix(); glTranslatef(m_xPos, m_yPos,-2.0f); glRotatef(m_xAngle,1.0f,0.0f,0.0f); glRotatef(m_yAngle,0.0f,1.0f,0.0f);glutWireSphere(0.5f,20,20);//Draw the moonglPushMatrix(); glTranslatef(m_xPos, m_yPos,-2.0f); glRotatef(m_xAngle,1.0f,0.0f,0.0f); glRotatef(m_yAngle,0.0f,1.0f,0.0f);glutWireSphere(0.05f,20,20);glPopMatrix();glPopMatrix();}if (m_bSunMove)//画一个自旋太阳系{// glLoadIdentity();// glTranslatef(m_xPos, m_yPos, -5.0f);// glRotatef(m_xAngle, 1.0f,0.0f,0.0f);// glRotatef(m_yAngle, 0.0f,1.0f,0.0f);// // glutWireCube(1.0f);//绘制函数//glRotatef((GLfloat)(360.0*DayOfYear)/365.0,0.0f,1.0f,0.0f);//太阳嘛,最好不要转了,所以注释掉glTranslatef(-1.0f,+0.3f,-2.0f);//三个glTranslatef()函数分别是调整太阳、行星、月亮位置的,当前参数是我的最好视角,根据自己的位置喜好调glRotatef(m_xRot,1.0f,0.0f,0.0f);//加上这两句,太阳就能自转了glRotatef(m_yRot,0.0f,1.0f,0.0f);//Draw the SunglutWireSphere(1.0f,30,30);//Rotate the Planet in its orbit//glLoadIdentity();//这句最好别加,不然行星就会回到原点处glRotatef((GLfloat)(360.0*DayOfYear)/365.0,0.0f,1.0f,0.0f);glTranslatef(3.0f,0.0f,0.0f);glPushMatrix();//Rotate the Planet in its orbitglRotatef((GLfloat)(360.0*HourOfDay)/24.0,0.0f,1.0f,0.0f);//Draw the planetglutWireSphere(0.2f,20,20);glPopMatrix();glRotatef((GLfloat)(360.0*12.5*DayOfYear)/365.0,0.0f,1.0f,0.0f);glTranslatef(0.5f,0.0f,0.0f);//Draw the MoonglutWireSphere(0.05f,20,20);//月亮调大点好看些// glLoadIdentity();// glTranslatef(m_xPos,m_yPos,-5.0f);// glRotatef(m_xAngle,1.0f,0.0f,0.0f);// glRotatef(m_yAngle,0.0f,1.0f,0.0f);}if (m_bCubeMove)//画一个自旋转的立方体{//glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT);glPolygonMode(GL_FRONT_AND_BACK,GL_LINES);glLoadIdentity();glTranslatef(0.0f,0.0f,-6.0f);glRotatef(m_xRot,1.0f,0.0f,0.0f);glRotatef(m_yRot,0.0f,1.0f,0.0f);//front faceglBegin(GL_POLYGON);glColor3f(1.0f,0.0f,1.0f);glVertex3f(-1.0,-1.0,0.0);glColor3f(1.0f,1.0f,1.0f);glVertex3f(-1.0,1.0,0.0);glColor3f(1.0f,1.0f,0.0f);glVertex3f(1.0,1.0,0.0);glColor3f(0.0f,0.8f,1.0f);glVertex3f(1.0,-1.0,0.0);glEnd();glColor3f(1.0f,1.0f,1.0f);//back faceglBegin(GL_POLYGON);//glColor3f(0.0f,0.5f,0.0f);glVertex3f(-1.0,-1.0,-1.0);//glColor3f(1.0f,0.8f,10.0f);glVertex3f(-1.0,1.0,-1.0);//glColor3f(0.0f,0.0f,1.0f);glVertex3f(1.0,1.0,-1.0);//glColor3f(1.0f,1.0f,0.0f);glVertex3f(1.0,-1.0,-1.0);glEnd();glColor3f(1.0f,0.0f,1.0f);//left faceglBegin(GL_POLYGON);//glColor3f(1.0f,0.5f,0.0f);glVertex3f(-1.0,-1.0,0.0);//glColor3f(0.8f,0.0f,0.0f);glVertex3f(-1.0,1.0,0.0);//glColor3f(0.0f,0.0f,1.0f);glVertex3f(-1.0,1.0,-1.0);//glColor3f(0.0f,0.6f,1.0f);glVertex3f(-1.0,-1.0,-1.0);glEnd();glColor3f(0.0f,1.0f,0.0f);//right faceglBegin(GL_POLYGON);glColor3f(1.0f,0.0f,0.0f);glVertex3f(1.0,-1.0,0.0);glColor3f(0.0f,1.0f,1.0f);glVertex3f(1.0,1.0,0.0);glColor3f(0.0f,0.0f,1.0f);glVertex3f(1.0,1.0,-1.0);glColor3f(1.0f,0.0f,1.0f);glVertex3f(1.0,-1.0,-1.0);glEnd();glColor3f(0.0f,1.0f,1.0f);//top faceglBegin(GL_POLYGON);glColor3f(0.0f,1.0f,0.0f);glVertex3f(-1.0,1.0,0.0);glColor3f(0.0f,0.0f,1.0f);glVertex3f(-1.0,1.0,-1.0);glColor3f(1.0f,0.0f,0.0f);glVertex3f(1.0,1.0,-1.0);glColor3f(0.0f,0.5f,0.8f);glVertex3f(1.0,1.0,0.0);glEnd();glColor3f(0.0f,0.0f,1.0f);//bottom faceglBegin(GL_POLYGON);glColor3f(0.0f,1.0f,0.0f);glVertex3f(-1.0,-1.0,0.0);glColor3f(0.0f,0.0f,1.0f);glVertex3f(-1.0,-1.0,-1.0);glColor3f(1.0f,0.0f,0.0f);glVertex3f(1.0,-1.0,-1.0);glColor3f(0.0f,0.5f,0.8f);glVertex3f(1.0,-1.0,0.0);glEnd();}}
运行效果:
1)Smooth Mode:
2)Flat Mode:
0 0
- 《基于MFC的OpenGL编程》Part 7 Colors
- 《基于MFC的OpenGL编程》Part 8 Colors
- 《基于MFC的OpenGL编程》Part 7 Animation
- 《基于MFC的OpenGL编程》Part 17 Shadows
- 《基于MFC的OpenGL编程》Part 16 Reflection
- 《基于MFC的OpenGL编程》Part 15 Selection
- 《基于MFC的OpenGL编程》Part 14 Quadrics
- 《基于MFC的OpenGL编程》Part 10 Texture Mapping
- 《基于MFC的OpenGL编程》Part 9 Lighting
- 《基于MFC的OpenGL编程》Part 1 A Primer
- 《基于MFC的OpenGL编程》Part 1 A Primer
- 《基于MFC的OpenGL编程》Part 6 Animation
- 《基于MFC的OpenGL编程》Part 8 Lighting
- 《基于MFC的OpenGL编程》Part 9 Texture Mapping
- 《基于MFC的OpenGL编程》Part 13 Quadrics
- 《基于MFC的OpenGL编程》Part 14 Selection
- 《基于MFC的OpenGL编程》Part 15 Reflection
- 《基于MFC的OpenGL编程》Part 0 基于MFC的OpenGL基本框架
- 【c#学习笔记】 基础篇
- android SimpleOnGestureListener详解
- tomcat启动为什么 写入这句话 -Dspring.profiles.active=dev
- InputStreamReader和BufferedReader的理解与用法
- 【LeetCode】003 Unique Paths 唯一路线
- 《基于MFC的OpenGL编程》Part 7 Colors
- 【深圳信狮】安卓技术更新有哪些?
- Java中数组和List集合如何互相转换
- JQuery Mobile入门——页面缓存
- 图表开源项目MPAndroidChart
- Java 中新增的 foreach 的用法
- 将布局文件填充成View
- wps ppt word 双屏幕同时浏览技巧
- 45个非常有用的查询语句