AppleSeeker's Tech Blog
Welcome to AppleSeeker's space

公告板是简单的四边形(平滑,平面或矩形的纹理对象),在游戏世界中渲染,所以它们直接面对相机。当相机围绕世界移动时,公告板对象旋转以便它们持续直接面对相机。

不同于粒子系统,公告板有大量潜在的用途,包括渲染围绕光照的明亮光点的镜头光晕和使用2D图片渲染的基础树,如此,它们总是面对相机出现。

对于很多类型的渲染对象,适用于公告板的这种方式将给予深度外观,即使对象实际上是完全平滑的。举例,想象下你想在你的游戏中去渲染没有纹理,未点亮的特殊对象。这样一个球体看上去正好和所有角度相同,所以如果你可以简化渲染一个平滑的球体绘制并保持它直接面对相机的角度,它将无法区分实际的球体,但需要相当少的计算能力来显示它。

公告板四边形是非常有用的粒子系统。如果我们想渲染一个框架,我们需要去确保所有渲染的光照点实际上是可见的。如果我们不使用公告板,组成烟火的四边形可以绘制到相机的边缘,使它们几乎看不见。

四边形作为公告板渲染,然而,仍然放置在3D场景中。它们将仍然保持它们在游戏世界中的坐标,将观察视角的转换,收到z-缓冲的影响,就像任何普通对象世界那样。

下图演示了四边形顺序调整为了它们作为公告板显示的这个方式。箭头显示的它们所面对的方向。请注意所有箭头都朝相机对准。随着相机移动,旋转四边形以便它们总是朝向它。

imageimage

从上面看的场景视角,用公告板四边形朝2个不同相机位置旋转。

让四边形旋转的这个方式实际上是相当简单的。再次,我们可以调用另一个非常有用的静态Matrix函数,这次称为CreateBillboard。当我们调用这个函数时,传递它的公告板对象的坐标和相机位置和方向的细节,它将返回一个矩阵,能转化对象到指定位置并旋转对象直接对着相机。

CreateBillboard期望传递下列参数:
objectPosition:公告板对象的坐标。
cameraPosition:相机的坐标,可以通过查询Camera.Transformation.Translation属性来简单获得。
cameraUpVector:相机的向上矢量。从Camera.Transformation.Up属性中获得。
cameraForwardVector:一个指明方向的矢量,相机所看的方向。从Camera.Transformation.Forward属性中获得。

在这个矩阵的帮助下,我们确保粒子系统总是对齐的面对相机。下面部分代码将描述,一个粒子类的Update的一部分代码,使用新函数来转化自身来准备显示。请注意,在申请公告板转换后,它在z坐标轴旋转:因为旋转对象于随想的坐标,它在坐标轴上旋转和相机对齐,无论相机如何放置在世界中。

// Calculate  the  transformation matrix
SetIdentity();

// Apply the  billboard  transformation
ApplyTransformation(Matrix.CreateBillboard(Position,
        Game.Camera.Transformation.Translation, 
        Game.Camera.Transformation.Up,
        Game.Camera.Transformation.Forward));

// Rotate and scale
ApplyTransformation(Matrix.CreateRotationZ(AngleZ));
ApplyTransformation(Matrix.CreateScale(Scale));
posted on 2012-07-09 13:57  AppleSeeker(冯峰)  阅读(1455)  评论(0编辑  收藏  举报