- 1、本文档共20页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
OpenGL曲线、曲面的绘制与3D模型的装载与显示
实验7 OpenGL曲线、曲面的绘制与3D模型的装载与显示实验目的:理解Bezier曲线、曲面绘制的基本原理;理解OpenGL中一维、二维插值求值器的用法。掌握OpenGL中曲线、曲面绘图的方法,对比不同参数下的绘图效果差异;实验要求:教师领读代码;学生上机实验;针对代码1,分别或同时去掉开关1和开关2的代码注释,查看并记录实验效果;用公式说明Bezier曲线、曲面的绘制计算过程;针对代码2,分别或同时去掉各开关,观察并记录显示效果差异;用公式说明Bezier曲面插值点的计算过程;说明线框模型与曲面模型的区别;针对代码3:实验和观察材质参数、光照参数、坐标参数对实验效果的影响;理解均匀与非均匀样条有理曲线或曲面的差异;针对代码4:掌握非均匀有理B样条曲面(NURBS曲面)的曲面绘制方法;阅读/sweetdark/blog/184313代码,编写曲面裁剪和细分曲面的效果。9)OpenGL如何装载并显示3D MAX导出的3D模型实验及代码,课外自行完成。代码1:用四个控制点绘制一条三次Bezier曲线://Demo: 用四个控制顶点来画一条三次Bezier曲线#include stdlib.h#include time.h#include GL/glut.h//4个控制点的3D坐标——z坐标全为0GLfloatctrlpoints[4][3] = {{-4, -4, 0}, {-2, 4, 0}, {2, -4, 0}, {4, 4, 0}};voidinit(void){//背景色glClearColor(0.0, 0.0, 0.0, 1.0);//将控制点坐标映射为曲线坐标//参数:GL_MAP1_VERTEX_3,3维点坐标//参数2和3:控制参数t或u的取值范围[0, 1]//参数4:曲线内插值点间的步长3——3维坐标//参数5:曲线间的补偿为顶点数4个——总步长为12//参数6:控制点二维数组首元素地址//note: 若是在这里设置了相关参数,后续对ctrlpoints内容更改曲线不变glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, ctrlpoints[0][0]);//打开开关——允许3维坐标控制点到参数点转换开关glEnable(GL_MAP1_VERTEX_3);glShadeModel(GL_FLAT);//代码开关2:去掉本注释,可启用反走样/*glEnable(GL_BLEND);glEnable(GL_LINE_SMOOTH); //允许直线反走样glHint(GL_LINE_SMOOTH_HINT, GL_FASTEST); // Antialias the linesglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); */}void display(void){int i;glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0, 1.0, 1.0);//代码开关1:去掉本注释,查看动态的曲线绘图效果:动态更新控制点坐标 /*for(int t = 0; t 4; t++) {for(int j = 0; j 3; j++)ctrlpoints[t][j] = (rand() % 1024 / 1024.0 - 0.5) * 10;}//动态映射glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, ctrlpoints[0][0]);*/glLoadIdentity();glColor3f(1.0, 0.0, 0.0);//绘制连续线段glBegin(GL_LINE_STRIP);//参数t或u取值为i/30,共计31个点for (i = 0; i = 30; i++)glEvalCoord1f((GLfloat) i/30.0); //根据4个控制点坐标的参数化插值glEnd(); /* 显示控制点 */glPointSize(5.0); glBegin(GL_POINTS);for (i = 0; i 4; i++)glVertex3fv(ctrlpoints[i][0]);glEnd();glTranslatef(-0.1f,0.1f,0.0f);glColor3f(0.0, 1.0, 0.0);//glLineWidth(2.0);//绘制连续线段——线段数越多,曲线越光滑glBegin(GL_LINE_STRIP);//设置参数t或u取值为i/60,共计61个点 //实验:若让t从-2变化到+2,可看到什么效果for (i = 0; i = 60; i++)glEvalCoord1f((GLfloat) i/60.
文档评论(0)