随笔 - 17, 文章 - 0, 评论 - 54, 引用 - 0
数据加载中……

课程实验指导-3

实验三 变换

1.实验目的:

进一步掌握二维、三维变换的数学知识、变换原理、变换种类、变换方法;进一步理解采用齐次坐标进行二维、三维变换的必要性;利用OpenGL实现二维、三维图形变换。

2.实验内容:

(1)       掌握二维、三维变换的原理及数学公式;

(2)       利用OpenGL实现二维、三维图形变换,在屏幕上显示变换过程或变换结果。

3.实验原理:

  OpenGL的三个基本几何变换函数介绍如下:

1 平移变换

平移变换函数如下:

void glTranslate{fd}(TYPE x,TYPE y,TYPE z);

三个函数参数就是目标分别沿三个轴向平移的偏移量。这个函数表示用这三个偏移量生成的矩阵乘以当前矩阵。当参数是(0.0,0.0,0.0)时,表示对函数glTranslate*()的操作是单位矩阵,也就是对物体没有影响。

2 旋转变换

旋转变换函数如下:

void glRotate{fd}(TYPE angle,TYPE x,TYPE y,TYPE z);

函数中第一个参数是表示目标沿从点(x,y,z)到原点的方向逆时针旋转的角度,后三个参数是旋转的方向点坐标。这个函数表示用这四个参数生成的矩阵乘以当前矩阵。当角度参数是0.0时,表示对物体没有影响。

3 比例变换

比例变换函数如下:

void glScale{fd}(TYPE x,TYPE y,TYPE z);

三个函数参数值就是目标分别沿三个轴向缩放的比例因子。这个函数表示用这三个比例因子生成的矩阵乘以当前矩阵。这个函数能完成沿相应的轴对目标进行拉伸、压缩和反射三项功能。当参数是(1.0,1.0,1.0)时,表示对函数glScale*()操作是单位矩阵,也就是对物体没有影响。当其中某个参数为负值时,表示将对目标进行相应轴的反射变换,且这个参数不为1.0,则还要进行相应轴的缩放变换。最好不要令三个参数值都为零,这将导致目标沿三轴都缩为零。 
有关OpenGL变换详细内容还可参看:http://blog.chinaunix.net/u/26313/showart_218525.html

4.实验代码:

  

#include <GL/glut.h>

#include <stdlib.h>

GLfloat   rtri;//金字塔旋转角度

 

void init(void)

{

       glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

       glShadeModel(GL_SMOOTH);//设为smooth处理方式,注意看区别

       glEnable(GL_DEPTH_TEST);//激活深度测试

}

 

void display(void)

{

       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    //清除颜色缓存和深度缓存

       glLoadIdentity();

       glTranslatef(-1.5f,0.0f,-6.0f);//请尝试修改此函数,掌握其用法与参数含义

       glRotatef(rtri,0.0f,1.0f,0.0f);//请尝试修改此函数,掌握其用法与参数含义

       glBegin(GL_TRIANGLES);

              glColor3f(1.0f,0.0f,0.0f);

              glVertex3f( 0.0f, 1.0f, 0.0f);

              glColor3f(0.0f,1.0f,0.0f);

              glVertex3f(-1.0f,-1.0f, 1.0f);

              glColor3f(0.0f,0.0f,1.0f);

              glVertex3f( 1.0f,-1.0f, 1.0f);

 

              glColor3f(1.0f,0.0f,0.0f);

              glVertex3f( 0.0f, 1.0f, 0.0f);

              glColor3f(0.0f,0.0f,1.0f);

              glVertex3f( 1.0f,-1.0f, 1.0f);

              glColor3f(0.0f,1.0f,0.0f);

              glVertex3f( 1.0f,-1.0f, -1.0f);

 

              glColor3f(1.0f,0.0f,0.0f);

              glVertex3f( 0.0f, 1.0f, 0.0f);

              glColor3f(0.0f,1.0f,0.0f);

              glVertex3f( 1.0f,-1.0f, -1.0f);

              glColor3f(0.0f,0.0f,1.0f);

              glVertex3f(-1.0f,-1.0f, -1.0f);

 

              glColor3f(1.0f,0.0f,0.0f);

              glVertex3f( 0.0f, 1.0f, 0.0f);

              glColor3f(0.0f,0.0f,1.0f);

              glVertex3f(-1.0f,-1.0f,-1.0f);

              glColor3f(0.0f,1.0f,0.0f);

              glVertex3f(-1.0f,-1.0f, 1.0f);

       glEnd();

 

      

       rtri+=0.1f;//加一个角度

       glutSwapBuffers();//交换双缓存

}

 

void reshape (int width, int height)

{

       glViewport(0, 0, width, height);

       glMatrixMode(GL_PROJECTION);

       glLoadIdentity();

       gluPerspective(45.0f, (GLfloat)width/(GLfloat)height, 0.1f, 100.0f);

       glMatrixMode(GL_MODELVIEW);

       glLoadIdentity();

}

 

void keyboard(unsigned char key, int x, int y)

{//请参考"变换示例参考"一文,考虑添加键盘命令,交互式来控制金字塔的旋转

       switch (key)

       {

              case ‘x’:

                     exit(0);

                     break;

              default:

                     break;

   }

}

 

int main(int argc, char** argv)

{

       glutInit(&argc, argv);

       glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);//使用双缓存模式和深度缓存

       glutInitWindowSize(640, 480);

       glutInitWindowPosition(100, 100);

       glutCreateWindow("Transform2");

       init();

       glutDisplayFunc(display);

       glutReshapeFunc(reshape);

       glutKeyboardFunc(keyboard);

       glutIdleFunc(display);//设置空闲时调用的函数

       glutMainLoop();

       return 0;

}

代码注释:

 这个程序需要注意的地方有几点。

使用了双缓存模式,程序在空闲时一直不停的调用display函数,这个函数绘制完图像后,改变旋转的角度,然后交换双缓存,这样,每画完一帧就交换,形成了动画。

另外,使用了深度缓存,激活了深度测试,这样,被遮挡的面就不会显示,大家可以把激活深度缓存的一行去掉看看效果。大家还可以改变变换的方式,达到不同的效果。
思考:参考"课程实验指导-3 参考"一文考虑为本程序加上交互键盘操作命令,提供不同旋转方式,如绕X轴,绕Z轴方式的旋转,还可以增加交互式平移变换命令.

posted on 2007-10-25 22:15 CG&CAD 阅读(834) 评论(23)  编辑 收藏 网摘 所属分类: 实验指导

评论

#1楼   回复  引用    

沙发
2007-10-25 22:22 | .。。。[未注册用户]

#2楼   回复  引用    

zeus同志怎么没去抢首发,哈哈?
2007-10-26 09:22 | YI.W[未注册用户]

#3楼   回复  引用    

课程实验指导-3 代码有一个错误运行不了
2007-10-26 17:18 | 某某某某[未注册用户]

#4楼   回复  引用    

少个头文件,把exit(0)去掉也能运行
2007-10-26 18:07 | .。。。[未注册用户]

#5楼   回复  引用    

DEV中加入
#include <stdlib.h>
就可以了。
VC中估计也行,另外VC中可以试试cstdlib.h
2007-10-26 21:06 | Yes-zEus[未注册用户]

#6楼   回复  引用    

@回复YI.W同志
来晚了,现在正式宣布沙发党占领6楼
2007-10-26 21:10 | Yes-zEus[未注册用户]

#7楼   回复  引用    

上面的金字塔代码有5个错误,运行不了怎么办?
2007-10-27 11:23 | 树叶[未注册用户]

#8楼[楼主]   回复  引用  查看    

什么样的错误?
贴上来看看?
2007-10-27 12:12 | Xu WP      

#9楼[楼主]   回复  引用  查看    

@树叶
把代码中的
case ‘x’:
这一行删掉,重新在编辑器中自己输入.
估计是拷贝时产生的中英文字符转换问题.
2007-10-27 12:17 | Xu WP      

#10楼   回复  引用    

OK
好了
2007-10-27 12:49 | kiss[未注册用户]

#11楼   回复  引用    

谢谢楼主 这下好了
2007-10-27 14:05 | shuye[未注册用户]

#12楼   回复  引用    

MFC机制下的交互问题望徐老师给予同学们指导,谢谢!!
2008-03-23 20:45 | sg.xing[未注册用户]

#13楼[楼主]   回复  引用  查看    

@sg.xing
我想你可能是想知道如何实现"为本程序加上交互键盘操作命令,提供不同旋转方式,如绕X轴,绕Z轴方式的旋转,还可以增加交互式平移变换命令."这个思考题吧?
这个问题可以参考"课程实验指导-3 参考",里面有一些内容可以学习下.
其实,我所给的代码是基于Console Application, 没有用到MFC机制.有兴趣的话可以参看其它相关资料,也可以实验时和我讨论.
2008-03-25 09:26 | Xu WP      

#14楼   回复  引用    

强烈推荐《计算机图形学实用技术》陈远琰,张晓竞编著
该书较好的介绍了图形学的相关原理,和OpenGL库函数的相关用法,还有大量vc++环境下实现的例子,可直接上机实现!同学们在迅雷上输入教材名即可下载,不过需要安装超星阅览器。
2008-03-25 22:26 | sg.xing[未注册用户]

#15楼[楼主]   回复  引用  查看    

@sg.xing
这本书可以看看.在学校图书馆主页的电子资源一栏中的超星数字图书中就可搜索并下载。
2008-03-28 17:47 | Xu WP      

#16楼   回复  引用    

徐老师,OpenGl宝书中文版您有吗?有的话给我发一份!谢谢!!
2008-04-02 11:53 | sg.xing[未注册用户]

#17楼[楼主]   回复  引用  查看    

@sg.xing
好的,请查收邮箱.
2008-04-02 17:44 | Xu WP      

#18楼   回复  引用    

交互键盘操作命令~
哎,不知道从哪里开始改,无从下手.
2008-10-15 09:12 | Sven[未注册用户]

#19楼   回复  引用    

--引用--------------------------------------------------
sg.xing: 徐老师,OpenGl宝书中文版您有吗?有的话给我发一份!谢谢!!
<br>
--------------------------------------------------------
俺也想要,能不能给发一份啊?谢谢!
2008-12-07 22:00 | 明了[未注册用户]

#20楼[楼主]   回复  引用  查看    

@明了:
已发,请查收信箱.
PS: 称呼错了,不好意思...
2008-12-08 00:19 | CG&CAD      

#21楼   回复  引用    

是不是我留给你的邮箱错了啊,没能收到您发的OpenGl宝书中文版资料。ps:有没有裁剪任意多边形的程序啊?现在在做这个程序,百思不得其解。谢谢您
ljk841130@126.com
2008-12-08 14:33 | 明了[未注册用户]

#22楼[楼主]   回复  引用  查看    

@明了
邮箱没错,可能是文件太大,有26M,发不过去.你想个办法,我帮你传过去也行.
2008-12-08 20:19 | CG&CAD      

#23楼   回复  引用    

@CG&amp;CAD
你加我qq好吧,414007128.
2008-12-10 14:27 | 明了[未注册用户]



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 937879




相关文章:

相关链接: