【OpenGL】机器人手臂的实现

一、基本功能

实现了机器人的一只手臂,由上臂、下臂、五根手指共同组成,通过A、S、D、F、G键向上旋转,通过a、s、d、f、g键向下旋转,通过方向键left和right转向,通过up和down实现放缩。

效果图如下:

 

二、实现过程

 

1、实现手臂

对于手臂的实现,可以使用一个经过放缩后的立方体作为手臂的一段。手臂模型搭建好后,就是要确定手臂的位置,因为手臂进行旋转,不是绕手臂的中心节点(等同于立体体的体心)进行旋转,它是绕手臂的一条边(等同于立方体的一条边)进行旋转。

因此先调用glTranslatef()函数移动至手臂的旋转边上,在旋转边进行旋转glRotate(),再走glTranslatef()进行绘制,此时绘制点即手臂的中心节点,而我们旋转的位置在手臂的旋转边上。实现代码如下所示:

glTranslatef(0.0, 0.0, -distance);

    glRotatef(theta, 0.0, 1.0, 0.0);

    /*绘制第一段*/

    glTranslatef(-1.0*n, 0.0, 0.0);

    glRotatef(shoulder, 0.0, 0.0, 1.0);

    glTranslatef(1.0*n, 0.0, 0.0);

    glPushMatrix();

         glColor4f(1.0f, 0.0, 0.0, 0.0);

         glScalef(2.0*n, 0.4*n, 1.0*n);

         glutSolidCube(1.0);

         //glutWireCube(1.0);

    glPopMatrix();

绘制完该段手臂后,可以继续使用上述代码实现下臂。

 

2、实现手指

因为手指的宽度是比手臂要窄的多,因此,绘制手指,需要先沿手臂宽度方向移动位置,设置好每个手指的起始位置,而手指的位置方法同手臂,因此循环上述过程即可。

 

3、实现手动控制手臂的转动

通过创建键盘响应的相应回调函数即可实现这一功能。

 

4、遇到的问题与思考

在实现过程中,我在手指的绘制过程中卡了一下,因为我自己认为我写的几何变换没有问题,但是却无法被绘制出来,因此我想造成这种问题是否是我几何变换导致的,因此我反复推算几何变换过程的结果,自己觉得并没有问题,因此我进行放缩、旋转进行观察,判断其是否可能是因为被裁剪掉了,之后我发现也不是这个问题,因此我想是不是我给的放大系数n12、n13太小了导致的。因此我将其放大到与n一样的大小,甚至更大,我发现我的手指可以画出来,只是很小,我再次推送我的几何变换式子,发现了问题之所在,我对glScalef的变换没有去保护环境,也就是说,我的手指,是在n11的基础上进一步被缩小了,而我的n11放缩系数是第一节手指,n12是第二节手指,因此我第二节手指的实际放缩倍数为了n11*n12,导致画出的手指很小,几乎看不到,导致这一结果的原因也是因为,自己一直漏考虑到了glScalef的变换。

 

5、源代码

待上传

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章