高级图形学期末作业
一、实验要求
要求实现机器人带光照的绘制和运动变换。通过 glPushMatrix()函数和
glPopMatrix()函数绘制出机器人层次结构模型和几何变换,要求实现机器人
手、脚、头、肩膀的旋转等几何变换,能够实现机器人走路的效果。同时机器
人应打上光照增强效果。
二、实验原理
用 windows api 创建窗口,使用 OpenGL 绘制球体,方形构成机器人身
体的个个部分;使用键盘的按键控制机器人手、脚、头以及肩膀的旋转和机器
人的行走;设置视点视角,通过改变视角从不同的角度观测;使用不同的光照
参数;增加纹理映射效果。
2.1 3D 管道中的几何变换o
旋转矩阵行向量为该矩阵坐标系在原坐标系上的坐标,列向量为原坐标系
的向量在本旋转矩阵坐标系上的坐标。旋转是欧氏变换;旋转、放缩是线性变
换;旋转、放缩、平移是仿射变换;旋转、放缩、平移、透视投影是射影变换。
o
线性变换在四维空间,仿射变换在三维空间,射影必须采用摄像坐标系,仿射
变换是到自身的一类变换。透视投影,就是以中心投影为依据所作的透视图象。
o正交投影将物体垂直的投影在屏幕上,在正交投影当中,物体的大小不会随着
视口屏幕等参数的改变而变化。在正交投影中,三维物体的坐标沿平行线投影
到观察平面上,它保持物体的有关比例不变。
世界坐标系描述了物体在空间的位置,角度在世界坐标系中可以设定物体
的位置,决定物体以什么方式进行放置o;局部坐标系描述了物体的形状,大小,
样式等,可以在这一坐标系中设定物体的形状o。当我们在虚拟场景中放置物体
时,必须将其从局部坐标系转换到世界坐标系。局部到世界的坐标系转换可以
看做向量的转化局部坐标系到世界坐标系:旋转,放缩,平移;世界坐标系到
观测坐标系:平移,旋转。
2.2 光照模型
环境光是模拟 2 次、3 次以及多次光反射形成的,是来自于周围环境没有
固定方向的光,在物体和周围环境之间多次反射后,最终达到平衡时的一种光,
又称为背景光.环境光没有空间和方向上的特征,它在任何方向上的分布都相同,
在所有方向上和所有物体表面上投射的环境光的量都是恒定不变的。
环境光主要是通过背景光影与主体形成某种映衬和对比,达到突出主体的
目的,还有表现特定环境、时间或造成某种特殊气氛和影调等作用。
全局光照模型中射线跟踪算法的基本原理:由光源发出的光到达景物表面后,
产生反射和折射,简单光照明模型和简单光透射模型模拟了这两种现象。o在简
单光照明模型中,反射被分为理想漫反射和镜面反射光,在简单光透射模型中,
把透射光分为理想漫透射光和规则透射光。o由光源发出的光称为直接光,景物
对直接光的反射或折射称为直接反射和直接折射,相对地,把景物表面间对光
的反射和折射称为间接光,间接反射、间接折射,这些是光线在景物之间的传
播方式,是光线跟踪算法的基础。
2.3 纹理映射
对象表面的纹理可以理解为覆盖在对象表面的图像,图像是由一个个的像
素构成的二维数组。像这样存储有图像数据的二维数组可以通过两种方式生成:
(1)位图纹理(Bitmap Texture),通过电脑的数字照片、图片等生成二维
的数组数据;(2)过程纹理(Procedural texture),通过数学公式来生成一
个二维的数组数据。一个二维的数组可以称之为纹理,纹理上的像素点都有一
个坐标,称之为纹理坐标,与纹理有关的坐标轴常用的字母是 s 和 t,水平方向
指的是 s 方向,垂直方向指的是 t,s 和 t 限制在[0,1]范围以内。内部的纹理坐
标的计算使用线性插值的方法将整个纹理映射到三维空间中。
三、代码设计
整个实验分为如下几个步骤:1、初始配置;2、画出机器人的整个雏形;
3、实现机器人身体部位的转动;4、完成机器人的行走操作。
3.1 初始配置
实验要求需要有光照效果,再此基础之上再加上了纹理效果。
OpenGL 在处理光照时采用这样一种近似:把光照系统分为三部分,分别是
光源、材质和光照环境。本程序仅开启一个光源,通过 glLightfv(光源编号,
光 源 特 性 , 参 数 数 据 ) 来 设 置 光 源 , 主 要 设 置 了 光 源 的 环 境 光 属 性
GL_AMBIENT 值 为 ( 0,0,0,1 ) , 光 源 的 散 射 光 属 性 GL_DIFFUSE 值 为
( 1,1,1,1 ) 以 及 光 源 位 置 GL_POSITION ( 0.0, 5.0, 10.0, 0.0 ) 。 程 序 通 过
glLightModelfv 函数设置全局环境光参数 GL_LIGHT_MODEL_AMBIENT 值为
(0.4, 0.4, 0.4, 1.0 ),并且修改无限远的观察点为局部观察点,最后使用
glEnable(GL_LIGHTING)开启光源。
处理纹理方面,首先自定义纹理数据结构体,成员包含纹理的高度、宽度、
ID 以及实际纹理数据,如下所示:
typedef struct{
int width; //纹理宽度
int height; //纹理高度
unsigned int texID; //纹理对象 ID
评论0