【题外话】
上一篇文章介绍了3D开发基础与XNA开发程序的整体结构,以及使用Model类的Draw方法将模型绘制到屏幕上。本文接着上一篇文章继续,介绍XNA中模型的结构、BasicEffect的使用以及用户输入和界面显示的方式等,本文尽量把遇到的概念都解析清楚,但又避开复杂的数学方面的知识,希望对没有接触过3D开发的同学有所帮助。
【系列索引】
【文章索引】
上一篇文章使用Model自带的Draw方法实现了直接将载入的Model绘制到指定的位置上去,但是有时候绘制出来的效果并不符合我们的预期,比如下图(下图的模型是通过Maya创建的一个屋子):
通过ILSpy查看Microsoft.Xna.Framework.Graphics.Model,可以看到其Draw方法的代码如下:
1 public void Draw(Matrix world, Matrix view, Matrix projection) 2 { 3 int count = this.meshes.Count; 4 int count2 = this.bones.Count; 5 Matrix[] array = Model.sharedDrawBoneMatrices; 6 if (array == null || array.Length < count2) 7 { 8 array = new Matrix[count2]; 9 Model.sharedDrawBoneMatrices = array; 10 } 11 this.CopyAbsoluteBoneTransformsTo(array); 12 for (int i = 0; i < count; i++) 13 { 14 ModelMesh modelMesh = this.meshes[i]; 15 int index = modelMesh.ParentBone.Index; 16 int count3 = modelMesh.Effects.Count; 17 for (int j = 0; j < count3; j++) 18 { 19 Effect effect = modelMesh.Effects[j]; 20 if (effect == null) 21 { 22 throw new InvalidOperationException(FrameworkResources.ModelHasNoEffect); 23 } 24 IEffectMatrices effectMatrices = effect as IEffectMatrices; 25 if (effectMatrices == null) 26 { 27 throw new InvalidOperationException(FrameworkResources.ModelHasNoIEffectMatrices); 28 } 29 effectMatrices.World = array[index] * world; 30 effectMatrices.View = view; 31 effectMatrices.Projection = projection; 32 } 33 modelMesh.Draw(); 34 } 35 }