您的位置:首页 > 运维架构

opengl绘制移动的安卓机器人

2013-11-13 22:25 441 查看
图形学实验要完成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()
每个时间间隔执行函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: