图形学实验要完成opengl绘制移动的安卓机器人。
在参考同学的作品后终于自己完成了一份。一下贴一下我查到的opengl中我用到的函数以及作用。附件里贴了
我的工程以及opengl的库,以及相关文档,有帮助的话可以下载哦。。 (那些文件我会上传分享的,需要的话到我的资源啥的找一找) csdn这点很差,博客都不能带文件的。。哎)
http://vdisk.weibo.com/s/A5mgb4EZxHKB8opengl库
http://vdisk.weibo.com/s/A5mgb4EZxHKHs文档
http://vdisk.weibo.com/s/A5mgb4EZxHKLD工程的
CClientDC *m_pDC;//用户设备指针 BOOL MyPixelFormat();//设置像素格式 void MySetPixelFormat();//像素格式初始化 void MySetViewPort(int,int);//设置视口 OnSize();//关联RC与DC,将MFC绘图坐标转换为OpenGL绘图坐标 OnCreate();//初始化一些数据 OnDestroy();//关闭程序时,消除动画、关闭设备上下文等 GLUquadricObj *quadratic; quadratic=gluNewQuadric(); // 创建二次几何体 gluQuadricNormals(quadratic, GLU_SMOOTH); // 使用平滑法线 gluQuadricTexture(quadratic, GL_TRUE); // 使用纹理 用了之后就可以贴上图了 变量声明 CClientDC *my_pDC;// #CClientDC: (客户区设备上下文)用于客户区的输出,与特定窗口关联 ,可以让开发者访问目标窗口中客户区,其构造函数中包含了GetDC, 析构函数中包含了ReleaseDC。 用法是:CClientDC dc(this);//this一般指向本窗口或当前活动视图 dc.TextOut(10,10,str,str.GetLength());//利用dc输出文本, #CRect m_rect;// GLint m_angle,direction; #GLUquadricObj* phere; 二次曲面对象的声明类型 #gluSphere(phere,0.1,50,50);//画球体 void gluSphere(GLUquadricObj *qobj, GLdouble radius, GLint slices, GLint stacks) 二次曲线目标,半径,经度,纬度(后两个表示切片大小) #gluCylinder(...) 参数1(1.0F)是圆柱体的底面半径, 参数2(1.0F)是圆柱体的顶面半径, 参数3(3.0F)是圆柱体的高度。 参数4(32)是纬线(环绕Z轴有多少细分), 参数5(32)是经线(沿着Z轴有多少细分)。 #gluDisk(...) 参数1(0.5F)是盘子的内圆半径,该参数可以为0,则表示在盘子中间没孔,内圆半径越大孔越大。 参数2(1.5F)表示外圆半径,这个参数必须比内圆半径大。 参数3(32)是组成该盘子的切片的数量,这个数量可以想象成披萨饼中的切片的数量。切片越多,外圆边缘就越平滑。 最后一个参数(32)是组成盘子的环的数量。环很像唱片上的轨迹,一环套一环。这些环从内圆半径细分到外圆半径。 //定义身子 gluCylinder(cylinder_obj, 0.1, 0.1, 0.2, 30, 30); //圆柱定义 #glBegin(UINT State); 开始绘制 设置状态为画什么物体 可以设定如下状态: GL_POINTS 画点 GL_LINES 画线,每两个顶点(Vertex)为一组 GL_LINE_STRIP 画线,把若干个顶点顺次连成折线 GL_LINE_LOOP 画线,把若干个顶点顺次连成封闭折线 GL_TRIANGLES 画三角形,每三个顶点为一组 GL_QUADS 画四边形,每四个顶点为一组 GL_POLYGON 画多边形 #glEnd(); #glRectf(x1, y1, x2, y2) 画矩形,不能放在glBegin()和glEnd()之间, # glLoadIdentity() 复位 将当前的用户坐标系的原点移到了屏幕中心:类似于一个复位操作 1.X坐标轴从左至右,Y坐标轴从下至上,Z坐标轴从里至外。 2.OpenGL屏幕中心的坐标值是X和Y轴上的0.0f点。 3.中心左面的坐标值是负值,右面是正值。 移向屏幕顶端是正值,移向屏幕底端是负值。 移入屏幕深处是负值,移出屏幕则是正值。 #glTranslatef(x, y, z) 平移 沿着 X, Y 和 Z 轴移动。 注意在glTranslatef(x, y, z)中,当您移动的时候,您并不是相对屏幕中心移动, 而是相对与当前所在的屏幕位置。其作用就是将你绘点坐标的原点在当前原点的 基础上平移一个(x,y,z)向量。 #glRotatef(angle, x, y, z) 旋转 与glTranslatef(x, y, z)类似,glRotatef(angle, x, y, z)也是对坐标系进行操作。 旋转轴经过原点,方向为(x,y,z),旋转角度为angle,方向满足右手定则。 #glPushMatrix(); 记录当前位置为原点 OpenGL 会把这个变换后的位置和角度保存起来。 然后你再随便做第二次移动或旋转变换,再用 #glPopMatrix(); 返回上一个原点 OpenGL 就把刚刚保存的那个位置和角度恢复。 #glColor3f(1.0f, 0.0f, 0.0f); 以RGB方式设置颜色,格式为:glColor3f(red, green, blue), 每种颜色值在(0.0, 1.0)之间。 #glVertex2f(30.0f, 30.0f); 设置定点坐标x,y #glFlush(); //开始绘制 #glClear(GL_COLOR_BUFFER_BIT); //清除颜色缓存 #void Invalidate( BOOL bErase = TRUE ); 参数: bErase 决定了是否要在WM_PAINT消息前发送WN_ERASEBKGND 该函数的作用是使整个窗口客户区无效。 窗口的客户区无效意味着需要重绘 #gluQuadricNormals(phere, GLU_SMOOTH); 指定二次对象使用的法向量类型 GLU_NONE, GLU_FLAT, GLU_SMOOTH #gluQuadricTexture 指定二次对象是否使用纹理。GL_FALSE为缺省值 #glClearDepth(1.0f); 深度缓存 #glMatrixMode - 指定哪一个矩阵是当前矩阵 mode 指定哪一个矩阵堆栈是下一个矩阵操作的目标, GL_MODELVIEW,对模型视景矩阵堆栈应用随后的矩阵操作. GL_PROJECTION,对投影矩阵应用随后的矩阵操作. GL_TEXTURE,对纹理矩阵堆栈应用随后的矩阵操作. 与glLoadIdentity()一同使用 glLoadIdentity():该函数的功能是重置当前指定的矩阵为单位矩阵。 在glLoadIdentity()之后我们为场景设置了透视图。glMatrixMode(GL_MODELVIEW) 设置当前矩阵为模型视图矩阵,模型视图矩阵储存了有关物体的信息。 #void glShadeModel ( GLenum mode); OpenGL1.0提供的接口。作用:设置着色模式。 参数mode可以是GL_SMOOTH(默认值)或GL_FLAT。采用恒定着色时(即GL_FLAT), 使用图元中某个顶点的颜色来渲染整个图元。 #glEnable(GL_DEPTH_TEST); 开启功能函数,根据对应的整数开启不同功能 #glMaterialv void glMaterialfv(GLenum face, GLenum pname, TYPE param); void glMaterialfv(GLenum face, GLenum pname, TYPE *param); 指定用于光照计算的当前材质属性。参数face的取值可以是GL_FRONT、GL_BACK或GL_FRONT_AND_BACK, 指出材质属性将应用于物体的哪面。pname指出要设置的哪种材质属性。 param为要设置的属性值,是一个指向数组的指针(向量版本)或一个数值(非向量版本)。 只有设置参数值是GL_SHININESS时,才能使用非向量版本。下表列举出了参数pname的可能取值。 GL_AMBIENT_AND_DIFFUSE让您能够同时设置材质的环境颜色和散射颜色,并将它们设置为相同的RGBA值。 下面是pname的可能取值和相应值的意义: 参数值 默认值 意义 GL_AMBIENT (0.2,0.2,0.2,1.0) 材质的环境颜色 GL_DIFFUSE (0.8,0.8,0.8,1.0) 材质的散射颜色 GL_AMBIENT_AND_DIFFUSE 材质的环境颜色和散射颜色 GL_SPECULAR (0.0,0.0,0.0,1.0) 材质的镜面反射颜色 GL_SHININESS0.0镜面反射指数 GL_EMISSION (0.0,0.0,0.1,1.0) 材质的发射光颜色 GL_COLOR_INDEXES(0, 1, 1) 环境颜色索引、散射颜色索引和镜面反射颜色索引 # glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);放置光源 GLfloat light0_diffuse[]= { , , , }; 函数glLightfv函数的第一个参数是一个符号常数,指定设置的是哪个光源的参数。 第二个参数指定了设置的是哪一个参数,可以选择GL_DIFFUSE、GL_AMBIENT、GL_SPECULAR, 分别用于指定漫射光、环境光和镜面光成分。第三个参数是一个包含四个浮点数的数组, 用于指定相应的参数。这段代码指定的光源LIGHT0只包含了漫射光成分,是一个漫反射光源。 #glScalef(1.3,1,1);//按x,y,z比例缩放
关于时间的函数 就是设置循环消息让机器人能动起来 的方法 #SetTimer(1,500,NULL); //设置时间间隔 在OnCreate()添加使得ontimer得到触发 #OnTimer() 每个时间间隔执行函数