- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
图形学实验一 三维分形(附源代码)
实验报告
实验名称:三维分形算法
姓名:陈怡东
学号程序使用说明:
程序打开后会呈现出3次分形后的四面体,因为考虑到观察效果的清晰所以就用了3次分形作为演示。
与用户的交互:
1键盘交互:分别按下键盘上的数字键1,2,3,4可以分别改变四面体的4个面的颜色。
按下字母c(不区别大小写)可以改变视图函数,这里循环切换3种视图 函数:glOrtho,glFrustum,gluPerspective,但是改变视图函数后要窗口形状变化后才能 显现出来
按下字母键q(不区别大小写)可以退出程序
2鼠标交互: 打开后在绘图的区域按下鼠标左键不放便可以拖动图形的视角,这里 为了展现图形的3D效果因此固定了其中一点不放,这样就可以看到3D的效果。
鼠标右击则有弹出菜单显示,其中改变颜色则是同时改变4个面的颜色,本程序中运用了8组配色方案。
改变视图函数也是上述的3种函数,这里的效果立刻显现,但是还有很多问题达不到所要的效果,希望老师能帮忙解决一下。
设计思路:
分形算法:把四面体细分成更小的四面体,先找出其6个棱的中点并连接起来,这样就在4个顶点处各有一个小的四面体,原来四面体中剩下的部分应当去掉。仿效二维的生成方法,我们对保留的四个小四面体进行迭代细分。这样细分结束后通过绘制4个三角形来绘制每一个剩下的四面体。
交互的实现:键盘交互,即通过对按键的响应写上响应函数实现对视图和颜色的改变。
鼠标交互:通过对鼠标左右按键的
实现:
该部分只做了必要的介绍,具体实现见代码(附注释)
分形算法:void tetra(GLfloat *a,GLfloat *b,GLfloat *c,GLfloat *d)函数实现的是绘制四面体并且给四个面绘上不同的颜色。以区别开来,函数的实现细节见代码,有注释介绍。
void triangle3(GLfloat *a,GLfloat *b,GLfloat *c)函数用来绘制每个平面细分后的三角形。其中顶点设置为3维坐标glVertex3fv(a);
void divide_tetra(GLfloat *a,GLfloat *b,GLfloat *c,GLfloat *d,int m)细分四面体的函数实现。前四个参数为传入点的坐标,最后参数m则是细分次数。先计算六个中点的坐标mid[1][j]=(a[j]+c[j])/2;3次循环则是对x,y,z三个坐标的一次计算,然后再递归调用绘制4个小四面体。
然后是显示回调函数void mydisplay3FX();这跟程序模板差不多不做过多介绍。
分形算法中必要重要的一点是隐藏面的消除。即书上2.10.3介绍的内容。对对象进行排序以正确绘制他们的算法称为可见表面算法,也课称为隐藏面消除算法。这里采用的死Z-缓存算法。在主程序中申请辅助存储器:一个Z(深度)缓存,为此把初始化代码改为
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);
递归结束的时候调用函数:glEnable(GL_DEPTH_TEST);
算法在深度缓存中存储信息,所以必须在需要重绘的窗口清空这个缓存。为此把函数中的清屏操作改为:glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
键盘交互通过键盘回调函数glutKeyboardFunc(myKeyboard)来调用键盘响应函数,响应事件则在void myKeyboard()中具体实现。
分别判断按下的按键的具体值,然后通过改变colors数组的值以及视图函数来改变现实,所用的颜色索引保存在colorChange数组之中。
鼠标交互:其中用到了鼠标事件(mouse event)和移动事件(move event)然后分别通过回调函数glutMouseFunc(myMouse),glutMotionFunc(myMotion);来调用。
代码中对与鼠标单击相应即视角的移动,先通过点击的位置获取点下的坐标,用来判断是否在四面体内部的函数用glReadPixels(x,500-y,1,1,GL_RGB,GL_FLOAT,pix);来实现。该函数读取点击位置的像素,将获取的结果存入数组pix在后面的判断算法中如果像素不为0则拾取该图形。该算法的好处是不需要计算复杂的坐标和线段函数而能方便的拾取对象。缺点则是在内部的白色区域点击不能够拾取图像。具体代码的实实现函数void myMouse(int btn,int state,int x,int y)
移动相应函数void myMotion(int x,int y)首先对于移动过程中获取的坐标与全局变量定义的坐标统一数量级。所以在代码开头除以150,然后对每个点的坐标以此做改变,并将这次获取的坐标存
文档评论(0)