幻翼之神 发表于 2012-12-10 13:59:27

【译+原创】Developing 3D Objects in Silverlight 5

<div id="cnblogs_post_body">    摘要:这篇文章刊登在MSDN杂志网站2011年11月版,是作者Rajesh Lal讲解利用Silverlight 5建立3D模型。是一篇比较基础的入门级文章,适合刚刚学习Silverlight 3D,同时对于XNA没有太多的了解的同学。【注:本文不是完整的翻译,是借助作者的部分内容加上自己的理解,对原文感兴趣的请看下面的地址】
    英文原文地址:http://msdn.microsoft.com/en-us/magazine/hh547098.aspx
    源码下载:下载地址1(官方下载,需要将Cube3d.Web设为启动项目,SL5下有问题) 下载地址2(无问题,silverlight 5 RTM推荐下载)
    文章总共用了三种方法介绍如何建立3D模型,但前两种是基于旧版本的Silverlight,本文着重于讲解基于Silverlight 5的3D建模,所以前两种方法不翻译,有兴趣的同学可以参考原文。
    正文:
    Silverlight支持右手坐标系,意味着正Z轴是由屏幕指向观察者(如图1)所示。
http://i.msdn.microsoft.com/hh547098.Lal_Figure1_hires(en-us,MSDN.10).png
图1
    从图中我们可以看到,水平向右的是正X轴,垂直向上的是正Y轴,垂直屏幕指向观察者的是正Z轴。(补充:关于右手坐标系的判别,伸出右手,四指指向X轴正方向,然后四指向Y轴正方向屈起,大拇指所指的方向即为Z轴的正方向。)
    在三维场景中,要将一个物体在屏幕上展示有三个主要的元素:
    1.透视
    2.变换
    3.光的效果
    透视是指物体接近我们的部分要比远离我们的部分看起来显得更大。例如在图1中,bd边看起来就比fh边要大。在实际中,透视会产生一个消失点,这意味着如果你把边ae,bf,cg,dh在Z轴扩展,它们就会在很远处聚集于一点。
    第二个方面是变换。一个三维物体应该允许沿着三维空间任意方向移动。它们在符合透视规律的情况下可以沿着任意一个单一的轴运动—放大或者缩小。它们可以沿着任意的轴旋转:x,y和z轴。这些为三维物体在屏幕的渲染提供了灵活性。
    三维物体最后一个元素是光的效果。三维中的光产生明暗效果(shading),越靠近光源的部分会越亮,并随着距离衰减。在三维渲染中,两种比较有名的方法是单一着色(flat shading)和渐变着色(gradient shading)。我稍后将解释他们有什么不同。光还会产生阴影。
    接下来我们讲解一下如何利用Silverlight 5建立三维模型。这种方法是利用XNA类库建立Silverlight 3D程序的。
理解世界矩阵(World Matrix),观察矩阵(View Matrix)和投影矩阵(Projection Matrix)

    为了展示一个三维模型,你首先应该理解一个三维物体是怎么从它所处的三维空间转变成我们的屏幕这种二维空间,展示给我们的,这主要有三个方面:
   1.世界矩阵
   2.观察矩阵
   3.投影矩阵
    图2向我们展示了这一过程:
http://i.msdn.microsoft.com/hh547098.Lal_Figure8_hires(en-us,MSDN.10).png
图2
    首先三维物体在三维空间(也叫做模型空间)坐标系中有x,y,z三个坐标轴。这三个坐标轴相交于坐标原点(0,0,0)。
    对于一个三维立方体来说,前排的右上角的坐标是(1,1,1)(因为是右手坐标系,正Z轴是面向观察者的),后排的左下角的坐标是(-1,-1,-1),如图3所示。模型空间的坐标只能从-1到+1变换。比如我的立方体占用了模型空间75%的大小,我需要将每一个坐标乘以0.75,则现在前排的右上角坐标是(0.75,0.75,0.75),后排的左下角坐标是(-0.75,-0.75,-0.75)。
http://i.msdn.microsoft.com/hh547098.Lal_Figure9_hires(en-us,MSDN.10).png
图3
    当三维物体置于世界(World)空间中时,物体本身不动,但是为了匹配世界坐标系,要将物体的模型矩阵(model Matrix)乘以世界矩阵(world Matrix)。在世界空间中,你可以通过改变物体的坐标来移动三维物体,改变物体的大小,改变角度来旋转物体。为了表达三维物体的世界坐标,你需要将每个顶点坐标乘以世界矩阵。(这里的世界空间可以这样理解,每个三维物体自身有一个衡量自己的模型空间,然后将多个三维物体放在一起组成一个大环境,每个物体在其中的坐标就是世界坐标。)
    物体的世界坐标=物体的模型坐标*世界矩阵
    下一个因素是摄像机观察坐标,是你观察这个三维物体的位置。在三维空间中改变摄像机观察位置不需要改变三维物体的模型空间和世界空间。计算物体的摄像机观察坐标,需要将物体的世界坐标乘以观察矩阵。
    物体的观察坐标=物体的世界坐标*观察矩阵
    最后,我们需要在二维的屏幕上渲染这个三维物体,就需要将三维物体投影到二维屏幕上,这时我们需要计算与距离相关的透视视角。我们的三维物体在实际中应该是平行投影的(就是说相对的边是平行的),但是为了展现在二维屏幕上,我们需要利用透视投影展示物体(相对的边最后会汇聚到很远的一个点上),所以我将物体的世界坐标乘以观察矩阵再乘以投影矩阵就得到最后的物体在二维屏幕上的坐标,也叫做WorldViewProjection。
    物体最终坐标=物体的世界坐标(world Coordinates)*物体的观察矩阵(view Matrix)*物体的投影矩阵(projection Matrix)
矩阵(The Matrix)

   Silverlight 5由于引入了Microsoft.Xna.Framework,所以包含了矩阵结构。它包括一个4x4的齐次矩阵,矩阵的元素是16位浮点数。图4展示了变换矩阵的方法。
http://i.msdn.microsoft.com/hh547098.Lal_Figure10_hires(en-us,MSDN.10).png
图4
   矩阵的前三行三列(M11,M12,M13,M21,M22,M23,M31,M32,M33)用于矩阵的缩放和旋转变换,第四行(M41,M42,M43)用于矩阵的平移变换(如表1所示)。
表1
M11M12M13M14M21M22M23M24M31M32M33M34M41M42M43M44    为了更好的理解矩阵,让我们看一看到底如何进行矩阵变换。有五种不同类型的矩阵:4x4的矩阵结构,单位矩阵,平移矩阵,缩放矩阵和旋转矩阵。
    单位矩阵(如表2所示)表示三维物体在世界空间内的初始位置。如果你将一个矩阵乘以单位矩阵,那么你还会得到原来的矩阵,没有变化。矩阵结构提供了一个简单的方法Matrix.Identity可以得到单位矩阵。
表2
1000010000100001    矩阵结构也提供了一个缩放矩阵的方法,Matrix.CreateScale。缩放矩阵可以用来对物体进行缩放变换,只需将三维物体乘以缩放矩阵,如表3所示。(通过Matrix.CreateScale(float f)方法可以让物体在x,y,z三个轴方向进行同等大小的缩放,利用Matrix.CreateScale(float x,float y,float z)或Matrix.CreateScale(new Vector3(float x,float y,float z))方法可以让物体分别在x,y,z三个轴方向进行不同比例的缩放。)
表3
Sx0000Sy0000Sz00001    通过Matrix.CreateTranslate方法可以让物体在世界空间内进行移动。如表4所示。
表4
100001000010TxTyTz1    如果想要旋转矩阵,Silverlight 5为我们提供了很多方法。
    Matrix.CreateFromYawPitchRoll
    这种方法可以让物体同时绕着x,y,z轴进行旋转。Yaw(偏航)使物体绕着Y轴旋转,Pitch(俯仰)使物体绕着X轴旋转,Roll(翻转)使物体绕着Z轴旋转。这一点比较像飞机,Yaw就是飞机在水平方向改变航向,Pitch就是飞机在上升和下降的过程中机头的抬起和降下,Roll则比较像美国空战大片中前方飞机为了躲避后方紧追的导弹而采取的旋转机身的方法。
页: [1]
查看完整版本: 【译+原创】Developing 3D Objects in Silverlight 5