The Space of Bona

 客服热线:020-87861456

收藏本站
Project3# Draw A Robot

一、实验要求

建立一些基元,并用基元组合成一个"creature"(比如robot)。用层次来构造这个"creature"。使自己做出来的"creature"添加一些动作,让它动起来。最后对它进行纹理贴图。

二、实验内容

1.建立基元。

我写了DrawCube函数,以原点为中心,创建一个长宽高均为2的立方体。

2.display函数.

基元之间的组合方式和对动作的处理。设置了一些全局变量,用于表明旋转角度或者前进距离等。elbow为关节旋转的角度,shoulder为肩膀和大腿旋转的角度。Turn为整体旋转的角度。Forward为前进的距离。

A 手臂的部分

左臂和右臂的实现方式是大致相同的,所以在这里只描述一个。手臂由两个部分组成,大臂和小臂。大臂和小臂之间添加一个球,作为肘部,使之看上去更自然一些。先画小臂,在原点画出立方体之后,按比例缩放成小臂的大小。向下平移,绕x轴旋转elbow度,画出手肘,再向下平移留出画大臂的空间,在 原点画出立方体缩放成大臂,向下平移到适合旋转的位置,绕x轴旋转shoulder度,再平移到肩膀的位置,即完成了手臂部分的绘制。之后绕y轴旋转turn度。沿x轴平移forward距离。

B 躯干和头的部分

先画出头,向上平移空出上躯干的空间,在原点画出上躯干,上躯干和头向上平移,画出下躯干。之后绕y轴旋转turn度,沿x轴平移forward距离。

C 腿的部分

左腿和右腿的实现方式是大致相同的所以在这里只描述一个。腿由三部分组成,脚,小腿 和大腿。大腿和小腿之间添加一个球,使之看上去更自然一些。先画脚,在原点画完正方体之后,将其按比例缩放成脚的大小。向下平移留出画小腿的空间,画出小腿,缩放,向下平移,绕x轴旋转elbow度,画出膝 盖,向下平移,画出大腿,向下平移,绕x轴旋转shoulder度,再平移到大腿和腰的连接处,即完成了腿的部分的描绘。之后绕y轴旋转turn度,沿z轴平移forward距离。

D 总体的层次

左小臂,左大臂,右小臂,右大臂 ---->头,上躯干,下躯干--->左脚,左小腿,左大腿,右脚,右小腿,右大腿。

3.使机器人动起来

 Keyboard函数中写了对键盘的一些响应,当按下w时就将forward加一,按下s时就将forward减一。按下a和d时就将turn也就是整体绕y轴旋转的角度做修改。每做一次修改就调用个glutPostRedisplay()方法,也就会以新的全局变量重新绘制一次界面,最终给人的感觉就像是机器人动起来了。同时为了使机器人看起来更加自然,我在机器人动的同时,计算出手肘和膝盖应该旋转的角度elbow。在运动时,手肘和膝盖会自然弯曲。同时设置判断,即手臂挥动一定角度时就会反向运动,更加契合行走时的动作。

4.光照和贴图(纹理映射)

本次实验没有采用高级的光照,而是在给每个基元设置材料时,设置了glMaterialfv(GL_FRONT, GL_EMISSION, no_mat); 即材料自己会发出微弱的光,但是不会影响其他基元。这样可以避免透明和相互遮盖的问题。

贴图的实现是和创建立方体结合在一起的。画立方体实际上是画出六个面,组合成一个立方体。在画立方体时,先绑定一个纹理,在画每个面时,将四个点映射到纹理的四个点。这样就相当于在立方体的一个面上贴了图。

关于贴图我设置了一个texture数组,在初始化时将bmp图片转化成纹理并load到这些数组中。对手臂,腿等不同基元我都设置了不同的纹理。头部是另外画的,面部表情和其他五个面不同。

设置了一个背景,也是画一个立方体,贴上背景的图,将厚度设为0,再平行于xy轴所在平面,放在距离机器人很远的后方,就相当于做了一个背景。

同时由于绑定是在绘制基元时绑定的,所以我在keyboard函数中加了几个按键的相应,分别可以给人物换表情,换背景等等。按下按键后,将不同的图片load到数组的相同位置并glutPostRedisplay(),基元画面时重新绑定相应纹理。这样就替换了纹理。

三、实验总结

经过这次实验,我深刻地体会到openGL的强大之处,也理解了hierarchy的内涵。知道了怎么通过旋转平移缩放等变换组成一个个体并且使其自然地动起来。了解了纹理映射的原理和实现方法。

这次实验还有一些缺陷,最大的缺陷就是没有真正的光照,无法改变光照的角度和观察角度,只能在正面视角观察机器人,看不见机器人的全貌。没有添加对鼠标按键的响应。