“言论自由,莫谈国事!游戏研发中立论坛...”  (10-10)  “论坛主旨:激发你游戏制作的潜能”  (08-12)    

首页  列表  注册  登陆  搜索  用户  排行  帮助
欢迎光临何苦做游戏-游戏开发论坛,请登陆注册
会员总数:18029 新进会员:icePhoenix
用户   自动登录
密码    
主题总数:16092 回复总数:24457
今日主题:1 今日回复:2
访问峰值:723 发生时间:2005年06月01日
论坛首页--程序技术专区--基本的 3D 几何学<2>
帖子主题:基本的 3D 几何学<2>
    无情
 
  
 注册:2004/7/21         

 状态:VIP会员            
 经验:5254

 帖子:872

楼主[2004/9/20 12:06:13]      

5. 矩阵

3D图形编程中我们要大量地使用矩阵对3D物体的坐标进行转换。你可以把最常用的4阶矩阵看作16个数排成的4x4的方阵,一个4x4的矩阵可以和一个空间中的坐标(x,y,z)进行乘法运算,得出一个新的坐标(x',y',z')。运算法则是这样的:

x'=(x*M11)+(y*M21)+(z*M31)+M41

y'=(x*M12)+(y*M22)+(z*M32)+M42

z'=(x*M13)+(y*M23)+(z*M33)+M43

在DXGraphics中,空间中的一个点要依次经过三个矩阵的转换才能正确地按要求显示在屏幕上,这三个矩阵分别是World,View和Projection。这三个矩阵都可以使三维形体平移、旋转和放缩,但一般说来World矩阵负责把形体放到场景中正确的位置,View矩阵负责根据观察者的位置和看的方向调整形体,而Projection矩阵负责设置视角和透视矫正(使物体近大远小)等。如果要手工填充这几个矩阵那就太麻烦了,DXGraphics当然提供了方便我们创建这些矩阵的函数,下面我们来看看例子:

 

世界 矩阵

世界 矩阵是你最常用到的通过原点(0,0,0),This matrix alters the vertices - this is the one you'll use the most often. All transformations of vertices work around the origin [0,0,0] - it rotates vertices around the origin, scales vertices around the origin. This is why (earlier) we created our cube around the origin. As already mentioned it is possible to combine multiple matrices to form a single all-in-one matrix; but as you also should remember, the order you multiply them matters. If you rotate something around the X axis and the Z axis you'll not get the same result if you'd rotated around the Z then the X. For example, if you have a car wheel and rotate it around the X axis you'll get it rotating like a wheel should, if you then rotate it around the Z axis it'll appear to be tilted in one direction - but it'll still rotate like a wheel should. If you rotate around the Z axis the wheel will appear to tilt, if you then rotate it around the X axis the wheel will seem to wobble as it goes around; the effect is best seen when animated though.渲染出来的3D物体的位置和方向、大小等似乎是无法控制的。但办法总是有的,我们可以借助World矩阵完成对3D物体的改变。方法很简单:将模型平移到世界矩阵,旋转世界矩阵,改变模型位置

Dim matWorld As D3DMATRIX
Dim matTemp As D3DMATRIX

D3DXMatrixIdentity matWorld '复位世界矩阵
    
D3DXMatrixIdentity matTemp '临时矩阵
D3DXMatrixRotationX matTemp, RotateAngle * (pi / 180)
D3DXMatrixMultiply matWorld, matWorld, matTemp
    
D3DXMatrixIdentity matTemp
D3DXMatrixRotationZ matTemp, RotateAngle * (pi / 180)
D3DXMatrixMultiply matWorld, matWorld, matTemp
    
       
D3DDevice.SetTransform D3DTS_WORLD, matWorld 
 
 
 

变换时要设置一个临时矩阵,不然你的世界矩阵想要复原到原来位置就麻烦了okay, not too complicated really. First we create two matrices, one is our "Master" matrix, the other is a temporary one, because we're doing more than one transformation we need something to store each step before multiplying it. Next we reset our master matrix - this is very important as matrix multiplying and transforming is a cumulative thing - if you alter it each frame without reseting it very quickly things will go very strange. The Identity matrix isn't actually a matrix where everything is set to '0', all the X=Y entries are filled with '1's [1,1] [2,2] [3,3] [4,4]. After we've reset our matrix we start manipulating it; the available transformations are:

'//Normal Rotation绕X,Y,Z轴旋转
D3DXMatrixRotationX(Out As D3DMATRIX, angle As Single)
D3DXMatrixRotationY(Out As D3DMATRIX, angle As Single)
D3DXMatrixRotationZ(Out As D3DMATRIX, angle As Single)

'//Rotation through a custom axis绕自定义轴旋转 
' You must specify an axis using the VAxis setting
' FYI: X=[1,0,0] Y=[0,1,0] and Z=[0,0,1]
D3DXMatrixRotationAxis(MOut As D3DMATRIX, VAxis As D3DVECTOR, angle As Single)


'//Misc Transforms
'This scales vertices by the amounts specified 缩放顶点
D3DXMatrixScaling(MOut As D3DMATRIX, x As Single, y As Single, z As Single)
'this moves vertices by the amounts specified  平移顶点
D3DXMatrixTranslation(MOut As D3DMATRIX, x As Single, y As Single, z As Single)

'Others are available, and are listed in the object browser - and can be found by going
DxVBLibA -> D3DXMATH_MATRIX 
 
 
 

观察矩阵
观察矩阵使用方法很简单,但你要知道如果在屏幕没有看到,是因为你The view matrix can be thought of as the camera; whilst the projection matrix (see later) controls some of the more complicated parts of the "camera", the view matrix is the one you alter if you wish to move the camera around (as most games do). Setting the view matrix is extremely simple, but you need to think about it a little first - if nothing is appearing on screen then the chances are that you've got the camera set up wrong...

 观察矩阵可以被看成摄象机或您的眼睛所在的位置,设置代码如下:

'//The function prototype
D3DXMatrixLookAtLH(MOut As D3DMATRIX, VEye As D3DVECTOR, VAt As D3DVECTOR, VUp As D3DVECTOR)

'//And this is an example:
Dim matView as D3DMATRIX
Dim vecFrom as D3DVECTOR
Dim vecTo as D3DVECTOR
Dim vecUP as D3DVECTOR

'摄象机在3D空间所在的位置
vecFrom.X = 0
vecFrom.Y = 10
vecFrom.Z = 10

'摄象机观察的点(物体)
vecTo.X = 0
vecTo.Y = 0
vecTo.Z = 0

'//Unless you want to do something clever you
' 摄象机向上的方向,需要这个方向才能形成完整的约束
vecUp.X = 0
vecUp.Y = 1 
vecUp.Z = 0

'生成摄象机矩阵

D3DXMatrixLookAtLH matView, vecFrom, vecTo, vecUp 
'设置摄象机

D3DDevice.SetTransform D3DTS_VIEW, matView

’D3DXMatrixLookAtLH函数最后一个参数,你可以这样理解它:如果我们站在坐标原点处,那么它就是指明我们的头朝着哪一个方向。一般来说,我们的头是向着y轴方向的,所以一般把它定为(0,1,0)。
 
 
 
 

投影矩阵
投影矩阵一般不改变,除非你要作一些奇特的镜头Finally we come to the projection matrix; this matrix isn't used as often as the other two, but it's equally as important. The projection matrix controls how the scene appears when we look through our camera - you can set the field of view (the closest and furthest objects visible) and the view angle (wide angle or tele-photo). Unless you're intending to make a game with a zoom feature or some weird head-messing-up game you're unlikely to set this matrix very often; normally it's setup during initialisation and left.

屏幕的2D图形要通过投影矩阵转换,并将前后面剪裁(加快速度)

'//The function prototype:
D3DXMatrixPerspectiveFovLH( MOut As D3DMATRIX, fovy As Single, aspect As Single, zn As Single, zf As Single)
'Where Mout is the result
'fovy is the view angle  
'Aspect is the aspect ratio
'zn is the nearest boundary for polygons - anything between here and the camera position are not rendered
'zf is the furthest boundary - anything beyond here is not drawn


'生成投影 矩阵(视角90度,高宽比1,前后剪裁面0.1, 500)
D3DXMatrixPerspectiveFovLH matProj, pi / 4, 1, 0.1, 500

'投影 矩阵加入到设备中
D3DDevice.SetTransform D3DTS_PROJECTION, matProj 
 
 
 


--------------------------------------------------------------------------------

6. 渲染

'//我们最好先将场景清空
D3DDevice.Clear 0, ByVal 0, D3DCLEAR_TARGET Or D3DCLEAR_ZBUFFER, 0, 1#, 0  
’这条指令可以只清除指定的几个矩形中的屏幕内容,第一个参数的意义就是要清除多少个矩形中的内容,而第二个参数指向一个装满了这些矩形的数组。第三个参数说明要清除那些内容,包括渲染后的场景 ( D3DCLEAR_TARGET ),Z Buffer ( D3DCLEAR_ZBUFFER ) 和Stencil Buffer ( D3DCLEAR_STENCIL )。第四、五、六个参数分别表示场景要被清为什么颜色,Z Buffer要被清为什么值,Stencil要被清为什么值。

'然后,设置渲染流
D3DDevice.SetStreamSource 0, VBuffer, Len(Cube(0))

'渲染
D3DDevice.DrawPrimitive D3DPT_TRIANGLELIST, 0, 12
 
 
 
 


学而不思则罔,思而不学则殆,欢迎大家踊跃发言!

     tanghuinian

    
 经验:20    

 帖子:0      
  状态:普通会员

  注册:2004/9/21

第1楼[2004/9/21 14:02:04]     

基本的 3D 几何学<2>
一时看不懂,DOWN下再说
     bbsman

    
 经验:7277    

 帖子:710      
  状态:普通会员

  注册:2004/7/20

第2楼[2004/9/21 15:55:19]     

基本的 3D 几何学<2>
以后要找资料的时候 就是积累了 这个网站从98到现在 还算稳定 呵呵应该可以随时查找这些资料 嘿嘿
     kangleblue

    
 经验:114    

 帖子:0      
  状态:普通会员

  注册:2006/11/9

第3楼[2006/11/13 16:48:43]     

基本的 3D 几何学<2>
感谢楼主!
强顶
该主题帖子共[ 1 ]页 页码:第 1

论坛图例
开放帖 热门帖 被锁帖 总固顶 类固顶 固顶帖 精华帖
© 1998-2018 Npc6.Com 版权所有. ALL RIGHTS RESERVEDD
沪ICP备16050065号-3