kldoon

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

1 مشاركة في هذا الموضوع

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

الدرس الخامس

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

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

 private float angle = 0f;

الآن، يجب علينا زيادة هذا المتغير بقيمة 0.005f في كل إطار. الدالة Update هي المكان الأمثل لوضع هذا الكود، بما أنه يتم إستدعائها 60 مره في كل ثانية:

 angle += 0.005f;

الآن و بما أن الزاوية تزداد بشكل تلقائي، كل ما نحتاجه هو أن نقوم بعمل تدوير لنظام الإحداثيات. أرجو أنك ما زلت تذكر من حصص الرياضيات أن هذا يتم بإستخدام مصفوفات التحويل :) لحسن الحظ، كل ما تحتاج لعمله هو أن تحدد محور التدوير و زاوية الدوران. كل الباقي يتم عمله بواسطة ال XNA!

التدوير يتم تخزينه في ما يسمى مصفوفة العالم، في مصفوفة بإسم worldMatrix. قم بإضافة الكود التالي إلى الدالة Draw، قبل إستدعاء ال effect.Begin:

 Matrix worldMatrix = Matrix.CreateRotationY(3 * angle);
effect.Parameters["xWorld"].SetValue(worldMatrix);

السطر الأول يقوم بإنشاء مصفوفة العالم، التي تحتوي على التدوير حول محور Y. السطر الثاني يقوم بتمرير مصفوفة العالم إلى التأثير “effect”، التي تحتاجها لإتمام العمل. من الآن فصاعدا، كل شيئ سوف نقوم برسمه سوف يتم تدويره حول محور Y بالقيمة المخزنة حاليا في المتغير ‘angle’!

عندما تقوم بتشغيل البرنامج، سوف ترى أن المثلث يدور حول النقطة (0,0,0)! هذا بالتأكيد بسبب أن محور Y يمر من هذه النقطة، لذا النقطة (0,0,0) هي النقطة الوحيدة في المثلث التي تبقى كما هي. الآن تخيل أننا نريد أن نجعل المثلث يدور حول مركزه. أحد الإحتمالات هي من خلال إعادة تعريف المثلث بحيث نجعل النقطة (0,0,0) هي مركز المثلث. الحل الأفضل هو من خلال تحريك (= نقل “Translate”) المثلث قليلا إلى اليسار و إلى الأسفل، و بعدها تدويره. لعمل ذلك، ببساطة قم أولا بضرب مصفوفة العالم بمصفوفة النقل:

 Matrix worldMatrix = Matrix.CreateTranslation(-20.0f/3.0f, -10.0f / 3.0f, 0) * Matrix.CreateRotationZ(angle);

هذا سوف يحرك المثلث بحيث يصبح مركزه في نقطة الأصل الخاصة بالعالم (0,0,0). بعدها يتم تدوير المثلث حول تلك النقطة، على محور Z، ما يعطينا النتيجة المطلوبة.

لاحظ ترتيب العمليات. حاول وضع عملية النقل بعد عملية التدوير. سوف تلاحظ أن المثلث أصبح يدور حول نقطة واحدة، و يتحرك لليسار و الأسفل. سبب ذلك أن في ضرب المصفوفات M1*M2 لا يساوي M2*M1!.

بإمكانك ببساطة تغيير الكود بحيث يصبح المثلث يدور حول محور X أو محور Y. تذكر أن أحدى نقاط المثلث لدينا قيمة إحدائي Z الخاص بها هو -5، و هو ما يفسر عدم دوران المثلث بشكل متماثل في بعض الأحيان.

شيئ أعقد قليلا هو مصفوفة CreateFromAxisAngle، حيث يكون بإستطاعتك أن تحدد محور التدوير الخاص بك:

 Vector3 rotAxis = new Vector3(3*angle, angle, 2*angle);
rotAxis.Normalize();
Matrix worldMatrix = Matrix.CreateTranslation(-20.0f/3.0f, -10.0f / 3.0f, 0) * Matrix.CreateFromAxisAngle(rotAxis, angle);

هذا سوف يتيح لنا تدوير المثلث حول محور قابل للتغيير في أي وقت. السطر الأول يحدد المحور (الذي يتغير في كل إطار لأنه يعتمد على المتغير angle). السطر الثاني يقوم بعمل تطبيع “Normalization” للمحور، حيث يلزم لكي تعمل الدالة CreateFromAxisAngle بشكل صحيح (الدالة Normalize() تقوم بتغيير إحداثيات المتجه، بحيث تصبح المسافة بين المحور و النقطة (0,0,0) تساوي 1 بالضبط).

post-133895-1248270168_thumb.jpg

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

•حاول تدوير المثلث بزاوية 180 درجة حول الضلع السفلي له.

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

Learn3D_Xna_S1L5.pdf

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

انسخ الكود
  1. using System;
  2. using System.[color= #202020;]Collections[/color].[color= #202020;]Generic[/color];
  3. using Microsoft.[color= #202020;]Xna[/color].[color= #202020;]Framework[/color];
  4. using Microsoft.[color= #202020;]Xna[/color].[color= #202020;]Framework[/color].[color= #202020;]Audio[/color];
  5. using Microsoft.[color= #202020;]Xna[/color].[color= #202020;]Framework[/color].[color= #202020;]Content[/color];
  6. using Microsoft.[color= #202020;]Xna[/color].[color= #202020;]Framework[/color].[color= #202020;]GamerServices[/color];
  7. using Microsoft.[color= #202020;]Xna[/color].[color= #202020;]Framework[/color].[color= #202020;]Graphics[/color];
  8. using Microsoft.[color= #202020;]Xna[/color].[color= #202020;]Framework[/color].[color= #202020;]Input[/color];
  9. using Microsoft.[color= #202020;]Xna[/color].[color= #202020;]Framework[/color].[color= #202020;]Net[/color];
  10. using Microsoft.[color= #202020;]Xna[/color].[color= #202020;]Framework[/color].[color= #202020;]Storage[/color];
  11.  
  12. namespace XNAtutorial
  13. [color= #009900;]{[/color]
  14. public class Game1 [color= #339933;]:[/color] Microsoft.[color= #202020;]Xna[/color].[color= #202020;]Framework[/color].[color= #202020;]Game[/color]
  15. [color= #009900;]{[/color]
  16. GraphicsDeviceManager graphics;
  17. SpriteBatch spriteBatch;
  18. GraphicsDevice device;
  19. Effect effect;
  20. VertexPositionColor[color= #009900;][[/color][color= #009900;]][/color] vertices;
  21. VertexDeclaration myVertexDeclaration;
  22.  
  23. Matrix viewMatrix;
  24. Matrix projectionMatrix;
  25.  
  26. private [color= #993333;]float[/color] angle [color= #339933;]=[/color] 0f;
  27.  
  28. public Game1[color= #009900;]([/color][color= #009900;])[/color]
  29. [color= #009900;]{[/color]
  30. graphics [color= #339933;]=[/color] new GraphicsDeviceManager[color= #009900;]([/color]this[color= #009900;])[/color];
  31. Content.[color= #202020;]RootDirectory[/color] [color= #339933;]=[/color] [color= #ff0000;]"Content"[/color];
  32. [color= #009900;]}[/color]
  33.  
  34. protected override [color= #993333;]void[/color] Initialize[color= #009900;]([/color][color= #009900;])[/color]
  35. [color= #009900;]{[/color]
  36. graphics.[color= #202020;]PreferredBackBufferWidth[/color] [color= #339933;]=[/color] [color= #cc66cc;]500[/color];
  37. graphics.[color= #202020;]PreferredBackBufferHeight[/color] [color= #339933;]=[/color] [color= #cc66cc;]500[/color];
  38. graphics.[color= #202020;]IsFullScreen[/color] [color= #339933;]=[/color] [color= #000000; font-weight: bold;]false[/color];
  39. graphics.[color= #202020;]ApplyChanges[/color][color= #009900;]([/color][color= #009900;])[/color];
  40. Window.[color= #202020;]Title[/color] [color= #339933;]=[/color] [color= #ff0000;]"Riemer's XNA Tutorials -- Series 1"[/color];
  41.  
  42. base.[color= #202020;]Initialize[/color][color= #009900;]([/color][color= #009900;])[/color];
  43. [color= #009900;]}[/color]
  44.  
  45. protected override [color= #993333;]void[/color] LoadContent[color= #009900;]([/color][color= #009900;])[/color]
  46. [color= #009900;]{[/color]
  47. device [color= #339933;]=[/color] graphics.[color= #202020;]GraphicsDevice[/color];
  48. spriteBatch [color= #339933;]=[/color] new SpriteBatch[color= #009900;]([/color]GraphicsDevice[color= #009900;])[/color];
  49.  
  50. effect [color= #339933;]=[/color] Content.[color= #202020;]Load[/color]<Effect> [color= #009900;]([/color][color= #ff0000;]"effects"[/color][color= #009900;])[/color];
  51. SetUpVertices[color= #009900;]([/color][color= #009900;])[/color];
  52. SetUpCamera[color= #009900;]([/color][color= #009900;])[/color];
  53. [color= #009900;]}[/color]
  54.  
  55. private [color= #993333;]void[/color] SetUpVertices[color= #009900;]([/color][color= #009900;])[/color]
  56. [color= #009900;]{[/color]
  57. vertices [color= #339933;]=[/color] new VertexPositionColor[color= #009900;][[/color][color= #cc66cc;]3[/color][color= #009900;]][/color];
  58.  
  59. vertices[color= #009900;][[/color][color= #cc66cc;]0[/color][color= #009900;]][/color].[color= #202020;]Position[/color] [color= #339933;]=[/color] new Vector3[color= #009900;]([/color]0f, 0f, 0f[color= #009900;])[/color];
  60. vertices[color= #009900;][[/color][color= #cc66cc;]0[/color][color= #009900;]][/color].[color= #202020;]Color[/color] [color= #339933;]=[/color] Color.[color= #202020;]Red[/color];
  61. vertices[color= #009900;][[/color][color= #cc66cc;]1[/color][color= #009900;]][/color].[color= #202020;]Position[/color] [color= #339933;]=[/color] new Vector3[color= #009900;]([/color]10f, 10f, 0f[color= #009900;])[/color];
  62. vertices[color= #009900;][[/color][color= #cc66cc;]1[/color][color= #009900;]][/color].[color= #202020;]Color[/color] [color= #339933;]=[/color] Color.[color= #202020;]Yellow[/color];
  63. vertices[color= #009900;][[/color][color= #cc66cc;]2[/color][color= #009900;]][/color].[color= #202020;]Position[/color] [color= #339933;]=[/color] new Vector3[color= #009900;]([/color]10f, 0f, [color= #339933;]-[/color]5f[color= #009900;])[/color];
  64. vertices[color= #009900;][[/color][color= #cc66cc;]2[/color][color= #009900;]][/color].[color= #202020;]Color[/color] [color= #339933;]=[/color] Color.[color= #202020;]Green[/color];
  65.  
  66. myVertexDeclaration [color= #339933;]=[/color] new VertexDeclaration[color= #009900;]([/color]device, VertexPositionColor.[color= #202020;]VertexEleme
    nts[/color][color= #009900;])[/color];
  67. [color= #009900;]}[/color]
  68.  
  69. private [color= #993333;]void[/color] SetUpCamera[color= #009900;]([/color][color= #009900;])[/color]
  70. [color= #009900;]{[/color]
  71. viewMatrix [color= #339933;]=[/color] Matrix.[color= #202020;]CreateLookAt[/color][color= #009900;]([/color]new Vector3[color= #009900;]([/color][color= #cc66cc;]0[/color], [color= #cc66cc;]0[/color], [color= #cc66cc;]50[/color][color= #009900;])[/color], new Vector3[color= #009900;]([/color][color= #cc66cc;]0[/color], [color= #cc66cc;]0[/color], [color= #cc66cc;]0[/color][color= #009900;])[/color], new V
    ector3[color= #009900;]([/color][color= #cc66cc;]0[/color], [color= #cc66cc;]1[/color], [color= #cc66cc;]0[/color][color= #009900;])[/color][color= #009900;])[/color];
  72. projectionMatrix [color= #339933;]=[/color] Matrix.[color= #202020;]CreatePerspectiveFieldOfView[/color][color= #009900;]([/color]MathHelper.[color= #202020;]PiOver4[/color], device.[color= #202020;]V
    iewport[/color].[color= #202020;]AspectRatio[/color], [color= #cc66cc;]1[/color].0f, [color= #cc66cc;]300[/color].0f[color= #009900;])[/color];
  73. [color= #009900;]}[/color]
  74.  
  75. protected override [color= #993333;]void[/color] UnloadContent[color= #009900;]([/color][color= #009900;])[/color]
  76. [color= #009900;]{[/color]
  77. [color= #009900;]}[/color]
  78.  
  79. protected override [color= #993333;]void[/color] Update[color= #009900;]([/color]GameTime gameTime[color= #009900;])[/color]
  80. [color= #009900;]{[/color]
  81. [color= #b1b100;]if[/color] [color= #009900;]([/color]GamePad.[color= #202020;]GetState[/color][color= #009900;]([/color]PlayerIndex.[color= #202020;]One[/color][color= #009900;])[/color].[color= #202020;]Buttons[/color].[color= #202020;]Back[/color] [color= #339933;]==[/color] ButtonState.[color= #202020;]Pressed[/color][color= #009900;])[/color]
  82. this.[color= #202020;]Exit[/color][color= #009900;]([/color][color= #009900;])[/color];
  83.  
  84.  
  85. angle [color= #339933;]+=[/color] [color= #cc66cc;]0[/color].005f;
  86.  
  87. base.[color= #202020;]Update[/color][color= #009900;]([/color]gameTime[color= #009900;])[/color];
  88. [color= #009900;]}[/color]
  89.  
  90. protected override [color= #993333;]void[/color] Draw[color= #009900;]([/color]GameTime gameTime[color= #009900;])[/color]
  91. [color= #009900;]{[/color]
  92. device.[color= #202020;]Clear[/color][color= #009900;]([/color]Color.[color= #202020;]DarkSlateBlue[/color][color= #009900;])[/color];
  93. device.[color= #202020;]RenderState[/color].[color= #202020;]CullMode[/color] [color= #339933;]=[/color] CullMode.[color= #202020;]None[/color];
  94.  
  95. Vector3 rotAxis [color= #339933;]=[/color] new Vector3[color= #009900;]([/color][color= #cc66cc;]3[/color] [color= #339933;]*[/color] angle, angle, [color= #cc66cc;]2[/color] [color= #339933;]*[/color] angle[color= #009900;])[/color];
  96. rotAxis.[color= #202020;]Normalize[/color][color= #009900;]([/color][color= #009900;])[/color];
  97. Matrix worldMatrix [color= #339933;]=[/color] Matrix.[color= #202020;]CreateTranslation[/color][color= #009900;]([/color][color= #cc66cc;]-20[/color].0f[color= #339933;]/[/color][color= #cc66cc;]3[/color].0f, [color= #cc66cc;]-10[/color].0f [color= #339933;]/[/color] [color= #cc66cc;]3[/color].0f, [color= #cc66cc;]0[/color][color= #009900;])[/color] [color= #339933;]*[/color] Mat
    rix.[color= #202020;]CreateFromAxisAngle[/color][color= #009900;]([/color]rotAxis, angle[color= #009900;])[/color];
  98.  
  99. effect.[color= #202020;]CurrentTechnique[/color] [color= #339933;]=[/color] effect.[color= #202020;]Techniques[/color][color= #009900;][[/color][color= #ff0000;]"Colored"[/color][color= #009900;]][/color];
  100. effect.[color= #202020;]Parameters[/color][color= #009900;][[/color][color= #ff0000;]"xView"[/color][color= #009900;]][/color].[color= #202020;]SetValue[/color][color= #009900;]([/color]viewMatrix[color= #009900;])[/color];
  101. effect.[color= #202020;]Parameters[/color][color= #009900;][[/color][color= #ff0000;]"xProjection"[/color][color= #009900;]][/color].[color= #202020;]SetValue[/color][color= #009900;]([/color]projectionMatrix[color= #009900;])[/color];
  102. effect.[color= #202020;]Parameters[/color][color= #009900;][[/color][color= #ff0000;]"xWorld"[/color][color= #009900;]][/color].[color= #202020;]SetValue[/color][color= #009900;]([/color]worldMatrix[color= #009900;])[/color];
  103.  
  104. effect.[color= #202020;]Begin[/color][color= #009900;]([/color][color= #009900;])[/color];
  105. foreach [color= #009900;]([/color]EffectPass pass in effect.[color= #202020;]CurrentTechnique[/color].[color= #202020;]Passes[/color][color= #009900;])[/color]
  106. [color= #009900;]{[/color]
  107. pass.[color= #202020;]Begin[/color][color= #009900;]([/color][color= #009900;])[/color];
  108.  
  109. device.[color= #202020;]VertexDeclaration[/color] [color= #339933;]=[/color] myVertexDeclaration;
  110. device.[color= #202020;]DrawUserPrimitives[/color][color= #009900;]([/color]PrimitiveType.[color= #202020;]TriangleList[/color], vertices, [color= #cc66cc;]0[/color], [color= #cc66cc;]1[/color][color= #009900;])[/color];
  111.  
  112. pass.[color= #202020;]End[/color][color= #009900;]([/color][color= #009900;])[/color];
  113. [color= #009900;]}[/color]
  114. effect.[color= #202020;]End[/color][color= #009900;]([/color][color= #009900;])[/color];
  115.  
  116. base.[color= #202020;]Draw[/color][color= #009900;]([/color]gameTime[color= #009900;])[/color];
  117. [color= #009900;]}[/color]
  118. [color= #009900;]}[/color]
  119. [color= #009900;]}[/color]
  120.  

1

شارك هذا الرد


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

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

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



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

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

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