بســم الله الـرحمــن الرحيــم الدرس السادس أهلا بكم في الدرس السادس من سلسلة دروس تعلم ال3D Xna السلسلة الأولى، في هذا الدرس سوف نقوم بإنشاء الرؤوس من خلال الفهارس. كان المثلث جميلا، ولكن ماذا عن مجموعة من المثلثات؟ سوف نحتاج لأن نعرف 3 رؤوس لكل مثلث. لاحظ المثال التالي: هناك 4 رؤوس فريدة من أصل 6. لذا الرأسين الآخرين هم ببساطة مجرد إضاعة لطاقة بطاقة الرسوميات! لذلك من الأفضل تعريف 4 رؤوس في مصفوفة من 0 إلى 3، و بعدها تعريف المثلث الأول من الرؤوس 1،2 و 3 و المثلث الثاني بإستخدام الرؤوس 2,3 و 4. بهذه الطريقة، لن تتكرر بيانات الرؤوس المركبة. هذه هي الفكرة بالضبط من وراء الفهارس. إفترض أننا نريد أن نرسم هذين المثلثين: في الوضع الطبيعي يجب علينا تعريف 6 رؤوس، ولكن الآن يجب علينا تعريف 5 رؤوس فقط. لذا قم بتغيير الدالة SetUpVertices كالتالي:
private void SetUpVertices() { vertices = new VertexPositionColor[5]; vertices[0].Position = new Vector3(0f, 0f, 0f); vertices[0].Color = Color.White; vertices[1].Position = new Vector3(5f, 0f, 0f); vertices[1].Color = Color.White; vertices[2].Position = new Vector3(10f, 0f, 0f); vertices[2].Color = Color.White; vertices[3].Position = new Vector3(5f, 0f, -5f); vertices[3].Color = Color.White; vertices[4].Position = new Vector3(10f, 0f, -5f); vertices[4].Color = Color.White; myVertexDeclaration = new VertexDeclaration(device, VertexPositionColor.VertexElements); }
int[] indices;
private void SetUpIndices() { indices = new int[6]; indices[0] = 3; indices[1] = 1; indices[2] = 0; indices[3] = 4; indices[4] = 2; indices[5] = 1; }
SetUpIndices();
device.DrawUserIndexedPrimitives(PrimitiveType.TriangleList, vertices, 0, vertices.Length, indices, 0, indices.Length / 3);
Matrix worldMatrix = Matrix.Identity;
viewMatrix = Matrix.CreateLookAt(new Vector3(0, 50, 0), new Vector3(0, 0, 0), new Vector3(0, 0, -1));
device.RenderState.FillMode = FillMode.WireFrame;
short[] indices;
indices = new short[6];
using System; using System.Collections.Generic; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.GamerServices; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Net; using Microsoft.Xna.Framework.Storage; namespace XNAtutorial { public class Game1 : Microsoft.Xna.Framework.Game { GraphicsDeviceManager graphics; SpriteBatch spriteBatch; GraphicsDevice device; Effect effect; VertexPositionColor vertices; VertexDeclaration myVertexDeclaration; int indices; Matrix viewMatrix; Matrix projectionMatrix; private float angle = 0f; public Game1() { graphics = new GraphicsDeviceManager(this); Content.RootDirectory = "Content";