Animation and texture mapping
2014-12-22 23:11
519 查看
在实验二的基础上,增加Animation 和 texture mapping,实验实现如下:
1. Animation
将旋转,平移的参数设置为变量,每次变化调用glutPostRedisplay();进行重画,实现连续的变化。
OpenGL要求纹理的高度和宽度都必须是2的n次方大小,只有满足这个条件,这个纹理图片才是有效的。 一旦获取了像素值,我们就可以将这些数据传给OpenGL,让OpenGL生成一个纹理贴图:
glBindTexture(GL_TEXTURE_2D,Texture);
glTexImage2D(GL_TEXTURE_2D,0,3,Bit.Width,Bit.Height,0,GL_RGB,GL_UNSIGNED_BYTE,Pixels);
glBindTexture函数用于创建和绑定纹理对象,glTexImage2D函数将Pixels数组中的像素值传给当前绑定的纹理对象,于是便创建了纹理。glTexImage函数的参数分别是纹理的类型,纹理的等级,每个像素的字节数,纹理图像的宽度和高度,边框大小,像素数据的格式,像素值的数据类型,像素数据。
试验中我通过makeImage方法制作一张纹理图片:
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILETER,MagFilter);//设置放大滤镜
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,
MinFilter); //设置缩小滤镜
要使用当前的纹理绘制图元,我们必须在绘制每个顶点之前为该顶点指定纹理坐标。只需调用
glTexCoord2d(s:Double;t:Double);
试验中我采用二次几何体,可调用gluQuadricTexture(quadratic, GL_TRUE);为所画图元添加纹理。
实验结果
(上图四肢和头部为纹理映射)
1. Animation
将旋转,平移的参数设置为变量,每次变化调用glutPostRedisplay();进行重画,实现连续的变化。
void shoulderdisplay(){ shoulder2 = (shoulder2 + shoulder2f); if (shoulder2>80) shoulder2f = -shoulder2f; if (shoulder2<-60) shoulder2f = -shoulder2f; elbow = elbow + 0.1; shoulder1 = (shoulder1 + shoulder1f); if (shoulder1>80) shoulder1f = -shoulder1f; if (shoulder1<-60) shoulder1f = -shoulder1f; leg1 = (leg1 + leg1f); if (leg1>80) leg1f = -leg1f; if (leg1<-20) leg1f = -leg1f; leg2 = (leg2 - leg2f); if (leg2>80) leg2f = -leg2f; if (leg2<-20) leg2f = -leg2f; glutPostRedisplay(); }将参数变量进行如上设置,并通过鼠标监听进行启动animation,实现图形关节的转动。
void mouse(int button,int state,int x,int y){ switch (button){ case GLUT_LEFT_BUTTON: if (state == GLUT_DOWN) glutIdleFunc(shoulderdisplay); break; case GLUT_MIDDLE_BUTTON: if (state = GLUT_DOWN) glutIdleFunc(NULL); break; default: break; } }2. texture mapping
OpenGL要求纹理的高度和宽度都必须是2的n次方大小,只有满足这个条件,这个纹理图片才是有效的。 一旦获取了像素值,我们就可以将这些数据传给OpenGL,让OpenGL生成一个纹理贴图:
glBindTexture(GL_TEXTURE_2D,Texture);
glTexImage2D(GL_TEXTURE_2D,0,3,Bit.Width,Bit.Height,0,GL_RGB,GL_UNSIGNED_BYTE,Pixels);
glBindTexture函数用于创建和绑定纹理对象,glTexImage2D函数将Pixels数组中的像素值传给当前绑定的纹理对象,于是便创建了纹理。glTexImage函数的参数分别是纹理的类型,纹理的等级,每个像素的字节数,纹理图像的宽度和高度,边框大小,像素数据的格式,像素值的数据类型,像素数据。
试验中我通过makeImage方法制作一张纹理图片:
void makeImage(void) { int i, j, c; for (i = 0; i < imageWidth; i++) { for (j = 0; j <imageHeight; j++) { c = (((i & 0x8) == 0) ^ ((j & 0x8)) == 0) * 255; image[i][j][0] = (GLubyte)c; image[i][j][1] = (GLubyte)c; image[i][j][2] = (GLubyte)c; image[i][j][3] = (GLubyte)255; } } }调用glTexParameter来设置纹理滤镜。如:
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILETER,MagFilter);//设置放大滤镜
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,
MinFilter); //设置缩小滤镜
要使用当前的纹理绘制图元,我们必须在绘制每个顶点之前为该顶点指定纹理坐标。只需调用
glTexCoord2d(s:Double;t:Double);
试验中我采用二次几何体,可调用gluQuadricTexture(quadratic, GL_TRUE);为所画图元添加纹理。
glPushMatrix(); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, testname); glTranslatef(0.0, 0.8, 0.0);//反复调试 glRotatef(0.0, 0.0, 1.0, 0.0); //GLUquadricObj* qObj = gluNewQuadric(); gluQuadricTexture(quadratic, GL_TRUE); gluSphere(quadratic, 0.3f, 20, 20); glPopMatrix();
实验结果
(上图四肢和头部为纹理映射)
相关文章推荐
- Tutorial 7: Texture Mapping and Constant Buffers
- Avoid Texture Aliasing and Mipmapping
- PI 7.0 & 7.1 Mapping - Blogs,Articles,Wiki,Code Samples and Videos Collections
- 【Reading Notes】CP2-Surface Shaders and Texture Mapping
- Lesson 18: SDK文档:Tutorial 7 Texture Mapping and Constant Buffers分析
- OpenGL ES From the Ground Up, Part 6: Textures and Texture Mapping
- Repeated column in mapping for entity
- Spatial data in sql and draw boundary on bing maps
- UIAlertController  VS  UIAlertView and UIActionSheet
- du and df 命令区别
- UV Texture Coordinates and Texture Mapping - OpenGL / DirectX
- Atitit.ati orm的设计and架构总结 适用于java c# php版
- andengine Animationsprite的监听
- Method for sub-pixel texture mapping and filtering
- Android  xml Animation  Drawable 画图
- My renderer update – Photon-Mapping(caustics) & Texture
- WebForms UnobtrusiveValidationMode 需要“jquery”ScriptResourceMapping
- 警告: A docBase inside the host appBase has been specified, and will be ignore2
- Atitit.ati dwr的原理and设计 attilax 总结 java php 版本
- How to use virtual path providers to dynamically load and compile content from virtual paths in