如何绘制花托(轮胎)

如何绘制花托(轮胎)

ID:37834247

大小:972.61 KB

页数:11页

时间:2019-06-01

如何绘制花托(轮胎)_第1页
如何绘制花托(轮胎)_第2页
如何绘制花托(轮胎)_第3页
如何绘制花托(轮胎)_第4页
如何绘制花托(轮胎)_第5页
资源描述:

《如何绘制花托(轮胎)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

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#include

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

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。