kldoon

الدرس السابع من سلسلة دروس تعلم 3d Xna

4 ردود في هذا الموضوع

بســم الله الـرحمــن الرحيــم

الدرس السابع

أهلا بكم في الدرس السابع من سلسلة دروس تعلم ال3D Xna السلسلة الأولى، في هذا الدرس سوف نتحدث عن اساسيات إنشاء التضاريس.

حتى الآن، قد درسنا عناوين كافيه لكي نبدأ بإنشاء التضاريس الخاصة بنا. دعنا نبدأ بشيئ بسيط، عن طريق ربط 3*4 رؤوس محددة. بكل الأحوال، سوف نقوم بعمل المحرك الخاص بنا بشكل ديناميكي، لذا في الدرس القادم سوف نستطيع ببساطة تحميل عدد اكبر بكثير من النقاط. لعمل ذلك، علينا إنشاء متغيرين جديدين في الصنف:

 private int terrainWidth = 4;
private int terrainHeight = 3;

سوف نفترض أن النقاط ال 4*3 متساوية الأبعاد. لذا الشيئ الوحيد الذي نجهله عن نقاطنا حتى الآن هو إحداثي ال Z. حيث سوف نستخدم مصفوفة من أجل تخزين هذه المعلومات، لذا سوف نقوم بإضافة التالي إلى أعلى كود الصنف:

 private float[,] heightData;

حتى الآن، إستخدم الدالة التالية من أجل تعبئة المصفوفة:

 private void LoadHeightData()
{
heightData = new float[4, 3];
heightData[0, 0] = 0;
heightData[1, 0] = 0;
heightData[2, 0] = 0;
heightData[3, 0] = 0;

heightData[0, 1] = 0.5f;
heightData[1, 1] = 0;
heightData[2, 1] = -1.0f;
heightData[3, 1] = 0.2f;

heightData[0, 2] = 1.0f;
heightData[1, 2] = 1.2f;
heightData[2, 2] = 0.8f;
heightData[3, 2] = 0;
}

طبعا لا تنسى إستدعائها من داخل الدالة LoadContent. تأكد أنك قمت بإستدعائها قبل الدالة SetUpVertices، لأن هذه الدالة سوف تستخدم محتويات المصفوفة heightData.

 LoadHeightData();

الآن و بعد ملئ مصفوفة الإرتفاعات، بإستطاعتنا إنشاء الرؤوس. بما أن لدينا تضاريس بحجم 3*4، سوف نحتاج ل 12 (=عرض التضاريس* طول التضاريس) رأس. المسافة بين النقاط متساوية (المسافة بينهم متساوية)، إذن يمكننا بسهولة تغيير الدالة SetUpVertices. مبدئيا، لن نستخدم الإحداثي Z بعد، حيث سوف نلاحظ الفرق لاحقا في هذا الدرس.

 private void SetUpVertices()
{
vertices = new VertexPositionColor[terrainWidth * terrainHeight];
for (int x = 0; x < terrainWidth; x++)
{
for (int y = 0; y < terrainHeight; y++)
{
vertices[x + y * terrainWidth].Position = new Vector3(x, 0, -y);
vertices[x + y * terrainWidth].Color = Color.White;
}
}

myVertexDeclaration = new VertexDeclaration(device, VertexPositionColor.VertexElements);
}

لا شيئ سحري يحصل هنا، انت ببساطة تعرف 12 نقطة و تعطيهم اللون الأبيض. لاحظ أن التضاريس سوف تنمو بإتجاه محور X الموجب (اليمين) و بإتجاه محور Z السالب (للأمام).

الجزء التالي أصعب قليلا: تعريف الفهارس التي تحدد المثلثات المطلوبه من أجل ربط ال 12 رأس. أفضل طريقة لعمل ذلك هي من خلال عمل مجموعتين من الرؤوس:

post-133895-1248682425_thumb.jpg

سوف نبدأ برسم المثلثات المرسومة بخطوط متواصلة. لعمل ذلك، قم بتغير الدالة SetUpIndices لتبدو بالشكل التالي:

 private void SetUpIndices()
{
indices = new int[(terrainWidth - 1) * (terrainHeight - 1) * 3];
int counter = 0;
for (int y = 0; y < terrainHeight - 1; y++)
{
for (int x = 0; x < terrainWidth - 1; x++)
{
int lowerLeft = x + y*terrainWidth;
int lowerRight = (x + 1) + y*terrainWidth;
int topLeft = x + (y + 1) * terrainWidth;
int topRight = (x + 1) + (y + 1) * terrainWidth;

indices[counter++] = topLeft;
indices[counter++] = lowerRight;
indices[counter++] = lowerLeft;
}
}
}

تذكر أن ال terrainWidth و ال terrainHeight يمثلان عدد النقاط الأفقي و العمودي في التضاريس. سوف نحتاج صفين كل صف مكون من 3 مثلثات، ما يعطينيا 6 مثلثات. ذلك سوف يتطلب منا 3*2*3 =18 فهرس (= (عرض التضاريس-1) * (طول التضاريس -1)*3)، لهذا، السطر الأول يقوم بإنشاء مصفوفة تحتوي على هذا العدد من الأرقام.

بعدها، نقوم بتعبئة المصفوفة بالفهارس. حيث نقوم بالمرور على إحداثيات X و Y سطر بعد سطر، حيث يتم إنشاء المثلثات. في السطر الأول، عندما تكون y=0، نحتاج إلى إنشاء 6 مثلثات من الرؤوس بدأ من 0 (أسفل-يسار) حتى 7 (وسط يمين). بعدها، تصبح قيمةy =1 و 1*عرض التضاريس=4 يتم إضافته إلى كل فهرس: في هذه المرة نقوم بإنشاء المثلثات ال 6 بناء على النقاط من 4 (وسط - ايسر) حتى 11 (يمين - أعلى).

لجعل الأمور أسهل، قمنا أولا بتعريف 4 إختصارات لفهارس أربع زوايا لكل رباعي. من رباعي نقوم بتخزين ثلاثة فهارس، تعرف مثلث واحد. هل تذكر الغربلة؟ تتطلب تعريف الرؤوس بترتيب بإتجاه عقارب الساعة. لذا أولا نقوم بتعريف الرأس العلوي- الأيسر، بعدها الرأس الأسفل- الأيمن ثم الرأس الأسفل- الأيسر.

المتغير counter هو طريقة سهلة من أجل تخزين الرؤوس في مصفوفة، حيث نقوم بزيادته في كل مرة يتم إضافة فهرس إلى المصفوفة. عندما تنتهي الدالة، سوف تكون المصفوفة تحتوي على جميع الفهارس الازمة لرسم جميع المثلثات السفلى اليسرى.

قمنا بعمل دالة الرسم بطريقة تتيح لل Xna رسم عدد من المثلثات تتحدد بناء على طول مصفوفة الفهارسن لذا بإمكانك تشغيل الكود مباشرة!

لابد و أنك قد لاحظت أن المثلثات تبدو رفيعة، لذا حاول أن تضع الكاميرا في الموقع (0,10,0) و إعد تشغيل البرنامج. يجب أن ترى 6 مثلثات في الجزء الأيمن من الشاشة، كل نقطة من كل مثلث هي على نفس الإحداثي في محور Z. الآن قم بتغير إرتفاع النقاط بناء على مصفوفة heightData:

 vertices[x + y * terrainWidth].Position = new Vector3(x, heightData[x,y], -y);

عند تشغيل ذلك، سوف تلاحظ أن المثلثات لا تقع على نفس المستوى.

تذكر أنك مازلت فقط تقوم برسم المثلثات السفلية-اليسرى. لذا عندما تريد رسم المثلثات بإستخدام الوانهم المصمته بدلا من الحدود فقط، سوف تكون نصف الشبكه لديك غير مغطاه. لحل ذلك، دعنا نعرف بعض الفهارس الإضافية من أجل رسم المثلثات العلوية اليمنى. سوف نحتاج نفس الرؤوس، لذا التغيير الوحيد الازم هو الدالة SetUpIndices:

 private void SetUpIndices()
{
indices = new int[(terrainWidth - 1) * (terrainHeight - 1) * 6];
int counter = 0;
for (int y = 0; y < terrainHeight - 1; y++)
{
for (int x = 0; x < terrainWidth - 1; x++)
{
int lowerLeft = x + y*terrainWidth;
int lowerRight = (x + 1) + y*terrainWidth;
int topLeft = x + (y + 1) * terrainWidth;
int topRight = (x + 1) + (y + 1) * terrainWidth;

indices[counter++] = topLeft;
indices[counter++] = lowerRight;
indices[counter++] = lowerLeft;

indices[counter++] = topLeft;
indices[counter++] = topRight;
indices[counter++] = lowerRight;
}
}
}

الآن سوف يتم رسم ضعف عدد الرؤوس، هذا هو السبب وراء إستخدام *6 بلا من *3. كما ترى فإن المجموعة الثانية من المثلثات تم رسمها بترتيب بإتجاه عقارب الساعة بالنسبة للكاميرا: أولا الزاوية العلوية اليسرى، بعدها العلوية اليمنى و في النهاية السفلى اليمنى.

تشغيل هذا الكود سوف يعطيك مشهد ثلاثي الأبعاد أفضل. لقد أخذنا بعين الإعتبار إستخدام المتغيرين terrainWidth و terrainHeight فقط، لذا هذين هما المتغيرين اللآزم تغيرهما من أجل زيادة حجم الخارطة، معا بالإضافة إلى المصفوفة heightData. من الجميل إيجاد طريقة لملئ هذه المصفوفة بشكل تلقائي، و هو ما سوف نفعله في الدرس القادم، إن شاء الله.

post-133895-1248682452_thumb.jpg

إذا لم ترى أي مثلث مرسوم عند قيامك بتشغيل الكود، إرجع إلى الملاحظة في نهاية الدرس السابق. المشكلة لديك يجب أن تحل عن طريق إنشاء مصفوفة تقوم بتخزين قيم من نوع “short” بدلا من الأعداد الصحيحة “Integers” و بتعبئتها بالطريقة التالية:

 private void SetUpIndices()
{
indices = new short[(terrainWidth - 1) * (terrainHeight - 1) * 6];
int counter = 0;
for (int y = 0; y < terrainHeight - 1; y++)
{
for (int x = 0; x < terrainWidth - 1; x++)
{
short lowerLeft = (short)(x + y * terrainWidth);
short lowerRight = (short)((x + 1) + y * terrainWidth);
short topLeft = (short)(x + (y + 1) * terrainWidth);
short topRight = (short)((x + 1) + (y + 1) * terrainWidth);

indices[counter++] = topLeft;
indices[counter++] = lowerRight;
indices[counter++] = lowerLeft;

indices[counter++] = topLeft;
indices[counter++] = topRight;
indices[counter++] = lowerRight;
}
}
}

بإمكانك محاولة حل التمارين التالية من أجل ممارسة ما تعلمته في هذا الدرس:

• قم بتغيير القيم الخاصة بمصفوفة heightData ولاحظ الفروق.

• حاول إضافة صف إضافي إلى الشبكة.

نسخة عن الدرس بصيغة PDF:

Learn3D_Xna_S1L7.pdf

الكود حتى الآن:

انسخ الكود
  1. using [color= #990000;]System[/color][color= #339933;];[/color]
  2. using [color= #990000;]System[/color][color= #339933;].[/color]Collections[color= #339933;].[/color]Generic[color= #339933;];[/color]
  3. using Microsoft[color= #339933;].[/color]Xna[color= #339933;].[/color]Framework[color= #339933;];[/color]
  4. using Microsoft[color= #339933;].[/color]Xna[color= #339933;].[/color]Framework[color= #339933;].[/color]Audio[color= #339933;];[/color]
  5. using Microsoft[color= #339933;].[/color]Xna[color= #339933;].[/color]Framework[color= #339933;].[/color]Content[color= #339933;];[/color]
  6. using Microsoft[color= #339933;].[/color]Xna[color= #339933;].[/color]Framework[color= #339933;].[/color]GamerServices[color= #339933;];[/color]
  7. using Microsoft[color= #339933;].[/color]Xna[color= #339933;].[/color]Framework[color= #339933;].[/color]Graphics[color= #339933;];[/color]
  8. using Microsoft[color= #339933;].[/color]Xna[color= #339933;].[/color]Framework[color= #339933;].[/color]Input[color= #339933;];[/color]
  9. using Microsoft[color= #339933;].[/color]Xna[color= #339933;].[/color]Framework[color= #339933;].[/color]Net[color= #339933;];[/color]
  10. using Microsoft[color= #339933;].[/color]Xna[color= #339933;].[/color]Framework[color= #339933;].[/color]Storage[color= #339933;];[/color]
  11.  
  12. namespace XNAtutorial
  13. [color= #009900;]{[/color]
  14. [color= #000000; font-weight: bold;]public[/color] [color= #000000; font-weight: bold;]class[/color] Game1 [color= #339933;]:[/color] Microsoft[color= #339933;].[/color]Xna[color= #339933;].[/color]Framework[color= #339933;].[/color]Game
  15. [color= #009900;]{[/color]
  16. GraphicsDeviceManager graphics[color= #339933;];[/color]
  17. SpriteBatch spriteBatch[color= #339933;];[/color]
  18. GraphicsDevice device[color= #339933;];[/color]
  19. Effect effect[color= #339933;];[/color]
  20. VertexPositionColor[color= #009900;][[/color][color= #009900;]][/color] vertices[color= #339933;];[/color]
  21. VertexDeclaration myVertexDeclaration[color= #339933;];[/color]
  22. int[color= #009900;][[/color][color= #009900;]][/color] indices[color= #339933;];[/color]
  23.  
  24. Matrix viewMatrix[color= #339933;];[/color]
  25. Matrix projectionMatrix[color= #339933;];[/color]
  26.  
  27. [color= #000000; font-weight: bold;]private[/color] int terrainWidth [color= #339933;]=[/color] [color= #cc66cc;]4[/color][color= #339933;];[/color]
  28. [color= #000000; font-weight: bold;]private[/color] int terrainHeight [color= #339933;]=[/color] [color= #cc66cc;]3[/color][color= #339933;];[/color]
  29. [color= #000000; font-weight: bold;]private[/color] float[color= #009900;][[/color][color= #339933;],[/color][color= #009900;]][/color] heightData[color= #339933;];[/color]
  30.  
  31. [color= #000000; font-weight: bold;]public[/color] Game1[color= #009900;]([/color][color= #009900;])[/color]
  32. [color= #009900;]{[/color]
  33. graphics [color= #339933;]=[/color] [color= #000000; font-weight: bold;]new[/color] GraphicsDeviceManager[color= #009900;]([/color]this[color= #009900;])[/color][color= #339933;];[/color]
  34. Content[color= #339933;].[/color]RootDirectory [color= #339933;]=[/color] [color= #0000ff;]"Content"[/color][color= #339933;];[/color]
  35. [color= #009900;]}[/color]
  36.  
  37. protected override void Initialize[color= #009900;]([/color][color= #009900;])[/color]
  38. [color= #009900;]{[/color]
  39. graphics[color= #339933;].[/color]PreferredBackBufferWidth [color= #339933;]=[/color] [color= #cc66cc;]500[/color][color= #339933;];[/color]
  40. graphics[color= #339933;].[/color]PreferredBackBufferHeight [color= #339933;]=[/color] [color= #cc66cc;]500[/color][color= #339933;];[/color]
  41. graphics[color= #339933;].[/color]IsFullScreen [color= #339933;]=[/color] [color= #000000; font-weight: bold;]false[/color][color= #339933;];[/color]
  42. graphics[color= #339933;].[/color]ApplyChanges[color= #009900;]([/color][color= #009900;])[/color][color= #339933;];[/color]
  43. Window[color= #339933;].[/color]Title [color= #339933;]=[/color] [color= #0000ff;]"Riemer's XNA Tutorials -- Series 1"[/color][color= #339933;];[/color]
  44.  
  45. base[color= #339933;].[/color]Initialize[color= #009900;]([/color][color= #009900;])[/color][color= #339933;];[/color]
  46. [color= #009900;]}[/color]
  47.  
  48. protected override void LoadContent[color= #009900;]([/color][color= #009900;])[/color]
  49. [color= #009900;]{[/color]
  50. device [color= #339933;]=[/color] graphics[color= #339933;].[/color]GraphicsDevice[color= #339933;];[/color]
  51. spriteBatch [color= #339933;]=[/color] [color= #000000; font-weight: bold;]new[/color] SpriteBatch[color= #009900;]([/color]GraphicsDevice[color= #009900;])[/color][color= #339933;];[/color]
  52.  
  53. effect [color= #339933;]=[/color] Content[color= #339933;].[/color]Load[color= #339933;]<[/color]Effect[color= #339933;]>[/color] [color= #009900;]([/color][color= #0000ff;]"effects"[/color][color= #009900;])[/color][color= #339933;];[/color]
  54.  
  55. LoadHeightData[color= #009900;]([/color][color= #009900;])[/color][color= #339933;];[/color]
  56. SetUpVertices[color= #009900;]([/color][color= #009900;])[/color][color= #339933;];[/color]
  57. SetUpCamera[color= #009900;]([/color][color= #009900;])[/color][color= #339933;];[/color]
  58. SetUpIndices[color= #009900;]([/color][color= #009900;])[/color][color= #339933;];[/color]
  59. [color= #009900;]}[/color]
  60.  
  61. [color= #000000; font-weight: bold;]private[/color] void SetUpVertices[color= #009900;]([/color][color= #009900;])[/color]
  62. [color= #009900;]{[/color]
  63. vertices [color= #339933;]=[/color] [color= #000000; font-weight: bold;]new[/color] VertexPositionColor[color= #009900;][[/color]terrainWidth [color= #339933;]*[/color] terrainHeight[color= #009900;]][/color][color= #339933;];[/color]
  64. [color= #b1b100;]for[/color] [color= #009900;]([/color]int x [color= #339933;]=[/color] [color= #cc66cc;]0[/color][color= #339933;];[/color] x [color= #339933;]<[/color] terrainWidth[color= #339933;];[/color] x[color= #339933;]++[/color][color= #009900;])[/color]
  65. [color= #009900;]{[/color]
  66. [color= #b1b100;]for[/color] [color= #009900;]([/color]int y [color= #339933;]=[/color] [color= #cc66cc;]0[/color][color= #339933;];[/color] y [color= #339933;]<[/color] terrainHeight[color= #339933;];[/color] y[color= #339933;]++[/color][color= #009900;])[/color]
  67. [color= #009900;]{[/color]
  68. vertices[color= #009900;][[/color]x [color= #339933;]+[/color] y [color= #339933;]*[/color] terrainWidth[color= #009900;]][/color][color= #339933;].[/color]Position [color= #339933;]=[/color] [color= #000000; font-weight: bold;]new[/color] Vector3[color= #009900;]([/color]x[color= #339933;],[/color] heightData[color= #009900;][[/color]x[color= #339933;],[/color] y[color= #009900;]][/color][color= #339933;],[/color]
    [color= #339933;]-[/color]y[color= #009900;])[/color][color= #339933;];[/color]
  69. vertices[color= #009900;][[/color]x [color= #339933;]+[/color] y [color= #339933;]*[/color] terrainWidth[color= #009900;]][/color][color= #339933;].[/color]Color [color= #339933;]=[/color] Color[color= #339933;].[/color]White[color= #339933;];[/color]
  70. [color= #009900;]}[/color]
  71. [color= #009900;]}[/color]
  72.  
  73. myVertexDeclaration [color= #339933;]=[/color] [color= #000000; font-weight: bold;]new[/color] VertexDeclaration[color= #009900;]([/color]device[color= #339933;],[/color] VertexPositionColor[color= #339933;].[/color]VertexElem
    ents[color= #009900;])[/color][color= #339933;];[/color]
  74. [color= #009900;]}[/color]
  75.  
  76. [color= #000000; font-weight: bold;]private[/color] void SetUpIndices[color= #009900;]([/color][color= #009900;])[/color]
  77. [color= #009900;]{[/color]
  78. indices [color= #339933;]=[/color] [color= #000000; font-weight: bold;]new[/color] int[color= #009900;][[/color][color= #009900;]([/color]terrainWidth [color= #339933;]-[/color] [color= #cc66cc;]1[/color][color= #009900;])[/color] [color= #339933;]*[/color] [color= #009900;]([/color]terrainHeight [color= #339933;]-[/color] [color= #cc66cc;]1[/color][color= #009900;])[/color] [color= #339933;]*[/color] [color= #cc66cc;]6[/color][color= #009900;]][/color][color= #339933;];[/color]
  79. int counter [color= #339933;]=[/color] [color= #cc66cc;]0[/color][color= #339933;];[/color]
  80. [color= #b1b100;]for[/color] [color= #009900;]([/color]int y [color= #339933;]=[/color] [color= #cc66cc;]0[/color][color= #339933;];[/color] y [color= #339933;]<[/color] terrainHeight [color= #339933;]-[/color] [color= #cc66cc;]1[/color][color= #339933;];[/color] y[color= #339933;]++[/color][color= #009900;])[/color]
  81. [color= #009900;]{[/color]
  82. [color= #b1b100;]for[/color] [color= #009900;]([/color]int x [color= #339933;]=[/color] [color= #cc66cc;]0[/color][color= #339933;];[/color] x [color= #339933;]<[/color] terrainWidth [color= #339933;]-[/color] [color= #cc66cc;]1[/color][color= #339933;];[/color] x[color= #339933;]++[/color][color= #009900;])[/color]
  83. [color= #009900;]{[/color]
  84. int lowerLeft [color= #339933;]=[/color] x [color= #339933;]+[/color] y[color= #339933;]*[/color]terrainWidth[color= #339933;];[/color]
  85. int lowerRight [color= #339933;]=[/color] [color= #009900;]([/color]x [color= #339933;]+[/color] [color= #cc66cc;]1[/color][color= #009900;])[/color] [color= #339933;]+[/color] y[color= #339933;]*[/color]terrainWidth[color= #339933;];[/color]
  86. int topLeft [color= #339933;]=[/color] x [color= #339933;]+[/color] [color= #009900;]([/color]y [color= #339933;]+[/color] [color= #cc66cc;]1[/color][color= #009900;])[/color] [color= #339933;]*[/color] terrainWidth[color= #339933;];[/color]
  87. int topRight [color= #339933;]=[/color] [color= #009900;]([/color]x [color= #339933;]+[/color] [color= #cc66cc;]1[/color][color= #009900;])[/color] [color= #339933;]+[/color] [color= #009900;]([/color]y [color= #339933;]+[/color] [color= #cc66cc;]1[/color][color= #009900;])[/color] [color= #339933;]*[/color] terrainWidth[color= #339933;];[/color]
  88.  
  89. indices[color= #009900;][[/color]counter[color= #339933;]++[/color][color= #009900;]][/color] [color= #339933;]=[/color] topLeft[color= #339933;];[/color]
  90. indices[color= #009900;][[/color]counter[color= #339933;]++[/color][color= #009900;]][/color] [color= #339933;]=[/color] lowerRight[color= #339933;];[/color]
  91. indices[color= #009900;][[/color]counter[color= #339933;]++[/color][color= #009900;]][/color] [color= #339933;]=[/color] lowerLeft[color= #339933;];[/color]
  92.  
  93. indices[color= #009900;][[/color]counter[color= #339933;]++[/color][color= #009900;]][/color] [color= #339933;]=[/color] topLeft[color= #339933;];[/color]
  94. indices[color= #009900;][[/color]counter[color= #339933;]++[/color][color= #009900;]][/color] [color= #339933;]=[/color] topRight[color= #339933;];[/color]
  95. indices[color= #009900;][[/color]counter[color= #339933;]++[/color][color= #009900;]][/color] [color= #339933;]=[/color] lowerRight[color= #339933;];[/color]
  96. [color= #009900;]}[/color]
  97. [color= #009900;]}[/color]
  98. [color= #009900;]}[/color]
  99.  
  100. [color= #000000; font-weight: bold;]private[/color] void SetUpCamera[color= #009900;]([/color][color= #009900;])[/color]
  101. [color= #009900;]{[/color]
  102. viewMatrix [color= #339933;]=[/color] Matrix[color= #339933;].[/color]CreateLookAt[color= #009900;]([/color][color= #000000; font-weight: bold;]new[/color] Vector3[color= #009900;]([/color][color= #cc66cc;]0[/color][color= #339933;],[/color] [color= #cc66cc;]10[/color][color= #339933;],[/color] [color= #cc66cc;]0[/color][color= #009900;])[/color][color= #339933;],[/color] [color= #000000; font-weight: bold;]new[/color] Vector3[color= #009900;]([/color][color= #cc66cc;]0[/color][color= #339933;],[/color] [color= #cc66cc;]0[/color][color= #339933;],[/color] [color= #cc66cc;]0[/color][color= #009900;])[/color][color= #339933;],[/color] [color= #000000; font-weight: bold;]new[/color]
    Vector3[color= #009900;]([/color][color= #cc66cc;]0[/color][color= #339933;],[/color] [color= #cc66cc;]0[/color][color= #339933;],[/color] [color= #cc66cc;]-1[/color][color= #009900;])[/color][color= #009900;])[/color][color= #339933;];[/color]
  103. projectionMatrix [color= #339933;]=[/color] Matrix[color= #339933;].[/color]CreatePerspectiveFieldOfView[color= #009900;]([/color]MathHelper[color= #339933;].[/color]PiOver4[color= #339933;],[/color] device[color= #339933;].[/color]
    Viewport[color= #339933;].[/color]AspectRatio[color= #339933;],[/color] [color= #cc66cc;]1[/color][color= #339933;].[/color]0f[color= #339933;],[/color] [color= #cc66cc;]300[/color][color= #339933;].[/color]0f[color= #009900;])[/color][color= #339933;];[/color]
  104. [color= #009900;]}[/color]
  105.  
  106. [color= #000000; font-weight: bold;]private[/color] void LoadHeightData[color= #009900;]([/color][color= #009900;])[/color]
  107. [color= #009900;]{[/color]
  108. heightData [color= #339933;]=[/color] [color= #000000; font-weight: bold;]new[/color] float[color= #009900;][[/color][color= #cc66cc;]4[/color][color= #339933;],[/color] [color= #cc66cc;]3[/color][color= #009900;]][/color][color= #339933;];[/color]
  109. heightData[color= #009900;][[/color][color= #cc66cc;]0[/color][color= #339933;],[/color] [color= #cc66cc;]0[/color][color= #009900;]][/color] [color= #339933;]=[/color] [color= #cc66cc;]0[/color][color= #339933;];[/color]
  110. heightData[color= #009900;][[/color][color= #cc66cc;]1[/color][color= #339933;],[/color] [color= #cc66cc;]0[/color][color= #009900;]][/color] [color= #339933;]=[/color] [color= #cc66cc;]0[/color][color= #339933;];[/color]
  111. heightData[color= #009900;][[/color][color= #cc66cc;]2[/color][color= #339933;],[/color] [color= #cc66cc;]0[/color][color= #009900;]][/color] [color= #339933;]=[/color] [color= #cc66cc;]0[/color][color= #339933;];[/color]
  112. heightData[color= #009900;][[/color][color= #cc66cc;]3[/color][color= #339933;],[/color] [color= #cc66cc;]0[/color][color= #009900;]][/color] [color= #339933;]=[/color] [color= #cc66cc;]0[/color][color= #339933;];[/color]
  113.  
  114. heightData[color= #009900;][[/color][color= #cc66cc;]0[/color][color= #339933;],[/color] [color= #cc66cc;]1[/color][color= #009900;]][/color] [color= #339933;]=[/color] [color= #cc66cc;]0[/color][color= #339933;].[/color]5f[color= #339933;];[/color]
  115. heightData[color= #009900;][[/color][color= #cc66cc;]1[/color][color= #339933;],[/color] [color= #cc66cc;]1[/color][color= #009900;]][/color] [color= #339933;]=[/color] [color= #cc66cc;]0[/color][color= #339933;];[/color]
  116. heightData[color= #009900;][[/color][color= #cc66cc;]2[/color][color= #339933;],[/color] [color= #cc66cc;]1[/color][color= #009900;]][/color] [color= #339933;]=[/color] [color= #cc66cc;]-1[/color][color= #339933;].[/color]0f[color= #339933;];[/color]
  117. heightData[color= #009900;][[/color][color= #cc66cc;]3[/color][color= #339933;],[/color] [color= #cc66cc;]1[/color][color= #009900;]][/color] [color= #339933;]=[/color] [color= #cc66cc;]0[/color][color= #339933;].[/color]2f[color= #339933;];[/color]
  118.  
  119. heightData[color= #009900;][[/color][color= #cc66cc;]0[/color][color= #339933;],[/color] [color= #cc66cc;]2[/color][color= #009900;]][/color] [color= #339933;]=[/color] [color= #cc66cc;]1[/color][color= #339933;].[/color]0f[color= #339933;];[/color]
  120. heightData[color= #009900;][[/color][color= #cc66cc;]1[/color][color= #339933;],[/color] [color= #cc66cc;]2[/color][color= #009900;]][/color] [color= #339933;]=[/color] [color= #cc66cc;]1[/color][color= #339933;].[/color]2f[color= #339933;];[/color]
  121. heightData[color= #009900;][[/color][color= #cc66cc;]2[/color][color= #339933;],[/color] [color= #cc66cc;]2[/color][color= #009900;]][/color] [color= #339933;]=[/color] [color= #cc66cc;]0[/color][color= #339933;].[/color]8f[color= #339933;];[/color]
  122. heightData[color= #009900;][[/color][color= #cc66cc;]3[/color][color= #339933;],[/color] [color= #cc66cc;]2[/color][color= #009900;]][/color] [color= #339933;]=[/color] [color= #cc66cc;]0[/color][color= #339933;];[/color]
  123. [color= #009900;]}[/color]
  124.  
  125. protected override void UnloadContent[color= #009900;]([/color][color= #009900;])[/color]
  126. [color= #009900;]{[/color]
  127. [color= #009900;]}[/color]
  128.  
  129. protected override void Update[color= #009900;]([/color]GameTime gameTime[color= #009900;])[/color]
  130. [color= #009900;]{[/color]
  131. [color= #b1b100;]if[/color] [color= #009900;]([/color]GamePad[color= #339933;].[/color]GetState[color= #009900;]([/color]PlayerIndex[color= #339933;].[/color]One[color= #009900;])[/color][color= #339933;].[/color]Buttons[color= #339933;].[/color]Back [color= #339933;]==[/color] ButtonState[color= #339933;].[/color]Pressed[color= #009900;])[/color]
  132. this[color= #339933;].[/color][color= #990000;]Exit[/color][color= #009900;]([/color][color= #009900;])[/color][color= #339933;];[/color]
  133.  
  134. base[color= #339933;].[/color]Update[color= #009900;]([/color]gameTime[color= #009900;])[/color][color= #339933;];[/color]
  135. [color= #009900;]}[/color]
  136.  
  137. protected override void Draw[color= #009900;]([/color]GameTime gameTime[color= #009900;])[/color]
  138. [color= #009900;]{[/color]
  139. device[color= #339933;].[/color]Clear[color= #009900;]([/color]Color[color= #339933;].[/color]DarkSlateBlue[color= #009900;])[/color][color= #339933;];[/color]
  140. device[color= #339933;].[/color]RenderState[color= #339933;].[/color]CullMode [color= #339933;]=[/color] CullMode[color= #339933;].[/color]None[color= #339933;];[/color]
  141. device[color= #339933;].[/color]RenderState[color= #339933;].[/color]FillMode [color= #339933;]=[/color] FillMode[color= #339933;].[/color]WireFrame[color= #339933;];[/color]
  142.  
  143. effect[color= #339933;].[/color]CurrentTechnique [color= #339933;]=[/color] effect[color= #339933;].[/color]Techniques[color= #009900;][[/color][color= #0000ff;]"Colored"[/color][color= #009900;]][/color][color= #339933;];[/color]
  144. effect[color= #339933;].[/color]Parameters[color= #009900;][[/color][color= #0000ff;]"xView"[/color][color= #009900;]][/color][color= #339933;].[/color]SetValue[color= #009900;]([/color]viewMatrix[color= #009900;])[/color][color= #339933;];[/color]
  145. effect[color= #339933;].[/color]Parameters[color= #009900;][[/color][color= #0000ff;]"xProjection"[/color][color= #009900;]][/color][color= #339933;].[/color]SetValue[color= #009900;]([/color]projectionMatrix[color= #009900;])[/color][color= #339933;];[/color]
  146. effect[color= #339933;].[/color]Parameters[color= #009900;][[/color][color= #0000ff;]"xWorld"[/color][color= #009900;]][/color][color= #339933;].[/color]SetValue[color= #009900;]([/color]Matrix[color= #339933;].[/color]Identity[color= #009900;])[/color][color= #339933;];[/color]
  147.  
  148. effect[color= #339933;].[/color]Begin[color= #009900;]([/color][color= #009900;])[/color][color= #339933;];[/color]
  149. [color= #b1b100;]foreach[/color] [color= #009900;]([/color]EffectPass pass in effect[color= #339933;].[/color]CurrentTechnique[color= #339933;].[/color]Passes[color= #009900;])[/color]
  150. [color= #009900;]{[/color]
  151. pass[color= #339933;].[/color]Begin[color= #009900;]([/color][color= #009900;])[/color][color= #339933;];[/color]
  152.  
  153. device[color= #339933;].[/color]VertexDeclaration [color= #339933;]=[/color] myVertexDeclaration[color= #339933;];[/color]
  154. device[color= #339933;].[/color]DrawUserIndexedPrimitives[color= #009900;]([/color]PrimitiveType[color= #339933;].[/color]TriangleList[color= #339933;],[/color] vertices[color= #339933;],[/color] [color= #cc66cc;]0[/color][color= #339933;],[/color] vert
    ices[color= #339933;].[/color]Length[color= #339933;],[/color] indices[color= #339933;],[/color] [color= #cc66cc;]0[/color][color= #339933;],[/color] indices[color= #339933;].[/color]Length [color= #339933;]/[/color] [color= #cc66cc;]3[/color][color= #009900;])[/color][color= #339933;];[/color]
  155.  
  156. pass[color= #339933;].[/color][color= #990000;]End[/color][color= #009900;]([/color][color= #009900;])[/color][color= #339933;];[/color]
  157. [color= #009900;]}[/color]
  158. effect[color= #339933;].[/color][color= #990000;]End[/color][color= #009900;]([/color][color= #009900;])[/color][color= #339933;];[/color]
  159.  
  160. base[color= #339933;].[/color]Draw[color= #009900;]([/color]gameTime[color= #009900;])[/color][color= #339933;];[/color]
  161. [color= #009900;]}[/color]
  162. [color= #009900;]}[/color]
  163. [color= #009900;]}[/color]
  164.  
  165.  

تم تعديل بواسطه *خلدون خالد*
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

درس دسم، وقد تحتاج لقراءة بعض أجزاءه أكثر من مره لكي تتمكن من فهمها :mellow:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
درس دسم، وقد تحتاج لقراءة بعض أجزاءه أكثر من مره لكي تتمكن من فهمها

أولا بارك الله فيك على استمرارك في الترجمة ..

نعم الدرس دسم .. هذه الفكرة طبعاً ليست خاصة في XNA موجودة حتى في OpenGL و Direct3D .. الصعوبة هي في اختيار الـ index المناسب.. لكن ما أقوم به شخصياً .. هو نسخ المعادلات كما هي .. لايجب أن أفهم كيف تم استنتاج هذه المعادلات .. حاولت أن أفعل ذلك سابقاً .. ولكن لم أنجح .

الموقع الاصلي لايوفر المشروع كامل .. حتى يسهل تطبيقه للكسالى مثلي :-) .. يمكن للاخوان الذين يقومون بتطبيق المثال كما هو , رفعه للمساعدة ..

تم تعديل بواسطه الشمري
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

شكرا لك على الإهتمام أخ شمري

نعم الدرس دسم .. هذه الفكرة طبعاً ليست خاصة في XNA موجودة حتى في OpenGL و Direct3D .. الصعوبة هي في اختيار الـ index المناسب.. لكن ما أقوم به شخصياً .. هو نسخ المعادلات كما هي .. لايجب أن أفهم كيف تم استنتاج هذه المعادلات .. حاولت أن أفعل ذلك سابقاً .. ولكن لم أنجح .

فعلا و بالأصل هذه الفكره مستوحاه من الرياضيات المتقطعة، لها علاقه بال Graphs و المجموعات على ما أذكر..

الموقع الاصلي لايوفر المشروع كامل .. حتى يسهل تطبيقه للكسالى مثلي :-) .. يمكن للاخوان الذين يقومون بتطبيق المثال كما هو , رفعه للمساعدة ..

بإمكانك تطبيقة بسهولة، كل ما عليك أن تعمله هو أن تقوم بإنشاء مشروع جديد كما هو مشروح في الدرس الأول بالضبط (لكي لا يختلف ال namespace و غيره) و بعدها في كل درس كل ما عليك أن تقوم بنسخ كود الدرس كاملا و تستبدله مكان كود المشروع كاملا، و بعدها تقوم بالتشغيل :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .