投稿    登录
  您好,欢迎光临崔庆才的博客,最近博主在忙复习考试,可能评论和友链不能及时回应,请谅解,至17.1.12解除!

OpenGL绘图实例十之绘制3D机器人

C/C++ 崔庆才 7032浏览 4评论

综述

通过上一节说的绘制3D图形基础,我们应该对绘制3D图形有了基本的认识,接下来我们就进行一个实例,绘制一个3D机器人。

本节我们要完成的任务有:

1.绘制一个仿真3D机器人(样式自选,参考例图),至少包含头、躯干、四肢三个部分.

2.对机器人填充颜色。

3.增加点光源,使得机器人更加真实。

4.实现交互,使得能够控制机器人进行旋转、前进、后退等动作。

键盘”w”:前进

键盘”s”:后退

键盘”a”:顺时针旋转

键盘”d”:逆时针旋转

接下来我们就一步步实现机器人的绘制吧。

绘制球体

绘制球体我们有两种方法,一个叫glutSolidSphere,另一个叫glutWireSphere,这两个的区别在于,一个绘制的是实心的球体,另一个绘制的是现状描绘而成的球体,在绘制过程中,我们可以通过一个参数来对其进行控制。

glutSolidSphere是GLUT工具包中的一个函数,该函数用于渲染一个球体。球体球心位于原点。在OpenGL中默认的原点就是窗口客户区的中心。
函数原型

radius,球体的半径
slices,以Z轴上线段为直径分布的圆周线的条数(将Z轴看成地球的地轴,类似于经线)
stacks,围绕在Z轴周围的线的条数(类似于地球上纬线)
一般而言, 后两个参数赋予较大的值, 渲染花费的时间要长, 效果更逼真。

然而我们可以发现,这里并没有定义球中心的参数,所以,我们可以利用平移函数组合实现。即利用glTranslated函数来实现。最后,我们定义的画球体的方法如下

其中两个常量定义如下

在这里我们还用到了上一节所说的PushMatrix和PopMatrix方法。如果不熟悉,请查看上一节的内容。

绘制长方体

同样地,利用变换平移放缩的方法,再加上类库的绘制正方体的方法,我们也可以轻松地实现绘制长方体的方法。

正方体怎样变成长方体,很简单,拉伸一下就好了。所以,我们用到了glScaled方法。

绘制长方体的方法如下

这里仍然还是定义了绘图模式,是线条还是实体。

定义光照

在这里提供一篇博文,讲光照讲得比较细致

OPENGL光照

那么在这里我就直接贴上光照设置的实现

其中设置了光源颜色,位置等参数。

图形的移动

在这里我们实现了鼠标的监听旋转和键盘的监听旋转,在这里分别描述如下

1.鼠标监听

对于鼠标监听事件,在前面的文章中已经做了说明,如果大家不熟悉可以看下面这篇文章

鼠标监听

我们要实现的就是在拖动鼠标的时候实现图形的旋转功能。

在点击鼠标时,我们记录下来点击的位置,然后在鼠标移动的时候记录下当前坐标与上一个位置的坐标之差。通过定义一个角度的变量,每次鼠标移动的时候让整个图形旋转角度加上这个差值,然后重新绘制图形,就可以实现整个图形的 旋转了。

鼠标监听的两个方法如下,分别是鼠标点击和鼠标移动。

定义两个变量,旋转角度

然后定义两个鼠标事件

恩,通过定义上面的方法,然后在main中加入监听。

display函数中,在绘图前调用该方法即可

分别是绕y轴和x轴旋转一定的角度。这样就可以实现鼠标的监听了。

2.键盘监听

键盘事件也很简单,同样是监听按键的按下。其中w、s键是用来控制机器人的远近的。

定义一个变量叫 dis,代表远近

键盘事件函数如下:

在main函数中加入监听

display函数中加入如下的变换

这样通过上述方法,我们便可以实现鼠标和键盘的监听了。

裁切物体

在这里我们可能要画一个半圆,那么最方便的方法就是裁切了,利用下面的函数,我们可以方便地实现。

void glClipPlane(GLenum plane, const GLdouble *equation);

定义一个裁剪平面。equation参数指向平面方程Ax + By + Cz + D = 0的4个系数。

equation=(0,-1,0,0),前三个参数(0,-1,0)可以理解为法线向下,只有向下的,即Y<0的才能显示,最后一个参数0表示从z=0平面开始。这样就是裁剪掉上半平面。

equation=(0,1,0,0)表示裁剪掉下半平面,

equation=(1,0,0,0)表示裁剪掉左半平面,

equation=(-1,0,0,0)表示裁剪掉右半平面,

equation=(0,0,-1,0)表示裁剪掉前半平面,

equation=(0,0,1,0)表示裁剪掉后半平面

代码示例如下

首先我们必须要定义一个GLdouble数组,然后利用glClipPlane方法来设置,然后开启裁切,最后关闭裁切。

利用类似的方法我们可以写出绘制半球的方法如下

恩,通过上述方法,我们可以方便地绘制出一个半球体。

绘制机器人

有了上述的铺垫,我们绘制机器人简直易如反掌,同样还可以实现各式各样的监听。

主要就是位置的确定了。

display函数如下

恩,通过调用这个函数我们便可以完成机器人的绘制了。

完整代码

在这里提供完整代码示例,仅供参考

仅供参考,如有问题,敬请指正。

运行结果如下

QQ截图20150607013139

恩,大体就是这样。

总结

本次实验做的比较匆忙,只研究了一个晚上的时间,所以有些地方还是不太完善,希望发出来对小伙伴们有所启发,有所帮助。如果有问题,欢迎同我交流。谢大家!

转载请注明:静觅 » OpenGL绘图实例十之绘制3D机器人

喜欢 (36)or分享 (0)

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

  1. 我有个问题,就是我想如果我知道图的坐标的话 那就是说什么图都可以话出来 就像每幅图虽然复杂但是其实就是油许多简单基本图形或者线条组成的 那问题是 那幅图的各个位置坐标怎么算出来的? 我是计算机图形学初学者