04三维坐标变换课件_第1页
04三维坐标变换课件_第2页
04三维坐标变换课件_第3页
04三维坐标变换课件_第4页
04三维坐标变换课件_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章顶点坐标变换空间中的物体需要使用三维坐标来描述,而显示器是一个二维的表面,所以在屏幕上渲染一个三维场景时,首先需要将描述空间物体的三维坐标变换为二维坐标,这在Direct3D中称为顶点坐标变换。顶点坐标变换通常通过矩阵来完成。4.1顶点坐标变换和光照流水线概述Direct3D标准的图形显示过程可分为两个阶段。第一阶段称为坐标变换和光照(TraansformingandLinghting简称T&L)。第二阶段称为光栅化处理阶段。坐标变换和光照阶段(T&L)这个阶段,每个对象的顶点被从一个抽象的、浮点坐标空间转换到基于像素的屏幕空间,并根据场景中的光源和物体表面的材质对物体顶点应用不同类型的光照效果。还有裁剪和视口缩放也在第一阶段进行。通过设置一个虚拟相机,世界空间的三维坐标转换成屏幕空间以像素为单位的整数坐标(坐标变换不只是物体顶点位置的坐标变换,它还可能包括顶点法线向量、纹理坐标等坐标变换),然后通过计算当时场景中的光照属性,赋予顶点相应的颜色值。光栅化处理阶段

Direct3D将经过T&L处理的顶点组织为以点、线、面为基础的图元,应用纹理贴图和物体顶点的颜色属性,根据相关渲染状态设置,决定每个像素的最终颜色值,并在屏幕上显示出来。顶点变换流水线(T&L)

T&L过程在Direct3D中通常称为顶点变换流水线,在这个过程中,未经过变换和光照的顶点从一端进入,在内部这些顶点将完成几个连续操作,然后经过转换和光照的顶点从另一端出来。模型几何变换和世界坐标系物体在三维空间的运动和变形过程称之为模型几何变换,如平移、旋转和缩放等。我们将物体在其中运动的三维实质问题称为世界空间,它的三维坐标系表示为世界坐标系,物体顶点在世界的坐标系里的坐标表示称为世界坐标。取景变换和观察坐标系把图形显示想象成摄像过程,取景变换就像摄影中摄像机的摆入一样,在三维图形显示中,需要设置一个虚拟摄像机,屏幕显示的图形就是虚拟摄像机拍摄在胶片上的景物。以摄像机为参考原点,摄像机观察的方向为坐标坐标轴,建立的坐标系称为观察坐标系,物体在观察坐标系中相对坐标称为观察坐标,顶点从世界坐标到观察坐标的转换称为取景变换。投影变换和投影坐标系物体从世界坐标描述转换到观察坐标后,我们可以将三维物体投影到二维平面上,即投影到虚拟相机的胶片上,这个过程称为投影变换。以胶片中心为参考原点的空间坐标系称为投影坐标系,物体在投影坐标系中的坐标表示称为投影坐标。坐标变换和屏幕表示物体在投影坐标系中的表示为浮点坐标,通过定义屏幕显示区域(一般为屏幕大小),将浮点坐标转化为像素坐标的过程称为社区变换,该像素坐标值称为屏幕坐标。三维物体建模,非T&L顶点世界坐标系表示取景,观察坐标系表示投影,投影坐标系表示图形绘制屏幕坐标表示屏幕坐标表示屏幕坐标表示设置顶点变换矩阵HRESULTIDirect3DDevice9::SetTransform(D3DTRANSFORMSTATETYPEstate,CONSTD3DMATRIX*pMatrix);state取值:D3DTRANSFORMSTATE_WORLD世界变换矩阵D3DTRANSFORMSTATE_VIEW取景变换矩阵D3DTRANSFORMSTATE_PROJECTION投影变换矩阵pMatrix指向变换矩阵的内存地址。设置变换的视区信息HRESULTSetViewport(CONSTD3DVIEWPORT9*pViewport)4.2矩阵类型及操作在D3D中顶点坐标变换通常是借助于矩阵实现的,D3D中提供了许多矩阵类型和相关的矩阵运算函数。D3DMATRIX矩阵类型D3DMATRIX是D3D中最简单的矩阵类型:typedef

struct_D3DMATRIX{union{

struct{float_11,_12,_13,_14;float_11,_12,_13,_14;float_11,_12,_13,_14;float_11,_12,_13,_14;}floatm[4][4];}}D3DXMATRIX矩阵类型typedef

structD3DXMATRIX{FLOAT_11,FLOAT_12,FLOAT_13,FLOAT_14;FLOAT_21,FLOAT_22,FLOAT_23,FLOAT_24;FLOAT_31,FLOAT_32,FLOAT_33,FLOAT_34;FLOAT_41,FLOAT_42,FLOAT_43,FLOAT_44;}注:这个结构体只能用于C++而不能用于C。其它矩阵类型D3D除上述的矩阵类型外还有以下类型:D3DXMATRIXA16:16字节对齐矩阵D3DXMATRIX及D3DXMATRIXA16扩展矩阵类型。常见矩阵运算函数因为矩阵的运算相对比较复杂,所以D3D提供了一组去处函数,例如,通过函数通过D3DXMatrixTranslation()构造一个平移矩阵,通过函数D3DXMatrixRotationX()构造绕x轴转动一定角度的矩阵;4.3世界变换世界变换就是将物体顶点坐标从模型空间转换到世界空间。在模型空间里,所有模型的顶点共用一个原点,即世界坐标系原点。事实上,世界变换就是将一个模型从本地空间重新定位到世界空间内。从模型空间到世界空间的转换实际上就是对模型进行平衡、旋转、缩放以及它们的组合变换。世界变换矩阵在处理三维图像的应用程序中,可使用世界变换完成一个物体的平衡、旋转和缩放。当然了可以完成这三种变换的任意组合。平移变换#include<d3dx9.h>D3DXMATRIX*D3DXMatrixTranslation(D3DXMATRIX*pOut,FLOATx,FLOATy,FLOATz)平移代码片段D3DXMATRIX

matTranslat;D3DXMatrixTranslation(matTranslate,tx,ty,tz);g_pd3dDevice->SetTransform(D3DTS_WORLD,

&matTranslate);旋转变换D3DXMATRIX*WINAPID3DXMatrixRotationX(D3DXMATRIX*pOut,FLOATAngle);D3DXMATRIX*WINAPID3DXMatrixRotationY(D3DXMATRIX*pOut,FLOATAngle);D3DXMATRIX*WINAPID3DXMatrixRotationZ(D3DXMATRIX*pOut,FLOATAngle);*Angle为弧度值旋转变换代码片段#include<d3dx9.h>D3DXMATRIXmatRotate;FLOATfAngle=90*(2.0f*D3DX_PI)/360.0f;//g_pd3dDevice为一个有效的Direct3D设备指针。g_pd3dDevice->SetTransform(D3DTS_WORLD,

&matRotate);缩放变换D3DXMATRIX*D3DXMatrixScaling(D3DXMATRIX*pOut,FLOATsx,FLOATsy,FLOATsz);缩放变换代码片段#include<d3dx9.h>D3DMATRIXmatScale;D3DXMatrixScaling(&matScale,1.0f,0.5f,1.0f);//g_pd3dDevice为一个有效的Direct3D指针g_pd3dDevice->SetTransform(D3DTS_WORLD,&matSclale);复合变换大多数情况下,作用于物体的不只是一个几何变换,而往往是各种几何变换的组合。这时,就需要将每个单一的几何变换矩阵依次相乘形成复合三维变换。矩阵乘函数D3DXMATRIX*D3DXMatrixMultiply( D3DMATRIX*pOout, CONSTD3DXMATRIX*pM1, CONSTD3DXMATRIX*pM2)将一个物体缩小1/3,然后沿Z轴旋转60°最后平移(10,0,0)。的复合变换的代码片段:#include<d3dx9.h>D3DXMATRIXmatWorld;D3DXMATRIXmatScale,matTranslate,matRotate;D3DXMatrixScaling(&matScale,2/3.0f,,2/3.0f,2/3.0f);FLOATfAngle=60*(2.0f*D3D_PI)/360.0f;D3DXMatrixRotationZ(&matRotate,fAngle);D3DXMatrixMutiply(&matWorld,&matScale,&matRotate);D3DXMatrixTranslation(&matTranslate,10.0f,0.0f,0.0f);D3DXMatrixMutiply(&matWorld,&matWorld,&matTranslate);g_pd3dDevice->SetTransform(D3DTS_WORLD,&matWorld);4.4取景变换:为了使三维景物在屏幕上成像,我们必须设置一个观察点,它相当于一个虚拟相机,三维物体从世界空间到虚拟空间的坐标变换过程称为取景变换。设定虚拟相机函数D3DXMATRIX*D3DXMatrixLookAtLH( D3DXMATRIX*pOut, CONSTD3DXVECTOR3*pEye, CONSTD3DXVECTOR3*pAt, CONSTD3DXVECTOR3*pUp);参数说明pOut:生成的观察矩阵pEye:摄影机位置pAt:观察点的位置。pUp:摄像机上向量设置虚拟相机的代码片段#include<d3dx9.h>D3DXVECTOR3vEye(0.0f,3.0f,-5.0f);D3DXVECTOR3vLookatPt(0.0f,0.0f,0.0f);D3DXVECTOR3vUpVec(0.0f,1.0f,0.0f);D3DXMATRIXA16matView;D3DXMatrixLookAtLH(&matView,&vEyePt,

&vLookatPt,&vUpVec);g_pd3dDevice->SetTransform(D3DTS_VIEW,

&matView);4.5投影变换投影变换是将三维景物投射到一个二维平面上。正交投影在正交投影中,投影向量与观察平面垂直,观察点与观察平面的距离不会影响物体的大小。创建正交投影矩阵D3DXMATRIX*D3DXMatrixOrthoLH( D3DXMATRIX*pOut, FLOATw, FLOATh, FLOATznear, FLOATzfar);参数说明pOut:指向生成的正交投影矩阵w、h:取景长文体的宽和高zenar、zfar:取景长方体距离摄影机的最近和最远距离。创建正交投影代码片段:D3DXMATRIXmatProject;D3DXMatrixOthoLH(&matProj,width,

height,Znear,Zfar);g_pd3dDevice->SetTranform(D3DTS_PROJECTION,&matProject);透视投影透视投影的特点是远处的物体在投影平面上的成像被缩小了。物体离视点的越远,物体的像就越小。创建透视投影矩阵函数D3DXMATRIX*D3DXMatrixPerspectiveFovLH( D3DXMATRIX*pOut,//生成的透视投影矩阵

FLOATfovY,//在y轴上的成像角度(弧度) FLOATAspect,//截头体的纵横比

FLOATznear,//截头体距点的最近距离

FLOATzfar//截头体距视点的最远距离);生成透视矩阵代码片段D3DXMATRIXmatProject;D3DXMatrixPerspectiveFovLH(&matProject,

fovY,(float)height/width,Znear,Zfar);g_pd3dDevice->SetTransform(D3DTS_PROJECTION,&matProject);视区变换视区变换是Direct3D顶点变换流水线的最后一步,通过定义屏幕显示区域的实际宽、高等参数,它将顶点从投影坐标转换为最终显示的以像素为单位的屏幕坐标。它主要有2个作用:顶点裁剪将顶点投影坐标转换为屏幕坐标。视区结构typedef

struct_D3DVIEWPORT9{ DWORDX;//视区左上角x坐标,StartX DWORDY;//视区左上角y坐标,StartY DWORDWidth;//视区宽度

DWORDHeight;//视区高度

floatMinZ;//视区内景物的最小深度值,0~1.0f之 //间,一般为0 floatMaxZ;//视区内景物的最大深度值,0~1.0f之 //间,一般为1.0f}D3DVIEWPORT9;设置视区函数IDirect3DDevice9::SetViewport(CONSTD3DVIEWPORT9*pViewport);SetViewport()的作用相当于顶点乘以下矩阵Width/20000-Height/20000MaxZ-MinZ0StartX+Width/2StartY+Height/2MinZ1RECTrect;GetClientRect(hWnd,&rect);D3DVIEWPORT9vp;vp.X=0;vp.Y=0;vp.Width=rect.right;vp.Height=rect.bottom;vp.MinZ=0.0f;vp.MaxZ=1.0f;g_pd3dDevice->SetViewport(&vp);GetClientRect( HWNDhWnd,//窗口句柄

LPRECTlpRect//存储返回的窗口信息

//RECT结构地址);清空视区一般情况下,在绘制每一帧图形前都要先清空视区,即清空渲染目标表面上的视区矩形的内容:颜色缓冲区、深度缓冲区或者模板缓冲区。使用函数IDirect3DDevice9::Clear()来清空视区。IDirect3DDevice::Clear函数声明HRESULTIDirect3DDevice9::Clear(DWORDCount,constD3DRECT*pRect,DWORDFlags,D3DCOLORColor,floatz,DWORDStencil)参数说明Count:重置的矩形区域pRect:重置的矩形区域数组指针Flags:重置缓冲区标志Color:重置的颜色值z:重置的深度值Stencil:重置的模板值当把Count设为0,而pRects设为NULL时为清空整个视区。Flags:可以取D3DCLEAR_TARGET、D3DCLEAR_ZBUFFER和D3DCLEAR_STENCIL的任意组合,指定对颜色缓冲区

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论