الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

المحرك الفيزيائي العالمي Ageia Physx Engine ..في منتدانا

مغلق
بدأه Abdullah.Alshammeri في 25 أكتوبر 2007 · 19 رد · 11,085 مشاهدة · في قسم برمجة الألعاب و الرسوميات العام
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ..

المحرك الفيزيائي العالمي.. المجاني للمشاريع الغير تجارية .

http://www.ageia.com/

قم بالتسجيل لتحصل على نسختك من المحرك ..

الذي كان نتيجة لاندماج المحرك NovodoX الذي سبق ان تحدثنا عنه .. ومحرك فيزيائي اخر .

المحرك قوي ..ومستخدم مع Unreal Engine 3.0.. أكتفي بهذه الجملة .

فما رأيكم لو نحاول على الاقل تثبيت المكتبة بشكل صحيح .. وعمل عدة امثلة بدائية .

المشكلة ان كثيرا من الامثلة تعتمد على المحرك السابق Novodox بالرغم من ان المكتبة تم تحديثها .. بالتالي لن تعمل كثير من الامثلة ... ( لا ادري ان كان هذا قد تغير) ..

من استطاع تثبيت المكتبة بشكل صحيح ليساعدنا ( لم اكرر المحاولة من اكثر من سنة) ..

ومن لم يستطع الحصول على نسخة فبالامكان اضافة الرابط هنا .

هذه الخصائص

http://devsupport.ageia.com/ics/support/de...asp?deptID=1949

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#2

وعليكم السلام ورحمة الله وبركاته

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

هذه الحركات يمكن مشاهدتها في هذه الفيديوهات الموجودة هنا

فيديو

لكن أود السؤال هنا :

هل يمكن استعمال المحرك بدون وجود كرت خاص بالPhysiX ؟

أظنني حملت سابقا الSDK لكنني لم أستفد من شئ :lol:

أنا عن نفسي أفضل استعمال Newton أو ODE (للسهولة طبعا B) )

تم تعديل هذه المشاركة بواسطة DreamNet في 27 أكتوبر 2007 في 10:56

#3

ما معنى محرك فيزيائي؟؟

#4

في معظم الألعاب التي تحاول تجسيد الواقع نجد عدة عوامل يجب أخذها بالحسبان لجعلها تقارب الواقع

منها الجاذبية ,الرياح ,التصادم بين الأجسام ..

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

طبعا هذا تعريف عام فقط

والله أعلم

#5

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

يا شباب .... أزف اليكم بشرى سارة :

قمت البارحة بتثبيت المكتبة وتطبيق أول مثال فيزيائي ( باستخدام opengl للجرافكس )

معلومات عن المكتبة :

قبل أن أبدأ ... أنا لا زلت مبتدئ ولست مبتدأ .. لذلك كل ما أحوش أي معلومة سأضعها هنا ,

- المكتبة الفيزيائية ageia.. تعمل تحت الPC و xBox و Playstation 3 ...

- المكتبة تدعم الهاردوير ( حيث انها تستخدم كرت فيزيائي حسب ما قرأت) .. لذلك اذا كنت تملك هذا الكرت فانها ستستخدمه .. لذلك سيكون الاداء افضل .. ويخفف الحمل على الCPU ..

اما اذا كنت لا تملك الهاردوير اللازم .. فانها ستعمل تحت بيئة السوفتوير .. يعني المكتبة " بكل الاحوال " رح تشتغل :D .

- المكتبة تحتوي على عشرات الامثلة المفضلة بالشرح خطوة بخطوة .. وتمتملك ملف تعليمات ولا في الخيال .. مكتبة رائعة جدا جدا جدا ..

- المكتبة مجانية للاستعمالات الغير تجارية .

روابط التحميل :

ستحتاج الى ملفين .. الملف الاول هو ملفات dll لجميع نسخ المكتبة الفيزيائية .. لا اعرف ... هل هو مهم أو لا .. لكن اتوقع وبنسبة 90% أنه مهم...

لتحميله :

اذهب الى الصفحة الرئيسية :

http://www.ageia.com/

وانظر الى الزاوية اليسرى .. ستجد رابط للتحميل (( انتظر قليلا .. ليظهر لك . حيث أنه مصمم بالفلاش .. ) .

حجم الملف كبير .. حوالي 37 ميقا ... لكنه في زمن الدي اس ال .. يساوي 37 بايت !

(( تأكد من تحميل اخر نسخة )

ثم يجب أن تقوم بتحميل ال SDK وحجمه تقريبا 30 ميقا .. ولروعته .. فانك ستنسى هم 30 ميقا من التحميل في ظرف 30 ثانية .

لتحميل ال SDK .. يجب ان تسجل في الموقع وهذا بشكل مجاني .. :

سأضيف الروابط الاصلية ثم الفرعية .. وذلك لانه من الممكن تغيير الروابط الفرعية لاحقا !!!

اذهب الى هذه الصفحة ::

http://devsupport.ageia.com/ics/support/de...asp?deptID=1949

وستجد كلمة sign in في الركن الايمن العلوي تقريبا ... ووضعوها هناك عشان يخففون من الضغط على السيرفر :D .

وصفحة التسجيل موجوده هنا ... مباشرة :

http://devsupport.ageia.com/ics/support/de...asp?deptID=1949

بعد ان تسجل دخولك ابحث وستجد ال SDK ..

وهو هنا .. ويجب ان تسجل دخولك قبل زيارة الرابط

http://devsupport.ageia.com/ics/support/DL...sp?fileID=59559

وبذلك صرت محترف برمجة العاب وشوية فيزيكس :D >

المرحلة الجاية .. سأضيف طريقة التثبيت .. وهي موضحة في ملف التعليمات ...

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#6

المحرك جميل

واجمل شئ انه مجانى

ولكن هل السورس موجود

انا كنت عندى فكرة كده بسيطه

وهى محاولة لادماجه مع محرك اخر اوبن سورس

هل استطيع ؟؟؟؟؟

انا اللغة الى اعرفها فيجوال بيسك 6 و السى شارب

ارجو منك اخوى الشمرى الاجابة عن سؤالى للضورة القصوى

تم تعديل هذه المشاركة بواسطة (HARD) في 28 أكتوبر 2007 في 21:49

#7

المحرك طبعا غير مجاني ولذلك لايوجد سورس كود ,,, ... لكن كما قلت ... مجاني للاعمال غير التجارية ... يعني مجاني بدون سورس كود

.

والمحرك لا يعمل الا بلغة برمجة الالعاب .. السي بلس .. هذا ما اعرفه .

تم تعديل هذه المشاركة بواسطة الشمري في 28 أكتوبر 2007 في 22:20

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#8

شكراً

In order to understand recursion, one must first understand recursion

alawfiadel@yahoo.com

#9

الصراحة ردك اذهلنى

ولكن انا كنت افكر بدمج عدة محركات مجانية جيدة

اللغات الى اتقنها قلت لك يا غالى السى شارب

فهل استطيع فعلا ان الدمج

يعنى هدمج محرك فيزيائى ومحرك جرافيك وكده

شئ جميل ولكن محتاج شغل

فارجو منك يا غالى مساعدتى فى

الحصول على اسماء المحركات المجانية الجيدة والقوية التى تستحق التطوير والعمل عليها

#10

ما رأيك بالمحرك ODE .. أفضل المحركات المجانية والمفتوحة المصدر :

http://www.ode.org/

وعملوا لهذه المكتبة binding وبالتالي هي تعمل تحت البايثون ايضا .

http://pyode.sourceforge.net/

لكن لا اعرف عن السي شارب شيئا ..

أرى الاخ DreamNet يقرأ موضوعك الان .. وهو أعرف مني بالمكتبة المناسبة للسي شارب :D

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#11

السلام عليكم ورحمة الله وبركاته

لا أظنني أعرف أكثر منك أخي الشمري

في الحقيقة معظم المحركات معمولة بالسي ++ وبالنسبة للأعمال التي رأيتها على السي شارب هي مجرد تغليف لهذه المكتبات

اقتباس
ولكن انا كنت افكر بدمج عدة محركات مجانية جيدة

اللغات الى اتقنها قلت لك يا غالى السى شارب

الفكرة رأيتها مجسدة (الدمج ) في المكتبة IrrlichtFramework والمعمولة بالسي شارب تم دمج المكتبة المشهورة Irrlicht مع مكتبة الفيزياء Newton ومكتبة الصوت OpenAL وقد تحدثت عنها في الموضوع : إطار جيد للتعامل مع Irrlichtcp رسم صوت وفيزياء معا

الODE جميلة جدا وهي تتفوق عن نيوتن بالشئ البسيط لكن الغلبة دائما للPhysiX

سمعت أيضا عن تغليف للمكتبة Physix على الدوت نت لكني لم أجده (لا أظنه NovodeX .NET )

لا أظن أن عملية التغليف عملية صعبة جدا فقد وجدت تغليفات كثيرة جدا لمكتبة نيوتن ومكتبة ode

في الخلاصة عليك أخي أن لا تكتفي بالسي شارب للقيام بعملك مثل هذه الأعمال ستحتاج فيها إلى السي ++ (لا يمكن الاستغناء عنه :D )

تم تعديل هذه المشاركة بواسطة DreamNet في 2 نوفمبر 2007 في 13:19

#12

اضافة :

مهم :

هذه المكتبة ODE للدوت نت .. مبروووك :D .

http://odedotnet.sourceforge.net/index.php/Main_Page

-هذاالرابط يبدو مفيد ... انظر اخر الصفحة لتجد محرك فيزيائي .

http://www-cs-students.stanford.edu/~epark.../PhysicsEngine/

ونسيت ان اضيف احد أهم المكتبات الفيزيائية القادمة Bullet .. وهي مفتوحة المصدر .. وممكن تجد لها مقابل في السي شارب .

http://www.continuousphysics.com/

تم تعديل هذه المشاركة بواسطة الشمري في 29 أكتوبر 2007 في 22:42

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#13
اقتباس
هذه المكتبة ODE للدوت نت .. مبروووك teeth_smile.gif .

http://odedotnet.sourceforge.net/index.php/Main_Page

مجرد تغليف أخي الشمري

أحسن مثال لهذه المكتبة رأيته على موقع irrlicht الفرنسي

post-23361-1193688815_thumb.jpg

لا تنسى أخي الشمري هذه المكتبة الفيزيائبة أقصد Ageia Physx Engine طبعا لكي تعطينا دفعة لاستعمالها

كنت أنوي التطرق لاستعمال الفيزياء في irrlichtframework لكني سأنتظر قليلا لكي أقتبس منك هنا :D

لقد وجدت الرسم البياني الذي يوضح تجربة المحركات الثلاثة لسرعة التصادم مقارنة بعدد الأجسام المتصادمة

test2.jpg

بالتوفيق للجميع

#14
اقتباس
لا تنسى أخي الشمري هذه المكتبة الفيزيائبة أقصد Ageia Physx Engine طبعا لكي تعطينا دفعة لاستعمالها

ماراح أنسى ان شاء الله .. ولكن يلزمني بعض الوقت لأتعلم .. ثم أقوم بالتفلسف عليكم هنا :D .. أقصد .. أضع ما اعرفه .

وممكن هالموضوع يأخذ أشهر .. فقط في عمل ثلاث أمثلة أو أربع !!!

ورح نركز فقط على Rigid Bodies و Collision Detection ..

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

لاني ما اعرف في الفيزياء شيء .. حتى قوانين نيوتن ناسيها :D .

تثبيت المكتبة ageia PhysiX :

بعد أن تكون حملت الملفات المطلوبة ( راجع المشاركة رقم 5 ) .

قم بتثبيت حزمة الSoftware ( اللي حجمها 37 ميقا ) ...

وثبيتها سهل .

ثم قم بتثبيت ال SDK ( رقم اخر نسخة اثناء كتابة هذا الموضوع هي 2.7.2 ).. وبعد الانتهاء من تثبيته .. ستجده داخل المجلد AGEIA Technologies

مثال :

C:\Program Files\AGEIA Technologies\SDK

قم بفتح المجلد Bin .. وهو عندي موجود على الامتداد :

C:\Program Files\AGEIA Technologies\SDK\v2.7.2\Bin\win32

وقم بتجريب الأمثلة .. طبعا ستصاب بصدمة .. وذهول ... ولكن سرعان ما يزول عند أول حبة بنادول تلتهمها :lol: .

لاتنسى المرور على ملف التعليمات ..

C:\Program Files\AGEIA Technologies\SDK\v2.7.2\SDKs\Docs

-----------------

* تثبيت المحرك على الفيجوال سي 2005 :

هذه الطريقة تنفع مع أي مترجم .. ولكن لم أجرب الا على الفيجوال سي 2005 .

- من القائمة اختر

Tools -> Options

الان اربط الملفات الرأسية كما ترى في الصورة .

ملاحظة : اضغط على ايقونة المجلد الصفراء .. ثم ابحث عن المجلد AGEIA Technologies في جهازك .. ثم ستجد بداخله المجلدات الموجودة في الصورة التالية ( وش رايك بالتصميم :-) )

post-42837-1193810519.jpg

ثم اربط المكتبات كما ترى في الصورة .

ملاحظة : اضغط على ايقونة المجلد الصفراء .. ثم ابحث عن المجلد AGEIA Technologies في جهازك .. ثم ستجد بداخله المجلدات الموجودة في الصورة .

post-42837-1193810545.jpg

أما ملفات الDLLs فقد قام المحرك بتثبيتها ..

الرد القادم سيكون عمل مثال بسيط على المكتبة باستخدام OpenGL .. وان استطعت .. سأضع مثال اخر على DirectX .. طبعا المثال سيكون بسيط ..وهو مجرد مدخل للمكتبة .. ويكون قابل للترجمة فورا دون مكتبات مساعدة اخرى ..( الامثلة التي تأتي مع المحرك تعتمد على OpenGL ومكتبات أخرى )

تم تعديل هذه المشاركة بواسطة الشمري في 31 أكتوبر 2007 في 09:10

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#15

السلام عليكم .

نظرة عامة على المحركات الفيزيائية .. وعلى Ageia PhysX Engine بشكل خاص .

هذه مقدمة .. وأحسبها مهمة .. حيث اذا فهمتها واستوعبتها جيدا .. ستفهم فلسفة وأسلوب عمل أي محرك فيزيائي .. فهي تحتوي على مفاهيم فقط ..

وهي تنطبق على Ageia أو Newton أو ODE .. الخ .

البداية :

المحرك الفيزيائي يتكون من :

* Scene - المشهد :

ويسمى في المكتبة ODE و Newton بالعالم ( World ) ..

حيث كل مشهد أو عالم فيزيائي تنشئه .. سيكون عالم مستقل عن الاخر ..

وكل مشهد أو عالم Scene له خصائصه .. مثل :

الجاذبية gravity .

المجسمات Bodies أو Actors الموجودة في هذا العالم ..

فمثلا .. تستطيع ان تنشئ مشهدين اثنين :

الأول : يكون في الفضاء .. حيث لا توجد فيه جاذبية .. وتضع في أجسام .

الثاني : في الأرض ,, حيث توجد جاذبية .. وتوجد مجسمات .

مثال اخر .. تنشئ عالمين .. الاول يكون في الغرفة A .. والعالم الثاني في الغرفة B .. بحيث المجسمات الموجودة في الغرفة A لاتتصادم مع المجسمات الموجودة في الغرفة رقم B .. لانه هذا هو المنطق .

راجع :

NxSceneDesc - NxScene

* Actor - المجسمات :

وتسمى في المكتبة ODE و Newton بالBodies . .

وهو عبارة عن مجسم وهمي .. وأقول مرة أخرى .. وهمي .. لانعلم شكله حتى الان . .

كل مجسم تنشئه .. تضيفه الى المشهد Scene . حتى يتم ادخاله في الحسابات .

المجسمات لها خواص .. سنذكر منها ما يلي :

- نوع الجسم :

يوجد نوعان من Actor أو Body :

1 - static Body ::: المجسمات الساكنة .. وهي عبارة عن مجسمات لاتتأثر بالجاذبية .. بالقوى الموجودة حولها .. فهي كالجدار .. مجرد حاجز للتصادم فقط ..

2- dynamic Body :: وهي مجسمات تتأثر بالجاذبية .. وبأي قوة موجودة .. وتتعرض للارتداد ,... وما الى ذلك من المؤثرات .

- شكل الجسم :

يوجد عدة أشكال قياسية للمجسمات .. منها :

Box - صندوق , Sphere - كرة , والكبسولة و الاشكال المعقدة وووو ....

لذلك كل Actor نقوم بانشائه .. فيجب علينا تحديد شكله .. واذا حددنا شكله فيجب تحديد أبعاده .. وموقعه .. الخ .

كما يمكننا تحديد كثافة الجسم density .. حيث كلما زادت الكثافة .. صار الجسم أكثر قوة في مواجهة القوى المؤثرة عليه ..

- القوى المؤثرة على الجسم :

كل جسم ننشئه .. نحدد له القوى التي تؤثر عليه .. هناك قوى خارجية مثل الجاذبية .. وهناك قوى على الجسم نفسه مثل .. عزم التدوير Torque .. أو القوة العادية Force التي تدفع الجسم الى أي اتجاه نريده .. الخ .

- Material / الخامة:

.. لكن المقصود هو معامل احتكاك الجسم Friction , و معامل ارتداد الجسم Restitution .

حيث نستطيع من خلال ال Material محاكاة خامات الاجسام مثل الحديد و الخشب والمطاط .. الخ .

راجع :

NxActor - NxMaterial

NxShapeDesc و أبناءها .

NxBodyDesc - NxActorDesc

* Joints - الروابط :

نستطيع أن نربط المجسمات فيما بينها Actors عن طريق الروابط Joints ..

فنربط بين اطار السيارة والسيارة .. ونربط بين جسم ما .. وحبل .. فيكون الجسم معلق على الحبل ويتدلى .. الخ .

يوجد عدة أنواع من ال Joints , وليس هذا موضوع حديثنا .. ولكن ولفهم الصورة .. انظر الى هذه الصورة :-) :

post-42837-1193946696_thumb.jpg

* اكتشاف التصادم - Collision Detection :

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

* الدوال الرياضية :

المحرك الفيزيائي يقوم على مجموعة من الدوال الرياضية والكلاسات ... مثال :

Vector : المتجهات .

Matrix : المصفوفات .

Quaternion .

بالاضافة الى كلاسات أساسية أخرى .. مثل box و Ray و Plane و Sphere ,

الخلاصة :

تنشئ عالم فيزيائي Scene ,, وتضع فيه مجموعة من المجسمات Actors .. وكل مجسم له خصائصه وشكله .. وكل مجسمين تربطهم عن طريق Joints و يوجد عدة أنواع من الJoints .. .

ما علاقة هذا كله في OpenGL أو Direct3D ؟

بعد أن يقوم المحرك الفيزيائي مشكورا بتحريك الاجسام وشقلبتها وتدويرها .. يعيد الينا مصفوفة Matrix .. فيها كل المعلومات التي نحتاج .

الطريقة كالتالي :

- أنشئ جسم ( وليكن كرة ) .. واجعل نصف قطره 10 وحدات .. ثم اجعل المحرك الفيزيائي يقوم بتحريكه والتحكم به .

- اذهب الى OpenGL أو DX ,, و انشئ كرة نصف قطرها 10 وحدات وعين لها مصفوفة .. حيث هذه المصفوفة هي التي يقدمها لك المحرك الفيزيائي ... أتمنى أن تكون الصورة واضحة الان ... اليكم كود تعليمي :

Physic.createBox(2)
Physic.doIt()

OpenGL.LoadMatrix(Physics.getMatrix())
OpenGL.drawBox(2)

سأضيف مثال ان شاء الله .. يوضح طريقة تطبيق ما سبق ذكره ..

تم تعديل هذه المشاركة بواسطة الشمري في 1 نوفمبر 2007 في 22:59

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#16

بداية مشجعة جدا أخ شمري

وأنا أيضا سأضيف ان شاء الله درس استعمال الفيزياء في IrrlichtFramework انطلاقا من مقدمتك هذه

بالتوفيق ان شاء الله

تم تعديل هذه المشاركة بواسطة DreamNet في 2 نوفمبر 2007 في 13:25

#17

برنامجنا الأول .

قبل أن نبدأ .. نسيت أن أذكر متطلبات فهم المثال ,,, يجب على من يقرأ المثال ان يعرف عن اي مكتبة 3d مثل OpenGL او DirectX او حتى محرك ثلاثي الابعاد..

وبالتحديد .. يتوجب ان يكون على اطلاع على المتجهات والمصفوفات .. انظر لموضوع الاخ احمد صالح :

المرشد الكامل الفصل الخامس الجبر الخطي

سنقوم بعمل ثلاثة أمور :

- انشاء مشهد Scene .. وسنضع فيه الجاذبية المعتادة .

- انشاء أرضية Floor من نوع static Actor ,, بمعنى ان الارضية لن تتأثر بالجاذبية وأي قوة أخرى .

- انشاء صندوق (مكعب) من نوع dynamic Actor تتأثر بالقوى .. كالجاذبية أو عزم الدوران او أي قوة أخرى .

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

صورة المثال :

post-42837-1194029711_thumb.jpg

الخطوة الأولى :

ملخص الخطوة :

سننشئ كائن فيزيائي من نوع NxPhysicsSDK وهو الذي سينشئ لنا أي Scene ( عالم) نريده ..

ولانشاء Scene نحتاج لتعيين بعض المواصفات . كالجاذبية في هذا العالم .. بعدها ننشئ المشهد Scene .

#   pragma comment (lib, "PhysXLoader.lib")  
#define NOMINMAX
#include <windows.h>
#include "Cube.h"
#include <NxPhysics.h>
#include<iostream>
using namespace std;

// Physics SDK globals متغيرات عامة
NxPhysicsSDK*	 gPhysicsSDK = NULL;
NxScene*		  gScene = NULL;
NxVec3			gDefaultGravity(0,-9.8,0);// الجاذبية
NxVec3			floorSize(8,0.5,8);// أبعاد الأرضية - حجمها
NxVec3			boxSize(0.5,0.5,0.5);// أبعاد الصندوق
NxReal gDeltaTime =0;
// Actor globals
NxActor* Floor = NULL;// مجسم يمثل الارضية
NxActor* Box = NULL;// مجسم يمثل الصندوق

ربطنا المكتبات واستدعينا الملفات الرأسية اللازمة .

أيضا عرفنا عدة متغيرات .. سنذكرها لاحقا

bool InitNx()
{
	// Create the physics SDK
	gPhysicsSDK = NxCreatePhysicsSDK(NX_PHYSICS_SDK_VERSION);
	if (!gPhysicsSDK)
	{
				cout<<"error"<<endl;
				return false;
	}
	// Set the physics parameters
	gPhysicsSDK->setParameter(NX_SKIN_WIDTH, 0.01);
	gPhysicsSDK->setParameter(NX_VISUALIZATION_SCALE, 1);
	gPhysicsSDK->setParameter(NX_VISUALIZE_COLLISION_SHAPES, 1);
	gPhysicsSDK->setParameter(NX_VISUALIZE_ACTOR_AXES, 1);
//----------------------------------------------
	NxSceneDesc sceneDesc;
 	sceneDesc.simType	= NX_SIMULATION_SW;
			 sceneDesc.gravity			   = NxVec3(0,-9.8,0);
	gScene = gPhysicsSDK->createScene(sceneDesc);
	if(!gScene)
	{
		cout<<"error"<<endl;
		return false;
	}

- gPhysicsSDK : وهو عبارة عن كلاس .. من نوع Singleton .. بمعنى انه لايمكنك انشاء أكثر من نسخة واحدة من هذا الكلاس ..

مهمة هذا الكلاس NxPhysicsSDK هو انشاء الكلاسات الاخرى .. فهو المدخل .. وهو بمثابة الاب لجميع الكلاسات الاخرى في المحرك ageia .

انظر هذه الصورة :

post-42837-1194029770_thumb.jpg

فتستطيع من خلال الكلاس NxPhysicsSDK أن تنشئ أكثر من مشهد Scene .. بحيث كل المشاهد ستتأثر بخصائص gPhysicsSDK .

لاحظ كيف أننا انشأنا الكلاس

 NxCreatePhysicsSDK(NX_PHYSICS_SDK_VERSION);

حيث نمرر له رقم نسخة NX_PHYSICS_SDK_VERSION .

ثم بعد ذلك حددنا خصائص المحرك الفيزيائي عن طريق الدالة setParameter .. ولا اعرف حتى الان ماذا تعني هذه البارمترات .

- sceneDesc : أنشأنا كلاس من نوع NxSceneDesc وهو كلاس يحمل عدة متغيرات .. حيث نعين له المعلومات التي نريد .. وأهمها :

gravity : وهو عباة عن متجه Vector .. حيث جعلنا الاحداثي x و z =0 .. وجعلنا الاحداثي الصادي = 9.8 بالسالب ,

هنا سؤال ,, ماهو نظام الاحداثيات في المحرك الفيزيائي physX .. الجواب ,, ولست متأكد منه حتى الان .. أنه كالتالي .

post-42837-1194029727_thumb.jpg

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

NX_SIMULATION_SW : هذا يعني اننا نريد ان نعمل على السوفتوير وليس الهاردوير .. لاننا لانملك الهاردوير .

- بعد أن أنشأنا وصف للمشهد عن طريق sceneDesc سننشأ المشهد بناء على هذا الوصف ..

gScene = gPhysicsSDK->createScene(sceneDesc

بهذا نكون أنشأنا العالم الافتراضي .. وتنتهي هنا الخطوة الأولى .. وهذا أبسط ما يمكننا عمله بالمحرك .

الخطوة الثانية : الخامات materials :

الموضوع طويل ومن الصعب علينا فهمه الان .. لكن وباختصار ...

سنعين معامل الاحتكاك + معامل الارتداد للاجسام الموجودة في هذا المشهد Scene .. لذلك سنحصل على Material الموجودة الان .. ونعدل عليها .

	// Create the default material
	NxMaterial* defaultMaterial = gScene->getMaterialFromIndex(0);
	defaultMaterial->setRestitution(0.5);//الارتداد
	defaultMaterial->setStaticFriction(0.5);//الاحتكاك
	defaultMaterial->setDynamicFriction(0.5);

كل ما عليك ان تعدل مثلا معامل الارتداد .. وضعه مثلا 2 .. لتشاهد الفرق .. لاحظ ان الارتداد يكسب الجسم طاقة .. لذلك في كل مرة يرتد قد يكسب طاقة اعلى مما يجعله يذهب بعيدا الى الاعلى :D .

الخطوة الثالثة: انشاء الاجسام Actors ووضعها في هذا العالم Scene :

سننشئ جسمين .

أولا : الارضية .. لاحظ أن الأرضية ممكن تأخذ اي شكل نريده .. ولكن وحتى نحاكي الواقع سنضع الارضية على شكل يشبه الBox .( الصندوق) .

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

//----------------انشاء الأرضية ------------------------------
	NxBoxShapeDesc floorShape;// شكل السطح " صندوق" الشكل
	NxActorDesc floorDesc; // كلاس سيحمل وصف للجسم

	floorShape.dimensions.set(floorSize.x,floorSize.y,floorSize.z);	// أبعاد الصندوق
	floorDesc.shapes.push_back(&floorShape);//اضافة الشكل الى وصف الجسم
	floorDesc.body = NULL;//مهم - الجسم ستاتيكي لايتأثر بأي شيء الا التصادم فقط
	floorDesc.globalPose.t.set(0,0,0);//موقع الجسم
	Floor = gScene->createActor(floorDesc);//انشاء الأرضية بناء على الوصف السابق

الكلاس floorDesc سيحمل مواصفات الActor وهو هنا يمثل الارضية .. لذلك سنحدد أولا شكل الارضية ..

ولتحديد شكلها نحتاج الى كلاس اخر من نوع NxBoxShapeDesc .. أي اننا نريده على شكل صندوق ..

ثم حددنا ابعاد الصندوق وبعد ذلك اضفنا هذا الشكل الى الكائن floorShape ..

لاحظ أنه يمكن اضافة أكثر من شكل الى جسم واحد ..

الان صار floorDesc يحمل شكل الجسم .

نضيف بعض الامور الاخرى الى floorDesc .. موقع الجسم عند بداية تشغيل المثال .. وأهم شيء هو هذا السطر

floorDesc.body = NULL;//

حيث أخبرنا المحرك أن الارضية ليست ديناميكية ولكن ثابتة .. أي لاتتأثر بالقوى حولها .

ثم أنشأنا الActor وهو الان Floor .

ثانيا : المكعب :

سنقوم بنفس الخطوات .. لاحظ ,

//--------------- انشاء المكعب -------------------------------	
	NxBodyDesc	   bodyDesc;// نريده ديناميكي
	NxActorDesc		 boxDesc;// وصف للجسم الذي سنضيفه
	NxBoxShapeDesc	 boxShape;// شكل الجسم وهو " صندوق" الشكل

	boxShape.dimensions.set(boxSize.x,boxSize.y,boxSize.z);// تحديد أبعاد الصندوق
	boxDesc.shapes.pushBack(&boxShape);// اضافة الشكل الى وصف الجسم
	boxDesc.body = &bodyDesc;// نريده ديناميكي
	boxDesc.density = 1;//كثافة الجسم .. قيمة أقل .. كثافة أقل .. والعكس صحيح
	boxDesc.globalPose.t = NxVec3(0,15,0);// موقع الجسم - 15 وحدة للاعلى
	Box = gScene->createActor(boxDesc);	// أنشئ الجسم بناء على الوصف السابق
	Box->addTorque(NxVec3(0,0,10));// نريد ان يدور الجسم اثناء الحركة

الجديد هنا هو أننا جعلنا الجسم ديناميكي عن طريق boxDesc.body حيث مررنا له الكلاس bodyDesc .

ثم حددنا موقع الجسم . حيث أنه يبدأ في الأعلى ثم سيسقط للاسفل لاحقا ..

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

ومن الامور المهمة هي عزم الدوران Torque .. حيث مررنا بعض القيم عن طريق الدالة addTorque ..

عزم الدوران .. موضوع كبير .. سأحاول أن أعمل مثال لاحقا ان شاء الله ..

انتهت الخطوة الثالثة .. حيث انشأنا أرضية ثابتة واضفناها للمشهد ,,, وأنشأنا معكب ديناميكي وأضفناه للمشهد

الخطو الرابعة .. تشغيل المحرك الفيزيائي :

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

void StartPhysics()
{
	gDeltaTime = UpdateTime();
	// Start collision and dynamics for delta time since the last frame
	gScene->simulate(gDeltaTime);
	gScene->flushStream();

}
void GetPhysicsResults()
{
	while (!gScene->fetchResults(NX_RIGID_BODY_FINISHED, false));
}

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

الخطوة الخامسة : تحويل الفيزياء الى رسم على الشاشة .. :

نحتاج الى OpenGL أو Direct3D أو الى محرك مثل Ogre أو Irrlicht .. سأوضح المثال باستخدام OpenGL .

float glmat[16];
NxMat34 m;



void display(void)
{




// تحديث المحرك الفيزيائي وجلب البيانات منه

  StartPhysics();
  GetPhysicsResults();


	//رسم الصندوق الأصفر

  glPushMatrix();


   	m=Box->getGlobalPose();// الحصول على مصفوفة المحرك الفيزيائي
	m.getColumnMajor44(glmat);// تحويل المصفوفة الى مصفوفة متوافقة مع اوبنجل
	glMultMatrixf(&(glmat[0]));تحميل المصفوفة في اوبنجل
			glScalef(boxSize.x,boxSize.y,boxSize.z);// تعيين حجم الصندوق وهو نفسه حجم الصنوق في المحرك الفيزيائي
		   glColor3f(1,1,0);
			drawCube();//رسم الصندوق

  glPopMatrix();



  //  رسم الأرضية

	glPushMatrix();

	m=Floor->getGlobalPose();
	m.getColumnMajor44(glmat);
	glMultMatrixf(&(glmat[0]));

			glScalef(floorSize.x,floorSize.y,floorSize.z);

			glColor3f(0.5,0.5,0.5);
			drawCube();

   glPopMatrix();



}

لاحظ كيف حملنا مصفوفة الصندوق الاصفر والتي تحتوي على الازاحة والوران للصندوق .. ثم حولناها الى مصفوفة متوافقة مع اوبنجل

حيث ان مصفوفة اوبنجل هي 4*4 ولها ترتيب خاص ,, واستخدمنا لهذا التحويل احد دوال المحرك الفيزيائي المساعدة

ثم غيرنا حجم الصندوق ليكون حجمه مساوي لحجم الصندوق الوهمي الموجود في المحرك الفيزيائي

لذلك سيأخذ الصندوق المرسوم في اوبنجل نفس حجم ومكان الصندوق الوهمي في المحرك الفيزيائي

ورسمنا الارضية بنفس الطريقة

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

أتمنى أن تكون الصورة واضحة الان ..

في المرفقات الملف التطبيقي واستخدمت OpenGL .

طلب : لمن يستطيع تحويل المثال الى DirectX أتمنى أن يقوم بذلك حتى يستفيد منه الشباب .

وسأحاول أن اقوم بتحويل المثال الى المحرك Irrlicht .. ولو قام ايضا احدكم بتحويل الى المثال الى ذلك المحرك فجزاه الله خير .

واجب :D : قم بتغير شكل المكعب السابق الى كرة .. وغير مكان ارتفاعها .. وغير من كثافتها .. وغير من معامل الاحتكاك والارتداد ..

انتظر حل الواجب :-( .

Ageia_01_GL.zip

تم تعديل هذه المشاركة بواسطة الشمري في 2 نوفمبر 2007 في 21:56

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#18

السلام عليكم ورحمة الله وبركاته

آسف على التأخير

في الحقيقة لم أستطع التطبيق للمحرك لاني أستعمل VC++2005 Express يعني هناك مكتبات ناقصة أهمها windows.h سأحاول إضافتها فيما بعد

حاولت التطبيق على الvc++6 لكن حدث خطأ أيضا على مستوى NxSegmentPlaneIntersect

المهم بالنسبة للواجب كنت أتمنى حله لكني سأحاول تطبيقه لما أحل مشكلة الCOMPILER الذي لدي

أظن أن الفرق بين المكعب والكرة هو في تحديد الشكل وطريقة الرسم فتحديد الشكل سيكون ب NxSphereShapeDesc

ومن بعد انشاء الكائن نغير القيم

NxBodyDesc	   bodyDesc;
NxActorDesc		 sphereDesc;
NxSphereShapeDesc   sphereShape;

sphereShape.radius = 1.0;
sphereDesc.shapes.pushBack(&sphereDesc);

sphereDesc.body = &bodyDesc;
sphereDesc.density = 10.0;
sphereDesc.globalPose.t =  NxVec3(0,25,0);

طبعا علينا مراعاة رسم الكرة بنفس نصف القطر المحدد باستعمال الدالة glutSolidSphere

طبعا هذا كلام نظري وان شاء الله راح أطبقه قريبا جدا (بعد التصحيح)

#19

والله كنت متوقع انه مافيه بالقسم الا الاخ DreamNet وستة أعضاء اخرين ..اما البقية تلقاهم في مواضيع الكتب وتجميعها :lol: .. وهذا سبب ضعفنا وتخلفنا .." تجميع الكتب على غير فائدة" / شاركوا يا اخوان في تعلم هذا المحرك .. فهو لا يتطلب منك اي خبرة سابقة .. أقول ,, اي خبرة سابقة ..

حلك صحيح 100% .. وهذه هي الفكرة .. واتمنى تحل المشكلة .. لكن مجرد ردودك واشعارك لي بأنك فاهم ومتفاعل .. هذا يكفي .

----

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

المجال مفتوح لاي اضافة من الاعضاء الكرام

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#20

اعتذر عن اخفاء الموضوع لسبب يعلمه الاخ DreamNet على ما اظن :D .. فيروس صغينون ....

المهم .. اعاني من اختبارات ودراسة وخوف من التقدير F .. لذلك سأتوقف لعدة اشهر عن الكتابة في هذا الموضوع .

الموضوع مفتوح لاي شخص يريد اضافة ما يعرفه عن المحرك ,,, اعتذر مرة اخرى .

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…