游戏三维图形变换.ppt
三维图形变换浙江大学软件学院梁秀波Email:本次课程主要内容颜色空间三维绘制流程三维绘制中的变换照相机系统和相机模型视域、背面剔除和裁剪学习方法课堂上:理解概念课后:阅读相关资料、书籍最好是自己去推导一遍参考书计算机游戏程序设计 电子工业出版社。计算机图形学算法基础 科学出版社真实感图形学算法基础 科学出版社OpenGL教材(红宝书、蓝宝书)颜色可见光的波长 400-780 nm三色原理用三种颜色表示:三色原理用三种颜色表示:R,G,B.减法颜色系统:Cyan,Magenta,Yellow CMY 常用于打印加法颜色系统:R+G+B=WhiteCRT 显示器的基本元素显示器的基本元素显示器与缓冲区彩色CRT包含颜色点阵的数组象素RGB 三元组R,G,和B 由每个象素单独控制每个分量8个比特缓冲区存储将显示在显示器上的内容一般在显卡内存中颜色空间RGB(红、绿、蓝)CMY(青、洋红、黄)HSL(色调、饱和度、亮度)HSV(色调、饱和度、明亮度)CIE(明亮度、色调、色彩)HIS(色调、饱和度、强度)RGB-加法混色红+绿=黄 (0,0,1)+(0,1,0)=(0,1,1)颜色色矢量矢量红绿黄黄(0,0,1)+(0,1,0)=(0,1,1)红蓝绛(0,0,1)+(1,0,0)=(1,0,1)绿蓝青青(0,1,0)+(1,0,0)=(1,1,0)红青白青白(0,0,1)+(1,1,0)=(1,1,1)绿绛白白(0,1,0)+(1,0,1)=(1,1,1)蓝黄白黄白(1,0,0)+(0,1,1,)=(1,1,1)红绿蓝白白(0,0,1)+(0,1,0)+(1,0,0)=(1,1,1)黑黑任任何何颜色色任任何何颜色色(0,0,0)+(B,G,R)=(B,G,R)CMY-减(乘)法混色黄青=绿 (0,1,1)(1,1,0)=(01,11,10)=(0,1,0)颜色色矢量矢量黄黄青绿青绿(0,1,1)(1,1,0)=(0,1,0)黄黄绛红绛红(0,1,1)(1,0,1)=(0,0,1)青青绛蓝绛蓝(1,0,1)(1,1,0)=(1,0,0)红红青黑青黑(0,0,1)(1,1,0)=(0,0,0)绿绿绛黑绛黑(0,1,0)(1,0,1)=(0,0,0)蓝蓝黄黑黄黑(1,0,0)(0,1,1,)=(0,0,0)黄黄青青绛黑绛黑(0,1,1)(1,1,0)+(1,0,1)=(0,0,0)白白任任何何颜颜色色任任何何颜色颜色(1,1,1)(B,G,R)=(B,G,R)HSV颜色空间转换HSVRGB绘制流程标准的绘制流程由一系列计算组成输入是:多边形输出是保存在缓冲区的图像主要涉及的操作是:三维变换与光照!OriginalRotationUniform ScaleNonuniform ScaleShearImages from Conan The Destroyer,1984向量几何基础所有点和向量都相对于某个坐标系统定义。标量:数值、实数等.点:二维或者三维位置,表示了几何点在三维坐标系统中的位置。向量:带长度的有向线段,无物理位置VPXYZV向量向量是一列数字,表示如下:向量几何:基本操作加法:点与向量的加法:点的减法:向量缩放v1v2v1+v2vpq=p+vvp2p1向量几何的其他操作线性混合:长度与距离:单位向量:向量归一化:向量几何:点积定义:属性:向量之间的夹角:垂直向量:ab向量几何:投影向量投影:投影与坐标系v2v1P 0v2v1P 1)或者缩小了(di1)的量旋转矩阵R是旋转矩阵,如果R的转置等于R的逆,即RTR=RRT=I每个矩阵R对应一单位长度的旋转轴U和旋转角度。该对应并不是唯一的,例如-U也是对应R的旋转轴二维旋转二维旋转隐含着绕平面轴旋转绕x轴旋转当点绕x轴以逆时针方向(从x轴正方向向原点看)旋转角时,旋转矩阵为:xyz绕y轴旋转当点绕y轴以逆时针方向旋转角时,旋转矩阵为:绕z轴旋转当点绕z轴以逆时针方向旋转角时,旋转矩阵为:旋转 令 c=cos(q)且 s=sin(q)沿X-轴s:沿Y-轴s:沿 Z-轴:矩阵复合矩阵复合可完成对空间点的任意操作矩阵乘法不满足交换率,因此复合的次序非常重要!例如:先缩放后平移先平移后缩放通常情况下,给出的旋转矩阵是绕原点旋转的。因此首先要将物体平移至原点,进行旋转,再平移回来。沿平行坐标轴的直线旋转物体如何得到变换矩阵:将直线上一点平移至原点,物体也做相应的平移变换将物体绕坐标轴旋转将点重新平移回原位置,物体也做相应的平移变换举例将盒子绕平行于z轴且经过P=(Tx,Ty,Tz)T点的直线旋转初始状态结束状态举例(续)平移至原点旋转再平移回来变换矩阵将每一步的基本变换矩阵连接,得到总的变换矩阵变换矩阵示例人体骨架表示变换矩阵示例节点位置计算父节点的旋转和平移影响子节点其他旋转表示方法欧拉角无法进行平滑插值和距离计算万向节锁轴角对四元数球面线性插值图形流水线中的物体坐标系建模时所采用的坐标系选取物体上或靠近物体的某一点作为原点,物体上的其他点相对于该点的坐标进行表示针对物体的局部坐标系举例:选取立方体的某一个顶点作为原点,建立局部坐标系图形流水线中的世界坐标系全局坐标系所有物体组成一个场景,场景坐标系称为世界坐标系所有物体必须变换至该坐标系,以确定彼此之间的相对空间位置将物体放至场景内等价于定义一个从物体局部坐标系至世界坐标系的变换矩阵场景需要定义光照图形流水线中的照相机坐标系统照相机坐标系统决定照相机参数和可见域必须包括视点位置视线视点坐标系投影平面视域其他(可选)视点和视线方向从C沿着N方向看投影平面照相机坐标系视域四棱锥坐标轴系统世界坐标系相机矩阵投影矩阵相机坐标Device coordinates视区矩阵窗口坐标物体坐标模型矩阵ModelView 变换局部物体坐标世界坐标相机坐标设备坐标窗口坐标系统投影与裁剪模型变换将局部坐标系变换到世界坐标系包括缩放、旋转、平移等相机变换将世界坐标系中的一点变换至照相机坐标系可以分成平移和旋转两部分投影变换视域、投影方式、屏幕分辨率投影物体首先与视域求交决定可见部分平行投影透视投影投影过程投影:n维空间上一点变换至m(0,远切割平面z=f0视区(投影平面)为一长方体视域四棱锥四个侧面由下列方程给出:左侧面x=lz/n,右侧面x=rz/n,上侧面y=tz/n,下侧面y=bz/n投影矩阵OpenGL,DirectX透视相机模型(II)透视变换图例仿射投影ABABC(视点,即相机位置)投影轨迹投影平面透视变换图例透视变换图例透视变换规则利用相似三角形定理,有:用齐次坐标表示:透视变换矩阵给定其中背面剔除将多边形的朝向与视点或投影中心相比较,去除那些不可见多边形可见性测试在视见空间内进行。计算每一个多边形的法向,并检查法向与视线方向点积后值的符号背面剔除如果法向指向物体外部,则可见性的判断条件为:其中Np为法向,N为视线方向视域体裁剪当且仅当视域体内的物体将被投影.决定物体的哪一部分将被投影,哪一部分被剔除的过程叫做裁剪.Z=0 plane视域体裁剪三维物体裁剪用视域四棱锥对物体进行裁剪把一个多边形相对于视域四棱锥的每个裁剪面进行裁剪测试三维物体裁剪采用三维Sutherland-Hodgman裁剪算法最终分解为线段与平面的求交的基本问题根据多边形顶点的坐标,很容易判断出顶点位于裁剪面的内侧还是外侧,若求取直线与裁剪面的交点,只需把直线方程代入裁剪面方程即可视域四棱锥裁剪(二维示例)视域四棱锥裁剪的四种情况两个顶点完全位于视域四棱锥内,把第二个顶点加入输出顶点表第一个顶点在裁剪平面内侧,第二个顶点在裁剪平面外侧,将交点加入输出顶点表两个顶点均在裁剪平面外侧,输出顶点表不加任何顶点第一个顶点在裁剪平面外侧,第二个顶点在裁剪平面内侧,将交点和第二个顶点加入输出顶点表裁剪的四种情况-1裁剪的四种情况-2裁剪的四种情况-3裁剪的四种情况-4视域四棱锥裁剪视域四棱锥裁剪对所有四个齐次坐标进行,w分量与其他分量一样处理输出仍为齐次坐标裁剪方法-1在场景坐标系中进行裁剪,然后变换到视点坐标系把物体从局部坐标系变换至场景坐标系背面剔除将视域四棱锥反变换至场景坐标系,称之为场景四棱锥在场景坐标系中用场景四棱锥裁剪物体裁剪后的物体从场景坐标系变换至视点坐标系裁剪方法-2在局部坐标系中进行裁剪,然后变换到视点坐标系把相机从场景坐标系变换至局部坐标系背面剔除将视域四棱锥反变换至局部坐标系局部坐标系中用反变换得到的四棱锥裁剪物体裁剪后的物体从局部坐标系变换至视点坐标系裁剪方法-3将物体首先变换到视点坐标系,在视点坐标系中进行裁剪,把相机从场景坐标系变换至局部坐标系背面剔除将物体从局部坐标系变换至视点坐标系用视域四棱锥进行裁剪从世界坐标系到屏幕坐标系将物体从世界坐标系变换至屏幕坐标系,可以看成是:将物体首先作相机变换,再作透视变换:一般还需要一个视区变换视区变换将视域归一化视域与物体求交,视域之外的部分物体不参与显示过程求交后的物体投影,并按照相应的视见区域大小xmin,xmax、ymin,ymax、zmin,zmax进行缩放OpenGL中的变换矩阵相机变换:指定照相机位置和方向(也叫照相机坐标系统)模型变换:将物体在场景中移动,也可以视为从局部坐标系到全局坐标系ModelView变换:相机变换和模型变换的混合.投影变换:定义视域体并指向投影视区变换:将二维投影后的场景变换到绘制窗口.相机坐标照相机坐标系统:也叫视点坐标系统或者视见坐标系统.它表示了在照相机后面看场景的坐标关系。X-Y平面是投影面(也叫平面),照相机一般往负z方向看。相机变换的两种方法保持相机不变,将物体(在世界坐标系统中)绕着相机旋转。保持物体不变,将相机在世界坐标系统中变换。相机变换是物体变换的逆变换。yxz-zeye设置相机:“Look At”相机将相机放置到世界坐标系统中定义相机变换 glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(eye.x,eye.y,eye.z,look.x,look.y,look.z,up.x,up.y,up.z);upeyelookYZXWCSxyzP0Q0VCS从 LookAt 设置中计算相机变换坐标系统,形成了.:vun-neyelook相机变换:OpenGL例子(Look At相机)Void DisplayScene()glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0f,0.0f,0.0f);glLoadIdentity();gluLookAt(0.0,0.0,10.0,0.0,0.0,-100.0,0.0,1.0,0.0);glBegin(GL_TRIANGLE);glVertex3f(10.0f,0.0f,0.0f);glVertex3f(0.0f,10.0f,0.0f);glVertex3f(-10.0f,0.0f,0.0f);glEnd();glFlush();设置相机的另一种方法:变换场景gluLookAt 函数显式地定义相机。另外一种方法式将场景进行旋转(glRotate)和平移(glTranslate)同时,将相机置于缺省的世界坐标系统.旋转和平移的累积效果构成了最终的相机变换.当然,glTranslate 和 glRotate也可用作其他用途OpenGL例子(变换场景)/viewing a scene centered at origin from+X direction:Void DisplayScene()glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0f,0.0f,0.0f);glLoadIdentity();glTranslatef(0.0,0.0,-10.0);glRotatef(-90.0,0.0,1.0,0.0);/glBegin(GL_TRIANGLE);glVertex3f(10.0f,0.0f,0.0f);glVertex3f(0.0f,10.0f,0.0f);glVertex3f(-10.0f,0.0f,0.0f);glEnd();glFlush();ModelView 矩阵ModelView变换是建模矩阵M和相机变换V的乘积 C=VM所有在OpenGL中的变换函数只能设置modelview 矩阵.因此,ModelView 在物体被操作之前被调用.例如:glMatrixMode(GL_MODELVIEW);glLoadIdentity();glScalef(2.0f,2.0f,2.0f);DrawScene();ModelView 矩阵堆栈矩阵堆栈的顶部矩阵就是当前的ModelView 矩阵(C).glPushMatrix():将当前的矩阵加入到矩阵堆栈glPopMatrix():将顶部矩阵删除,并将所有其他矩阵往上移动一位。矩阵堆栈的好处:允许一系列位置(代表了坐标系统)保留下来,并在需要的时候使用它们。M1M2M3变换的合成一系列变换的合成可通过矩阵的嵌套完成关于任意一点的缩放:关于任意轴的旋转矩阵阵列建模变换:glLoadIdentity:C IglLoadMatrix(m):C mglMultiMatrix(m):C C mglRotatef(q,x,y,z):C C RL(q)glTranslatef(x,y,z):C C T(x,y,z)glScalef(x,y,z):C C S(x,y,z)最后定义的变换最先被执行.投影变换投影变换设置视域体,从而定义裁剪面和投影矩阵以及投影方式。投影矩阵在ModelView矩阵之后被实行,因此,视域体是定义 在相机坐标系统中的。透视投影与平行投影平行(正交)投影定义正交视域体:glOrtho(left,right,bottom,top,near,far);或者:glOrtho2D(left,right,bottom,top);定义投影矩阵:glMatrixMode(GL_PROJECTION);glLoadIdentity();glOrtho(left,right,bottom,top,near,far)YZX成像平面视域体VCS(Left,righ,bottom,top)定义视域体的最小、最大的 X 和Y坐标;(near,far)定义视域体的近和远平面到X-Y平面的距离.透视投影视域四堎锥的定义:glFrustum(left,right,bottom,top,near,far)视域体的形成是:将原点与前面的四个顶点连接起来,并由Z方向的近平面和远平面限制。YZX成像平面视域四堎锥原点投影矩阵 glMatrixMode(GL_PROJECTION);glLoadIdentity();glFrustum(left,right,bottom,top,near,far)透视投影(II)视域体的定义 glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(angle,aspect,near,far)YZXangle:y方向张的视角aspect:方正率(成像平面的宽度/高度).视区视区是窗口的绘制区域,特殊的视区是全屏幕缺省视区是窗口本身视区矩阵将投影后的成像平面投到视区 glViewport(GLint left,GLint bottom,GLint width,GLint height)(left,bottom,width,height)定义在窗口系统中(象素级)窗口视区(left,bottom)(right,top)用户定义矩阵可随意装入矩阵:GLfloat m16=1.0,0.0,0.0,;glLoadMatrixf(m);矩阵乘法:glMultMatrixf(m);基于OpenGL的游戏Quake series(id Software):Doom3(id Software):Half Life(Valve):Soldier of Fortune(Raven):And much more:Tribes 2(Dynamix),Serious Sam(Croteam),Star Trek Voyager ELite Force(Raven),etc.课后练习熟悉OpenGL流程自行推导向量变换、坐标变换理解齐次坐标实现一个三维向量与矩阵类(包括.h,.cpp)学习OpenGL高级编程课题