投稿    登录
  博主录制的Python3爬虫视频教程已发布!详情请戳Python3爬虫视频教程!希望大家支持!非常感谢!

OpenGL绘图实例九之3D绘图基础

C/C++ 崔庆才 5089浏览 0评论

综述

在前面我们进行了2D图形的绘制,接下来,我们将步入3D图形的世界,绘制出一个3D机器人,好,废话不多说,让我们一起来迈入3D绘图之旅吧。

基本函数

那么在绘图之前呢,我们首先要介绍几个新的函数,弄懂了这几个函数我们才能方便地绘制出我们的3D机器人。

那么我们介绍一下gluPerspectivegluLookAt、glPushMatrix、glPopMatrix()函数

1.void gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear,GLdouble zFar)

参数说明:

fovy,视角的大小,如果设置为0,相当闭上眼睛,什么也看不到,如果为180,则可以看到几乎所有的内容。一般设置为60即可。

aspect,就是实际窗口的纵横比,即x/y,一般都是要按照窗口比例来,否则看到的图形和实际图形就会不一样了。

zNear,表示近处的裁面。

zFar,表示远处的裁面。

gluPerspective这个函数指定了观察的视景体在世界坐标系中的具体大小,一般而言,其中的参数aspect应该与窗口的宽高比大小相同。比如说,aspect=2.0表示在观察者的角度中物体的宽度是高度的两倍,在视口中宽度也是高度的两倍,这样显示出的物体才不会被扭曲。

详细说明

03087bf40ad162d9f337731d11dfa9ec8b13cdd1

 

2.void gluLookAt(GLdouble eyex,GLdouble eyey,GLdouble eyez,GLdouble centerx,GLdouble centery,GLdouble centerz,GLdouble upx,GLdouble upy,GLdouble upz)

该函数定义一个视图矩阵,并与当前矩阵相乘。
第一组eyex, eyey,eyez 相机在世界坐标的位置
第二组centerx,centery,centerz 相机镜头对准的物体在世界坐标的位置
第三组upx,upy,upz 相机向上的方向在世界坐标中的方向
你把相机想象成为你自己的脑袋:
第一组数据就是脑袋的位置
第二组数据就是眼睛看的物体的位置
第三组就是头顶朝向的方向(因为你可以歪着头看同一个物体)

在这里,我们就涉及到一个十分重要的概念,坐标系。

在3D绘图中,坐标系是右手系,如果x轴指向我们的右侧,那么y则指向上侧,z轴指向屏幕外。如下图所示。

20150606234046

理解了上述两个函数,下面我们来用一个小例子感受一下

运行如下代码

运行结果如下

QQ截图20150606234448

在这里,我们定义了

意思就是把我们的眼睛放到了(0,0,5)的位置,茶壶放到了原点,脑袋顶朝上,即正视茶壶。

如果我们改变了几个参数的值,例如

眼睛位置不变,茶壶位置变为(4,1,0),脑袋顶的方向朝屏幕外侧,那么看到的效果如下。

QQ截图20150606234708

大家可以通过更改这些参数的值来对视图进行变换。

3.glPushMatrix()、glPopMatrix()

这个方法在绘制3D图形时依然十分有用,因为我们需要绘制好多个图形,绘制多个不一样的图形必然要经过各种矩阵变换,所以,少不了的利用平移变换放缩的功能,所以为了保证每个图形不受影响,在绘制一个新图形前我们只要调用一下glPushMatrix函数,保存当前的变换矩阵,然后绘制完一个图形之后再调用glPopMatrix函数来恢复之前的变换矩阵就可以了。

比如,绘制球体

在两个函数中间我们可以进行任意的变换放缩等操作,然后绘制想要的图形即可。

绘图函数

接下来我们说一下一些常用的绘图函数,直接用类库函数来绘制即可。

利用上面的绘图函数我们便可以方便地实现各种图形的绘制。

结语

那么本节就先告一段落,本节介绍了相关的绘图函数以及几个重要的函数,为接下来我们绘制机器人做下铺垫,希望小伙伴们可以好好理解。

 

转载请注明:静觅 » OpenGL绘图实例九之3D绘图基础

喜欢 (12)or分享 (0)

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请狠狠点击下面的

想结交更多的朋友吗?

来进击的Coder瞧瞧吧

进击的Coder

QQ群号 99350970 立即加入

进击的Coder灌水太多?

这里是纯粹的技术领地

激进的Coder

QQ群号 627725766 立即加入

想找人聊天解闷?想要学习干货?

微信公众号进击的Coder为你打造

进击的Coder

微信公众号 扫一扫关注