欢迎来到天天文库
浏览记录
ID:37834247
大小:972.61 KB
页数:11页
时间:2019-06-01
《如何绘制花托(轮胎)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、这里从OpenGL的角度来谈绘制花托的方法。--写在前面的话何健首先看一组花托的实例:图1花托的正面视图图2花托的侧面视图既然选择手工绘制,必须进行数学分析了。首先要确定总体的设计算法:按照微积分的数学思想,我们可以选择一个“通用”的截面进行分析,这里很明显就是下图标记为红色的圆,然后让它绕原点旋转360°,就形成了花托(这是老外的说法,说成轮胎也无妨)。PB2θ2O2A2θ1B1O1A1图3花托的一个简化版本为了方便描述,我们做些规定(可能与之前的“内圆”“外圆”的说法不同,但后面具体实现绘制
2、花托时,就会看到它的方便了):圆心O1和O2的距离,我们称之为大半径,用R表示,对应的圆称之为“大圆”;以O2为圆心的圆的半径,我们称之为小半径,用r表示,对应的圆称之为“小圆”。也就是说,“大圆”是我们正面看到的边界在花托中线的圆,“小圆”是我们侧面看到的一个截面。从设计程序角度来说,绘制这个花托需要2层循环:外循环负责旋转“大圆”内的角度值,内循环负责旋转“小圆”内的角度值。“大圆”每旋转一个角度步长值,“小圆”要完成一圈的旋转。更进一步,我们在“大圆”上采集80个点(实际上每个点都是一个“
3、小圆”的圆心),在“小圆”上采集40个点(GLintnumMajor=80;GLintnumMinor=40;)。现在,我们来考虑在“小圆”上采集的这些点的坐标,这里使用俯瞰视图分析比较方便(实际上,下图的上下方向分别代表z轴的负正方向),至于圆截面上x轴的选取,我们选择大圆半径方向的延长线所在的直线为x轴----这样选取的好处在于,这条直线在xy平面上(关键就是这点),“小圆”边界上的点只要投影到这条直线上,再根据“大圆”内的旋转角度,就可以计算出“小圆”边界上的点在世界坐标系中的x和y坐标,
4、而“小圆”边界上的点距离这条直线的距离其实就是世界坐标系中的z坐标值。B2O2θ2PrA2O1θ1图4俯瞰视图下的一个截面而如果如下图选取x轴就会非常不方便:B2O2θ2x轴A2O1图5圆截面上不好的x轴选取方法(本地坐标系)看着图4结合自己的三维空间想象力,我们可以得到“小圆”上的采样点的坐标:??=(r∗cos?2+R)∗cos?1{??=(r∗cos?2+R)∗sin?1??=r∗sin?2其中,?1为“大圆”内的旋转角度,?2为“小圆”内的旋转角度。说到这里,核心部分就完了。接下来,只要
5、外层循环----“大圆”完成角度的360°旋转,一个最简易版的边框花托就绘制成了(代码见附录1):图6正面视图图7侧面视图为了实现更好的效果,我们可以利用一个小技巧:使用三角带(GL_TRIANGLE_STRIP),相应地,程序实现上需要修改的地方:在外层循环中要一次采样2个点(代码见附录2)。图8使用三角带后的正面视图图9使用三角带后的侧面效果附录1:使用GL_LINE_LOOP绘制轮胎#include"StdAfx.h"#defineFREEGLUT_STATIC#include6、ls.h>#include#include#includestaticGLfloatyRot=0.0f;GLintnNumMajor=80,nNumMinor=40;//采样点的数目GLfloatfStepMajor=2*M3D_PI/nNumMajor;//大圆旋转步长GLfloatfStepMinor=2*M3D_PI/nNumMinor;GLfloatfAngleMajor=0.0f;//大圆的旋转角度GLfloatfAngleMi7、nor=0.0f;GLfloatx=0.0f,y=0.0f,z=0.0f;//空间一个顶点的坐标GLfloatR=5.0f,r=2.0f;//大圆小圆的半径voidSetupRC(){glClearColor(0.0f,0.0f,1.0f,1.0f);//bluebackgroundcolorglColor3f(1.0f,1.0f,1.f);//whitepencolorglEnable(GL_DEPTH_TEST);//开启深度测试glEnable(GL_SMOOTH);//glPolygon8、Mode(GL_FORNT_AND_BACK,GL_LINE);}voidRenderScene(){glClear(GL_COLOR_BUFFER_BIT9、GL_DEPTH_BUFFER_BIT);//清除颜色深度缓冲区glPushMatrix();glTranslatef(0.0f,0.0f,-25.0f);//使球体往屏幕里面平移glRotatef(yRot,0.0f,1.0f,0.0f);//旋转for(fAngleMajor=0.0f;fAngleMajor<=2*M3D_PI;fAn
6、ls.h>#include#include#includestaticGLfloatyRot=0.0f;GLintnNumMajor=80,nNumMinor=40;//采样点的数目GLfloatfStepMajor=2*M3D_PI/nNumMajor;//大圆旋转步长GLfloatfStepMinor=2*M3D_PI/nNumMinor;GLfloatfAngleMajor=0.0f;//大圆的旋转角度GLfloatfAngleMi
7、nor=0.0f;GLfloatx=0.0f,y=0.0f,z=0.0f;//空间一个顶点的坐标GLfloatR=5.0f,r=2.0f;//大圆小圆的半径voidSetupRC(){glClearColor(0.0f,0.0f,1.0f,1.0f);//bluebackgroundcolorglColor3f(1.0f,1.0f,1.f);//whitepencolorglEnable(GL_DEPTH_TEST);//开启深度测试glEnable(GL_SMOOTH);//glPolygon
8、Mode(GL_FORNT_AND_BACK,GL_LINE);}voidRenderScene(){glClear(GL_COLOR_BUFFER_BIT
9、GL_DEPTH_BUFFER_BIT);//清除颜色深度缓冲区glPushMatrix();glTranslatef(0.0f,0.0f,-25.0f);//使球体往屏幕里面平移glRotatef(yRot,0.0f,1.0f,0.0f);//旋转for(fAngleMajor=0.0f;fAngleMajor<=2*M3D_PI;fAn
此文档下载收益归作者所有