شرح الكلام السابق بإختصار هو
في التطبيقات العادية التي لاتحتوي على اي محاكاة فيزيائية مثل الالعاب ثلاثية الابعاد فأنت تملك العديد من المجسمات منها الشخصيات والسيارات والاسلحة حتى الاشجار والصخور وغيرها
كل هذا نسمية العالم المرئي .. أما في العالم الفيزيائي او الساكند ورلد فإنك تحتاج الى محاكاة لنظم الفيزياء في عالمك المرئي
فمثلا لو دلينا مكعب او مجسم لابريق الشاي وتريده أن يسقط ،في الدارك بيسيك ربما ستستخدم انيميشن قد صنعته مسبقا أو حتى ستستخدم المتغيرات او الاوامر مثلا امر move object down
في الحقيقة سينزل الاوبجكت وكأنه مصعد ولن يؤثر عليه اي مجسم خارجي حتى لو لمسه
لكن في نظام الفيزياء فانت لن تستخدم الامر السابق بل ستستخدم اوامر اخرى خاصة بالنيوتن وطبعا ستستخدم القوى والتي سبق شرحها
او ربما تأثير الجاذبية وان كنت تريد دفع مجسم فكلها ستستخدم مهارة مستقله وسيكون الامر جديد بالنسبة لك في اول الامر
سأشرح الاشكال اولا بعون الله
لو كان لديك مجسم لكرة قدم وتحتاج وضعها في الدارك بيسيك وتعريف النظام الفيزيائي لها
طبعا ستقوم بتحميل المجسم في الذاكرة مع النسيج Texture الخاص بكرة القدم هكذا انت عرفت العالم المرئي
الشكل : كرة - النوع:كرة قدم - النسيج: نسيج كرة القدم "المخمسات"
الان انت بحاجة الى تعريف النظام الفيزيائي لهذه الكرة
ستقوم باعطاء امر - سيتم شرحه لاحقاً إن شاء الله - لتعريف او عمل ربط بين الشكل المرئي والشكل الخاص بالتصادم
مثلا لو لديك كره عند انشائك لها في الدارك بيسيك فربما تستخدم الامر
make object sphere
او تقوم بتحميلها من جهازك
وفي النيوتن ستستخدم الامر
Col = NDB_NewtonCreateSphere( s# )
الان انت عرفت العالم المرئي والعالم الفيزيائي
ملاحظة : الحاسب لايعرف ماهي الاشكال التي تستخدمها فيمكنك مثلا ان تصنع مكعب في العالم المرئي وتطبق عليه سلوك او شكل الكرة
فيهيئ لك ان المكعب كرة وسيدور مثل الكرة مع العلم ان المكعب به حواف ولكن لوطبقتها عليه ستجد حركة ناعمة كانها كرة تتحرك
وهكذا مع باقي الاشكال والتي تم ذكرها سابقا
يوجد شكل يسمى Convex Hull هذا الكونفكس يتعامل مع الاشكال المعقدة فمثلا لو لديك ابريق شاي او نجمة او كان هذا الشكل فانت لن تستخدم الاشكال السابقة (مكعب - كرة ..الخ)
بل تحتاج الى تركيب معقد ..يتيح لك النيوتن امكانية عمل هذه الاشكال وتسمى convex hull
ببساطة لو قلنا ان لديك ابريق شاي فالكونفكس هول سيقوم بتغليف هذا الابريق وليس حمل نفس الشكل بل كشكل التغليف الورقي او البلاستيكي .
المصطلحات الاساسية
هذه هي المصطلحات الاساسية والتي يجب معرفتها للتعامل مع المحرك
Body
المجسم وهو كتعريف او اي دي مستقل عن المجسم في العالم المرئي
مثلا لو لديك مجسم كرة في العالم المرئي والاي دي الخاص به هو 1 فهذا لايعني بالضرورة ان المجسم في العالم فيزيائي يحمل نفس الرقم قد يكون 2 او ايا يكن
ويسمى عادةً بـ Rigid body الاجسام الجامدة او الصلبة
Object
وهو الشكل المرئي عكس body الشكل الفيزيائي
Vector
المتجه ويحمل 3 قيم للمحاور الثلاثة XYZ
Matrix
المصفوفة : (في العادة تكون 16) وهي ارقام تحمل وصف للموقع والدوران والحجم في الفراغ الثلاثي الابعاد
Mass
كتلة المجسم "الحجم"
MOMENT OF INERTIA
عزم القصور الذاتي : رقم يصف مدى التناوب على محور محدد
الاعدادات الاولية
قبل البدئ في وضع الاوامر الخاصة بالمحرك فلابد من اعطاء الدارك بيسيك امر ببدئ عمل محرك النيوتن
من خلال الامر السابق انت قد بدأت في الخطوة الاولى وسيبدأ المحرك في العمل
الان يجب عليك تعريف مدى المحيط او مدى الاتساع او الفراغ الذي سيتم فيه محاكاة الفيزياء
عند عدم وضعك للتعريف التالي فان النيوتن تلقائياً سيعرف نفسه بمساحة محددة من -100 الى +100 لكل المحاور
كود:
NDB_SetVector 1, -1000.0, -500.0, -1000.0
كود:
NDB_SetVector 2, 1000.0, 500.0, 1000.0
NDB_NewtonSetWorldSize
لاحظ انك لن تعطي القيم مباشرة للامر بل تحتاج الى وضع متجه مؤقت temp vector
وكما ذكرت فانه سيحمل 3 قيم مع رقم او اي دي للمتجة المؤقت
الان تعريف الجاذبية
كود:
NDB_SetVector 0.0, -50.0, 0.0
NDB_SetStandardGravity
لاحظ ان قيم الجاذبية للثلاثة محاور فيمكنك عمل جاذبية لمحرو x او محور y او محور z
فبلا من الجذب للاسفل يمكن ان يكون للاعلى او اليمين او الامام ...الخ
الان بعد التعريفات الاساسية السابقة يتطلب منك تعريف التوقيت
كود:
time# = NDB_GetElapsedTimeInSec()
time# = NDB_GetElapsedTimeInSec()
قمنا بوضع الامر السابق مرتين لنحصل على توقيت صغير مناسب
كود:
do
time# = NDB_GetElapsedTimeInSec()
if GO = 1 then NDB_NewtonUpdate time#
الان فكرة الامر السابق هو التثبيت فمثلا لو كانت قيمة GO تساوي واحد فان المحرك سيعمل وان كانت تساوي صفر فان المحرك سيتوقف مؤقتاً مثلا
يجب انهاء البرنامج بالامر التالي ووضعه في اخر سطر
كود:
function NeverCalled()
كود:
if memblock exist(1) then delete memblock 1
endfunction
عملية البناء
لبناء مجسم في الدارك بيسيك فانت ستعطيه القيم الخاصة بالموقع والدوران والحجم
مثال
object position objID,x,y,z
rotate object objID,x,y,z
scale object objID,x,y,z
اما في النيوتن يسمى Matrix اي مصفوفة
لابد من كتابة الامر كالتالي
كود:
NDB_BuildMatrix rx#, ry#, rz#, x#, y#, z#
NDB_NewtonBodySetMatrix Body
اولا تبني مصفوفة وبعدها تقوم بتطبيق قيمها على المجسم
rx#, ry#, rz#
خاصة بزوايا المجسم
اختصار يعني rotationX ...etc
x#, y#, z
خاصة بموقع المجسم
طبعا الاولوية للدوران وبعدها الموقع
انشاء مجسم
كود:
Col = NDB_NewtonCreateBox(sx#, sy#, sz#)
col اختصار لـ collision تعني تصادم
الان انت انشأت صندوق او شكل تصادمي للصندوق الخاص بالعالم المرئي
كود:
Body = NDB_NewtonCreateBody(Col)
قمنا بتعريف body لشكل الصندوق
بناء المصفوفة
كود:
NDB_BuildMatrix rx#, ry#, rz#, x#, y#, z#
NDB_NewtonBodySetMatrix Body
بناء الكتلة
كود:
NDB_CalculateMIBoxSolid mass#, sx#, sy#, sz#
NDB_NewtonBodySetMassMatrix Body, mass#
الان انت قمت بتعريف حجم المجسم وكتلته
sx,sy,sz هي للمحاور الثلاثة الخاصة بالحجم
والـ mass# هي قيمة الكتلة التي تريدها
كود:
NDB_NewtonReleaseCollision Col
هذا الامر يمكن فهمه وكأننا قلنا انتهينا من تعريف التصادم
يأتي الان دور الربط بين الشكل والتصادم
كود:
make object box obj,sx#,sy#,sz#
كود:
scale object obj, sx#*100.0, sy#*100.0, sz#*100.0
position object obj, x#, y#, z#
rotate object obj, rx#, ry#, rz#
الان قمنا بانشاء مجسم لصندوق
كود:
NDB_BodySetDBProData Body, obj
الكود السابق هو احد الخطوات المهمة وهو اخبار بالرابر بربط المجسم المرئي بالمجسم الفيزيائي
وسيقوم النيوتن بتدوير وتدوير المجسم اوتوماتيكياً
والان مع الربط النهائي
كود:
NDB_NewtonBodySetDestructorCallback Body
الان مع الجاذبية للمجسم
كود:
NDB_BodySetGravity Body, 1
flaq =1 يعني ان معيار الجاذبية الاساسية ستطبق عليه
flaq =0 يعني لا
ويمكن تغييرها في اي وقت
القوى:
كما ذكرنا سابقا عندما تريد تحريك او تدوير مجسم ما او التعامل معه او التحكم به بصفة عامة فانت ستطبق عليه القوى كما في الواقع لتحصل على واقعية فيزيائية
وفي الفيزياء هناك عدة اشياء اطبق على المجسم الكتلة mass - السرعة velocity - الجاذبية Gravity
طبعا سيتغير سلوك المجسم عند تغييرك للقيم السابقة
لتطبيق القوى هناك خطويتين يمكن من خلال تصادم مجسم اخر يحمل قيم ومتجه معين ويصطدم بالمجسم الساكن
او عن طريق الوضع بالاوامر
يمكن استخدام امر السرعة مثلا:
كود:
NDB_NewtonBodySetVelocity body
مع الملاحظة يجب وضع متجه مؤقت قبل وضع الامر
وتكتب هكذا
كود:
NDB_SetVector 100.0, 0.0, 0.0
NDB_NewtonBodySetVelocity Car
نلاحظ الان ان المتجة المؤقت به ثلاث قيم قيمة تحمل الرقم 100 والقيمتين الاخرى تحمل 0
هذا يعني ان الجسم سيتحرك او ستطبق عليه القوة من خلال المحور x وسيندفع نحوه وهذه القوة قيمتها 100
يمكن استخدام الاوامر التالية ايضا للتحريك
كود:
NDB_BodyAddForceLocal
كود:
NDB_BodyAddForceGlobal
NDB_BodySetForceLocal
NDB_BodySetForceGlobal
التدوير
في التدوير فان الامر مختلف فمثلا لو اردت تدوير مجسم في الدارك بيسيك حتما ستسخدم الطريقة التقليدية
turn object left, pitch object up, roll object left
او
xrotate object obj,object angle x(obj)+5
لكن في الفيزياء يجب عليك استخدام خاصية مشابهة للعالم الواقعي مثل اللف
وكتابة هذا الامر كالتالي
كود:
NDB_NewtonBodySetOmega
اوميغا هي اخر الحروف الابجدية اليونانية ايضا كرمز للتدوير او اللف
الحقوق محفوظة عند نقلك للموضوع الرجاء ذكر المصدر والاسم
مع فائق احترامي وتقديري