المقالات العلمية

مقالات الشبكة العربية لمطوري الألعاب

الـ 3D وتطبيقات البحث العلمي

هذه المقالة محمية ضمن الحقوق الفكرية لشركة In|Framez Technology Corp.، ومرخصة للعرض فقط ضمن الشبكة العربية لمطوري الألعاب مع الموافقة الصريحة من المؤلف وشركة In|Framez Technology Corp.. لا يسمح بإعادة نشر هذه المقالة أو تعديلها دون الرجوع للمؤلف. يمنع النسخ والاقتباس دون ذكر المصدر والموافقة من المؤلف.

 

مقدمــة

هممم... الجرافيكس... الـ 3D... المؤثرات الخاصة... وغيرها من المصطلحات التي يكفي ذكرها أمام أي شخص ممن يمتكلون ثقافة العناوين لتجده يبدأ بالتحذلق بأسماء أفلام ومسلسلات أجنبية تحوي بعض الخدع البصرية وبالطبع إضافة إلى بطله المفضل أو ممثلته المفضلة والتي غالباً ما تكون هدفه الأول من متابعة الفلم. أمر مؤسف حقاً...

ولكن الأمر الأكثر أسفاً هو أنه حتى الأفراد الأكثر تعمقاً في هذه الأمور وخاصة الذين يعملون في مجالات الـ 3D المختلفة يعتبرون أن أنظمة وبرامج الـ 3D المختلفة صممت فقط للتطبيقات الفنية والترفيهية المختلفة كالأفلام والألعاب وغيرها. لاشك في أنها بالطبع مجالات واسعة وأساسية في استثمار هذه البرامج ولكنها ليست هي كل شيء... فإغفال الجانب العلمي بكافة مجالاته المختلفة (الطبية / الهندسية / ...) يعتبر إجحاف كبير بحق هذه الأنظمة وإهدار كبير للإمكانيات المتوفرة.

تماماً كمن يشتري جهاز كمبيوتر حديث مثلاً لسماع الموسيقى أو لعب الـ Solitaire أو الـ Minesweeper فقط! (بالمناسبة، أعرف بعض الأشخاص من هذا النوع وهم يعيشون ويمشون بيننا، تخيلوا ذلك!).


المهم الآن أننا سنحاول في هذه المقالة أن نسلط الضوء على بعض هذه التطبيقات الواسعة لأنظمة وبرامج الـ 3D كما أننا لن نقف عند هذا الحد بل سنجرب بأنفسنا من خلال مثال تطبيقي بسيط أحد هذه الاستثمارات.

 

الدجاجة والبيضة

إن العلاقة التي تربط بين وجود وتطور كل من العلوم الحديثة وأنظمة الـ 3D شبيهة جداً بأحجية الدجاجة والبيضة... من قبل الدجاجة أم البيضة؟ أو في حالتنا هذه، من يدفع الآخر للتطور؟؟؟ العلوم هي من تطور أنظمة الـ 3D أم هذه الأنظمة هي من يساهم في تطور العلوم؟


إن ازدواجية العلاقة هي المصطلح الدقيق الذي يصف العلاقة بين الجرافيكس أو الـ 3D عموماً والمجالات العلمية المختلفة. وهو أمر واضح وجلي في كثير من الأمثلة المعروفة. فلولا العلوم المختلفة مثل الرياضيات والفيزياء والهندسة ما ظهرت أنظمة الـ 3D، وأيضاً لولا مساهمة هذه الأنظمة ماتطورت هذه العلوم ووصلت إلى ما هي عليه. للتأكيد على الشق الأول من العلاقة لا داع لنذهب بعيداً... دعنا نلق نظرة بسيطة على مخابر أي جامعة أو شركة تحترم نفسها قليلاً وانظر كيف أن كل هذه المعادلات والرموز الرياضية تتحول الى حلول متقدمة في أنظمة الـ 3D المختلفة وبالتالي تساهم في تطويرها. إذا أردت أن تلقي نظرة أعمق، دعنا نعد بالزمن قليلاً للوراء لنلقي نظرة على بعض الأوراق العلمية الخاصة بالأخ "Lambert" ماذا سنجد؟ أوراق تحوي الكثير من الرسوم البيانية... رسوم أطفال!... -يبدو أنه كان يشعر بالملل هنا-... الكثير من المعادلات... ها... يبدو أن هذه الورقة تحوي شئ مفيد لأنها تحوي هذه المعادلة الصغيرة ضمن إطار مستطيل للدلالة على أهميتها... ولكن ما هي هذه المعادلة؟

C = N.L

هذه ببساطة هي المعادلة الأساسية المستخدمة في معظم خوارزميات تظليل السطوح في برامج الـ 3D المختلفة والتي يحفظها جميع طلاب هندسة الكمبيوتر والجرافيكس منذ نعومة أظفارهم.

يصف Lambert قيمة إضاءة السطح عند أي نقطة منه بالجداء الداخلي (Dot Product) للمتجه الناظم على السطح (Surface Normal Vector) مع متجه شعاع الضوء المسلط على السطح (Light Vector).


أتى فيما بعد أشخاص آخرون مثل (Phong و Blinn) وغيرهم قاموا بالإضافة إلى هذه المعادلة حدود أخرى لحساب اللمعات (Specular) على إضاءة السطوح الصقيلة. بالطبع لم يتم التوصل إلى كل هذه النتائج والمعادلات المستخدمة اليوم لولا الاعتماد على علوم الرياضيات والهندسة الفراغية. فلحساب أبسط الأمور مثل قيم المتجه الناظم (Normal Vector) أنت بحاجة للقيام بسلسلة من العمليات الرياضية التي يغلب عليها جبر المصفوفات.


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


حسناً... هذا بالنسبة للشق الأول من العلاقة. بالنسبة للشق الثاني فهو لا يقل تشعباً وأهمية عن الأول... حيث أن برامج و تطبيقات الـ 3D أصبحت تستخدم في عدد لانهائي من العلوم المختلفة. فمعظمنا مثلاً سمع عن مصطلح الـ (Medical Visualization) أو النمذجة الطبية والتي تعتمد على الـ (Volumetric Shaders) المتوفرة في معظم برامج الـ 3D وأنظمة الـ Render الحديثة والتي تمكن المختصين من معاينة أدق التفاصيل الداخلية بشكل مجسم وفوري.


كما لدينا في المجالات الهندسية المختلفة أنظمة المحاكاة (Simulation Systems) المتوفرة في معظم أنظمة الـ 3D والتي أصبحت من أهم الأدوات المستخدمة لمماثلة الدراسات والفرضيات الهندسية في الواقع الافتراضي أو في اختبار والتنبؤ بالنتائج قبل تطبيقها بشكل فعلي.

 
ماذا تريد أيضاً؟ مجال الفيزياء المجردة، الديناميك وحركة السوائل؟ كلها لم تنجُ أيضاً من تدخل أنظمة الـ 3D. حاول أن تلقي نظرة على برامج محاكاة السوائل (Computational Fluid Simulations).


إذن يمكننا باختصار أن نقول أن تطبيقات الـ 3D أصبحت تستخدم في معظم العلوم الحديثة ماعدا القليل منها كالطبخ مثلاُ...


ولكن السؤال هنا والذي يعيدنا لبداية الحديث، هو أنه لماذا لا نجد هذا الاهتمام والتقدم في هذه التطبيقات مقارنة بالتطبيقات الفنية والترفيهية المعهودة في البلاد العربية عموماً؟


الإجابة للأسف ليست بهذه السهولة. ولكن الملاحظ هنا أنه للتقدم بمثل هذه المجالات لايكفي أن يعتمد المرء على نفسه وعلى موهبته ليبدع أو يتقدم فيها كما الحال في التطبيقات الفنية أو الترفيهية. بل هنا نحن بحاجة لمناهج علمية متطورة تعملنا كيفية توظيف برامج الـ 3D المختلفة لتطوير الأبحاث العلمية. وللأسف هذا أحد الأمور الهامة التي نفتقدها في الجامعات المحلية -حتى الخاصة منها-.


خذ على سبيل المثال كلية العمارة في أي جامعة تحلو لك من الجامعات المحلية، ودعنا نقارن ما يتعلمه الطلاب من مناهج أو أدوات حديثة تساعدهم على البحث والتطوير مقارنة بما يتم تعليمه في بعض الجامعات الغربية. لا تشغل نفسك كثيراً بالبحث عن إجابة مقنعة. لأنه في أحسن الأحوال ستجدهم يخصصون لهم منهاج أو اثنين لتعليم أحد برامج الرسم الهندسي مثل (AutoCAD أو ArchiCAD) والتي أصبحت في هذا الزمان من الأدوات الأساسية والتي أصبح الجميع يتقنها بالضرورة مثل استخدام القلم والمسطرة ليتمكن من رسم مشاريعه.


الآن إذا انتقلنا في المكان قليلاً وأخذنا نفس المثال في أحد الجامعات الغربية التي لن أذكر أسمها -كي لا أتهم بالدعاية- سنجد مناهج ومخابر مخصصة لكي يستثمرها طلاب قسم العمارة والأقسام الأخرى لإجراء اختباراتهم وأبحاثهم ضمنها. فماذا كانت النتائج؟ سلسة من الأبحاث المثيرة التي قام بها طلاب قسم العمارة فيما يسمى بالعمارة الذكية (Intelligent Architecture)، والتي تعتمد على تطوير أفكار معمارية قابلة للبرمجة بلغات برمجة خاصة توظف إمكانيات الذكاء الصناعي في الكمبيوتر بحيث يتمكن من اقتراح حلول منطقية للعلاقات والفراغات المعمارية.


هذا بالطبع بالإضافة إلى المناهج التقليدية المخصصة لتعليم الطلاب كيفية استخدام أدوات التطوير المتقدمة في برامج الـ 3D المعروفة مثل Softimage و Maya للقيام باستخدامها في دراسة واختبار أفكارهم في الواقع الافتراضي (Virtual Reality) أو لإنشاء بيئات تفاعلية متكاملة (Interactive Environments).


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


لا أدري متى قرأت في أحد كتب الـ 3D المترجمة الذي لن أذكر أسمه بالطبع عن مصطلح "تحريك المحارف"! الذي اكتشفت فيما بعد أنه الترجمة المشوهة لمصطلح "Character Animation" والمقصود فيه بالطبع هو تحريك الشخصيات وليس المحارف!


حسناً... لا أريد أن استفيض أكثر بموضوع العقبات والمشاكل هذا لأنه شائك ومتشعب جداً. وبالمحصلة ما يهمنا نحن هو المحاولة دائماً وبذل كل ما بوسعنا للوصول إلى نتائج مرضية بغض النظر عن العقبات التي غالباً ما يهتم بالبحث ونقاشها من يريد التحجج بها.


لذلك سننتقل مباشرة إلى تطبيق مثال عملي في برامج الـ 3D للاستفادة منه في أحد التطبيقات العلمية.

 

الصندوق الأسود

سنقوم في مثالنا البسيط اليوم باستخدام أدوات التطوير المتوفرة في برامج الـ 3D لتطوير نظام بدائي يقوم باستخلاص المعلومات المخزنة في الصندوق الأسود الخاص بالطائرات للقيام بمحاكاة ثلاثية الأبعاد لحركة الطائرة إضافة للظروف المحيطة بها.


سنعتمد لتنفيذ هذا المثال على بيئة التطوير المتوفرة في الـ XSI إضافة للـ VB Script كلغة برمجة بسيطة لأتمتة المهمات. بالطبع يمكننا بشكل مماثل تطبيق نفس المفاهيم في البرامج الأخرى مع مراعاة اختلاف لغات البرمجة المتوفرة فيها والتي قمنا باختيار الـ XSI من بينها بسبب اعتماده على لغات scripting نظامية ومتنوعة مثل الـ VB Script والـ Jscript. بينما لا يوفر أي من الـ Maya أو الـ 3Ds MAX لغات برمجة معروفة لأتمتة المهمات حيث يعتمد كل منهم على اللغة الخاصة به (MEL في حال الـ Maya أوالـ MAX Script في حال الـ 3Ds MAX).


الآن بالنسبة للمعلومات المخزنة في الصندوق الأسود سنفترض أنها مخزنة بشكل رقمي بأي صيغة ملفات معروفة. ولسهولة التعامل سنفترض أنها مخزنة ضمن جداول في ملف Excel.


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


المهم سنقوم باستخدام ملف Excel وهمي يحوي معلومات افتراضية عن حركة الطائرة كالتالي:

في العمود الأول سيكون لدينا الفواصل الزمنية المستخدمة في تسجيل معلومات الملاحة الجوية. في العمود الثاني الى الرابع سيتم تخزين إحداثيات الطائرة. بينما في العمود الخامس الى السابع يمكننا إضافة أي معلومات خاصة مثل معلومات عن محركات الطائرة.


Blackbox data in Excel sheet

الآن بعد أن أصبحت المعلومات الخاصة بالطائرة جاهزة يمكننا البدء ببناء النظام المطلوب في الـ XSI.

الفكرة العامة لهذا النظام بسيطة جداً... كل ما يجب فعله هو جعل الـ XSI يقرء جميع القيم المتوفرة في ملف الـ Excel وتطبيقها على نموذج الطائرة المجسم الوجود في البرنامج بالاعتماد على الفواصل الزمنية المفروضة ثم بعد ذلك يمكننا اضافة أية خوارزميات إضافية عن الظروف الجوية المحيطة بالطائرة بالاعتماد على تطبيق معادلات هيدروليكية ولكن بشكلها العكسي وذلك على افتراض أن حركة الطائرة تتم ضمن وسط هيدروليكي وهو الهواء.


سأبدأ فوراً بكتابة الـ code في Visual Studio مع التعليق على الكتل البرمجية المختلفة ولكن دون الخوض بالتفاصيل البرمجية وذلك بسبب بساطة كل من الفكرة واللغة بحد ذاتها.


Visual Studio

بدايةً سنقوم بإنشاء مشهد جديد والحصول على النموذج المجسم للطائرة:

   1: ' start fresh
   2: NewScene
   3: SetDisplayMode "Camera", "shaded"
   4:  
   5: ' Create a light to illuminate the scene
   6: GetPrimLight "Point.Preset", "Point"
   7: Translate , .8, 13, 18
   8:  
   9: ' Create a plane object
  10: CreatePrim "Cube", "MeshSurface", "Airplane"

سنقوم هنا بربط ملف code إضافي "ExcelUpdate" وظيفته تحديث معلومات الطائرة ضمن الفواصل الزمنية المختلفة واستنتاج أي معلومات إضافية:

   1: ' set a script to run on each frame change
   2: SetValue "PlayControl.OnFrameChangeCommand", "ExcelUpdate"

هنا يمكننا بناء نظام إظهار النتائج الخاص بالطائرة:

   1: ' create a textual overlay
   2: CreateMeshText "CurveListToPlanarMeshForText",siPersistentOperation
   3:  
   4: ' set it to empty
   5: SetValue "text.text.text",
   6:          "_RTF_{\rtf1\ansi\deff0{\fonttbl{\f0\fnil\fcharset0 Arial;}}"
   7:          & vbCrLf & "\viewkind4\uc1\pard\lang1033\fs20\par" & vbCrLf & "}"
   8:          & vbCrLf & ""
   9:  
  10: ' set it to ignore lighting changes
  11: ApplyShader "Material\Constant"
  12:  
  13: ' set the color
  14: SetValue "polymsh.Material.Constant.color.green", 0
  15: SetValue "polymsh.Material.Constant.color.blue", 0
  16: SetValue "polymsh.Material.Constant.color.red", 1
  17:  
  18: ' position it
  19: Scale , .1747,.1747,.1747, siAbsolute, siLocalCOG, siObj, siXYZ
  20: Translate , -2.0698, -1.5466, 12.5455, siAbsolute, siGlobalCOG, siObj, siXYZ
  21:  
  22: ' connect it to the camera so it acts like a title
  23: SetUserPref "SI3D_CONSTRAINT_COMPENSATION_MODE", 1
  24: ApplyCns "Pose", "polymsh", "Camera", True
  25: SetUserPref "SI3D_CONSTRAINT_COMPENSATION_MODE", 0
  26: DeselectAll

الآن يمكننا البدء بفتح ملف الـ Excel ومعالجة محتوياته على الشكل التالي:

  • فتح نسخة (instance) من برنامج الـ Excel:
       1: ' Open Excel application instance…
       2: dim data
       3: set data = createobject("excel.application")
  • فتح جدول معلومات الطائرة:
       1: ' Open the spreadsheet
       2: data.workbooks.open("c:\blackboxdata.xls")
  • البحث عن بداية الأعمدة التي تحوي المعلومات:
       1: ' Columns where we find information
       2: DataStartRow = 6
       3:  
       4: timeColumn = "a"
       5: xColumn = "b"
       6: yColumn = "c"
       7: zColumn = "d"
       8: rColumn = "e"
       9: gColumn = "f"
      10: bColumn = "g"
  • على عدد الكوادر (Frames) المطلوبة اعتماداً على الفواصل الزمنية في الملف:
       1: ' Got to the start of the animation
       2: FirstFrame
       3:  
       4: ' get the number of frames of animation in the spreadsheet
       5: ExcelFrameCount = data.range("B2")
  • كل كادر في الـ XSI بمعلومات الصف المقابل له في الـ Excel:
       1: For i = 1 to ExcelFrameCount
       2:     ' map the current frame number to a row in Excel
       3:     FrameNumber = i + DataStartRow - 1
       4:  
       5:     xpos = data.range(xColumn & FrameNumber)
       6:     ypos = data.range(yColumn & FrameNumber)
       7:     zpos = data.range(zColumn & FrameNumber)
       8:  
       9:     translate "Airplane", xpos, ypos, zpos, siAbsolute, siGlobal
      10:     SaveKey "Airplane.kine.local.posx, Airplane.kine.local.posy, Airplane.kine.local.posz", i
      11:  
      12:     redChannel = data.range(   rColumn & FrameNumber)
      13:     greenChannel = data.range( gColumn & FrameNumber)
      14:     blueChannel = data.range(  bColumn & FrameNumber)
      15:  
      16:     SetKey "Airplane.Material.Constant.color.red", i, redChannel
      17:     SetKey "Airplane.Material.Constant.color.green", i, greenChannel
      18:     SetKey "Airplane.Material.Constant.color.blue", i, blueChannel
      19: next
      20:  
      21: ' close excel
      22: data.quit
      23: ' update the viewport
      24: SetValue "PlayControl.Current", 2
      25: PrevFrame

بعد الانتهاء من قراءة المعلومات من ملف الـ Excel ومحاكاة مسار حركة الطائرة في الـ XSI يمكننا الآن من إضافة أي خوارزميات في ملف الـ "ExcelUpdate" لحساب واستنتاج أي معلومات إضافية عن الظروف المحيطة بالطائرة.

 
لذلك سأقوم الآن في الـ Visual Studio بانشاء ملف vbs جديد باسم "ExcelUpdate" ولكنني لن أقوم هنا باستنتاج وبرمجة أية خوارزميات معقدة لأن هذا سيحتاج إلى مساحة أوسع من مجرد وريقات لشرح الأفكار الهيدروليكية ومن ثم تطبيقها في البرنامج. لذلك سأكتفي باستنتاج وتخريج معلومات وهمية يمكنك استبدالها بما تريد.

   1: Altitude = GetValue("Airplane.kine.local.posy", currentFrame)
   2: SetValue "text.text.text",
   3:          "_RTF_{\rtf1\ansi\deff0{\fonttbl{\f0\fnil\fcharset0 Arial;}}"
   4:          & vbCrLf & "\viewkind4\uc1\pard\lang1033\fs20 Altitude "
   5:          & Altitude & "\par" & vbCrLf & "}" & vbCrLf & ""

حسناً... يمكننا الآن اختبار هذا النظام الصغير في الـ XSI والاستمتاع بنتائج المحاكاة التي سنحصل عليها.


Airplane plotted simulation


للحصول على المزيد من المتعة يمكنك إضافة Rigid Bodies Simulation أو (محاكاة الأجسام الصلدة) للطائرة بعد تحديد جميع الخصائص الفيزيائية للطائرة اعتماداً على المعلومات المستنتجة للحصول على نظام متكامل لمحاكاة حركة الطائرة لحظة تحطمها بشكل دقيق.

 
بالطبع لا تتوقع أن تحصل على نتائج واقعية وذلك بسبب عدم دقة المعلومات المفترضة في البداية إضافة الى وجود عدد كبير من العوامل الهامة التي أهملناها في حساباتنا لسهولة العرض والتي تؤثر بشكل كبير على نتائج المحاكاة.


ولكن ما يهمنا من الموضوع في النهاية هو آلية العمل للنظام ككل الذي يمتلك مرونة التحسين والإضافة بالشكل الذي نراه مناسباً.


الآن وبعد أن انتهينا من تجريب هذا المثال أتمنى أن تكون فكرة استثمار الأمكانيات المختلفة في برامج الـ 3D التي بين أيدينا قد أصبحت ملموسة بحيث تكون خيارنا الأول في المجالات العلمية إضافة بالطبع إلى المجالات الفنية أو الترفيهية المعهودة.


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


أخيراً بقي أن أفي بوعدي وأذكر بعض المراجع العلمية الهامة للمهتمين بمثل هذه الأمور...

Advanced Animation & Rendering Techniques: Theory and Practice. By: Alan Watt & Mark Watt

 

إلى اللقاء...

أضف تعليقاً

Loading