在 C#/XNA 中转换 3D 基元的正确方法
本文关键字:方法 3D XNA 转换 | 更新日期: 2023-09-27 18:36:22
我有一个基本上包含 36 个顶点的数组的 Block 类,一个围绕原点 (0, 0, 0) 构建块的构造函数,以及一个更新方法。
我正在使用物理库来操作块。 我为方块分配了一个身体和碰撞皮肤,并在每次更新时更新物理步骤。 每次更新后,我都会得到一个矩阵,其中包含块的新位置、方向等。
现在,我无法理解的是将矩阵应用于块并在每一帧有效地更新顶点缓冲区的最佳方法。
这基本上是我目前所拥有的,我几乎肯定有更好的方法......
class Block
{
const float FullBlockSize = 20f;
const float HalfBlockSize = FullBlockSize / 2;
public VertexPositionNormalTexture [] vertices = new VertexPositionNormalTexture[36];
public VertexPositionNormalTexture [] currentVertices = new VertexPositionNormalTexture[36];
public DynamicVertexBuffer vBuffer;
Vector3 position;
public Block(Vector3 blockPosition)
{
position = blockPosition * FullBlockSize;
/*
* Build the 6 faces of the block here.
* The block is built around the origin,
* (0, 0, 0) being the center of the block.
*/
vBuffer = new DynamicVertexBuffer(Game.Device, VertexPositionNormalTexture.VertexDeclaration, vertices.Length, BufferUsage.WriteOnly);
vBuffer.SetData(vertices);
}
public Matrix WorldMatrix
{
get
{
return Matrix.CreateTranslation(position);
}
}
public void Update()
{
currentVertices = (VertexPositionNormalTexture[])vertices.Clone();
Matrix currentWorld = WorldMatrix;
for(int i = 0; i < currentVertices.Length; ++i)
{
currentVertices[i].Position = Vector3.Transform(currentVertices[i].Position, currentWorld);
}
vBuffer.SetData(currentVertices);
}
}
让着色器来做...着色器的参数之一通常是世界矩阵...
要绘制它:
effect.Parameters["WorldMatrix"].SetValue(World);
effect.Apply(0);
如果您在绘制块时遇到问题...尝试自己创建一个世界变换矩阵并测试它......
effect.Parameters["WorldMatrix"].SetValue(Matrix.CreateRotationZ(angle));
effect.Apply(0);
如果你有多个块实例,你可以使用实例化将顶点缓冲区中的 trasnform 矩阵传递给着色器......
在这里,您可以找到有关实例化的信息:http://blogs.msdn.com/b/shawnhar/archive/2010/06/17/drawinstancedprimitives-in-xna-game-studio-4-0.aspx