我想将模型绘制到屏幕中。这是我的代码:
protected override void Draw(GameTime gameTime) {
GraphicsDevice.Clear(Color.CornflowerBlue);
// TODO: Add your drawing code here
Matrix[] transforms = new Matrix[model.Bones.Count];
model.CopyAbsoluteBoneTransformsTo(transforms);
foreach (ModelMesh mesh in model.Meshes)
{
foreach (BasicEffect effect in mesh.Effects)
{
effect.EnableDefaultLighting();
effect.World = transforms[mesh.ParentBone.Index] *
Matrix.CreateRotationY(modelRotation) *
Matrix.CreateTranslation(modelPosition);
effect.View = Matrix.CreateLookAt(cameraPosition,
Vector3.Zero, Vector3.Up);
effect.Projection = Matrix.CreatePerspectiveFieldOfView(
MathHelper.ToRadians(45.0f), aspectRatio,
1.0f, 10000.0f);
}
mesh.Draw();
}
base.Draw(gameTime);
}
但是,如果我删除:
Matrix []变换= new Matrix [model.Bones.Count]; model.CopyAbsoluteBoneTransformsTo(变换);
并在循环中更改代码:
effect.World = Matrix.CreateRotationY(modelRotation);
它仍然可以正常工作。那么为什么我必须在我的项目中添加上面的代码?有什么好处呢?非常感谢!
答案 0 :(得分:1)
主要区别在于,在使用变换部件的情况下,您可以完全控制机械零件变换,在简单的情况下,您无法应用其他变换矩阵。
简单地说,您可以将网格旋转为一个整体,或者您可以将娃娃旋转为玩偶,例如娃娃动画。
但我仍然没有看到你的样本中的原因是通过骨骼索引访问相同的矩阵。它仍然看起来毫无用处,直到你在代码中对它们做了一些事情,但每次在一个地方创建它看起来像是正确使用了martices。
答案 1 :(得分:0)
effect.World = transforms[mesh.ParentBone.Index] *
Matrix.CreateRotationY(modelRotation) *
Matrix.CreateTranslation(modelPosition);
我猜测在第1步中没有任何变换,因为它是一个简单的盒子或者其他东西,在第2步中,modelPosition是0,0,0所以它实际上并没有被移动到任何地方。
更改modelPosition的值,您会看到模型在屏幕上移动但不会随着您的更改而移动。