托管的 Direct3D之 使用 Frame Hierarchy 创建动画(翻译)

找了很久关于托管的DirectX编的资料实在是很少,无意中发现了这编文章 http://www.jkarlsson.com/Articles/loadframes.asp 觉得对学习托管的Direct3D学习很有帮助。所以翻译来与大家共享。

另外,本人的英语水平有限,翻不好的地方大家不要见怪。欢迎大家指出有误的地方。谢谢。

本人QQ:173257128 (koy0755)欢迎高手交流。

好了,废话少说,开始转入正题DirectX 的图形场景由一系列的 帧( Frame )组成 , 这允许你单独地存储几何对象和操作他们。帧由父 (parent) 、子 (children) 、兄弟 (sibling) 帧组成一个层次结构 . 对父帧的任何操作都会应用到它的子帧有子帧的子帧 .

想象一下你在建立一个包括身体( body ) , 炮塔 (turret), 枪 (gun) 的坦克模型 . 更深入地想象一下你把“身体帧” (body frame) 作为根 . 炮塔作为身体的子帧 .. “枪帧”作为“身体帧”的子帧 . 如果你要在前景里移动你的坦克,你可以转移和旋转“身体帧”,炮塔和枪将公跟着坦克相互移动和旋转。另外你还能把旋转只应用到炮塔上,这样枪将会跟着炮塔相互旋转。你还能应用适当的变化来单独改变“枪帧”或其它帧的仰视角度。

The DirectX (.x) File

这篇文章假设我们要从 .X 文件加载的场景是 SDK 提供的类支持的。让我们看看这坦克在初期是怎么在 DirextX 文件里声明的。

xof 0303txt 0032
...

Frame Body
{
FrameTransformMatrix
{
1.000000,0.000000,0.000000,0.000000,
0.000000,1.000000,0.000000,0.000000,
0.000000,0.000000,1.000000,0.000000,
-1.401197,0.000000,0.279802,1.000000;;
}

Mesh
{
20;
-29.527559;0.000000;-49.212597;,
...
}

Frame Turret
{
FrameTransformMatrix
{
1.000000,0.000000,0.000000,0.000000,
0.000000,1.000000,0.000000,0.000000,
0.000000,0.000000,1.000000,0.000000,
1.435083,29.904209,-0.126913,1.000000;;
}

Mesh
{
116;
0.000000;0.000000;0.000000;
...
}

Frame Gun
{
FrameTransformMatrix
{
1.000000,0.000000,0.000000,0.000000,
0.000000,0.000000,-1.000000,0.000000,
0.000000,1.000000,0.000000,0.000000,
1.016502,4.063328,21.468393,1.000000;;
}

Mesh
{
116;
0.000000;0.000000;0.000000;,
...
}
}
}
}

完整的 DirectX 文件会比这里的多很多,但上面的元素是关于“帧”的讨论的要用到的。让我们看看上面这文档的不同部份。

` Frame Body {}

`

`

`

这里声明了一个名为 _ Body _ 的帧 . 注意另外两个帧 “ frame ”, Turret 和 Gun 是彼此嵌套地建立了一个帧的层次结构 ( hierarchy ) 。

FrameTransformMatrix {} `

`

这是声明当前帧( frame )的 mesh 和他的子帧的 mesh 用放大,移动和旋转把当前帧放置到相对于其它帧的几何对象的合适位置的变换矩阵。考虑一下坦克上的炮塔这个例子, 他可能在建模时作为了个“圆桶状”被放置在原点。如果没有对它进行变换,它就会被放置在身体 (body) 里面了。配合变换矩阵我们就有足够的信息把炮塔放置到正确的位置了。

Mesh {} `

`

它包含组成这个帧的顶点的坐标。它与这个帧的变换矩阵一起,我们就有了表现这个帧相对于其它帧的对象的足够信息。在内存中会把这个场景存储在一个 _ AnimationRootFrame _ 对象中。 _ AnimationRootFrame _ 让我们可以存储一个“帧的层次结构”在它的 _ FrameHierarchy _ 属性里。 AnimationRootFrame 还可以对一个“帧层次结构”执行其它操作,但我们现在忽略它们。

Loading a Frame Hierarchy

我们需要用一些代码来获取一个 DirectX 文件和创建帧层次 ( Frame Hiearchy ) 来存储我们的 AnimationRootFrame 对象。我们使用静态方法 Mesh.LoadHierachyFromFile 来帮助我们实现上面的功能。这个方法需要我们定义类来实现真正的分配类层次中每部份的操作。我们需要继承抽象类, AllocateHierarchy , Frame 和 MeshContainer 。

以下所示是我们这个类的第一个版本 :

public class GraphicsObject
{
// Path to the x-file containing the frame hierarchy for this class.
protected string xFilePath;

// Container for the frames
protected AnimationRootFrame rootFrame;

public GraphicsObject(string xFilePath, Device device)
{
this.xFilePath = xFilePath;
this.device = device;
}

// Load the frame hierarchy from file.
public virtual void Initialize()
{
this.rootFrame = Mesh.LoadHierarchyFromFile(this.xFilePath,
MeshFlags.Managed,
this.device,
new CustomAllocateHierarchy(this.xFilePath),
null);
<span lang="EN" style="FONT-SIZE: 10pt; BACKGROUND: #d9d9d

Published At
Categories with Web编程
Tagged with
comments powered by Disqus