موضوع لمناقشة التصادم في Directx
السلام عليكم
في الحقيقة هذا الموضوع استفسار عن كيفيت صناعة تصادم باستخدام كلاً من visual Basic 6 و الــ Directx7
اول شي للتصادم يجب انك تحدد موقع المجسم
استخدمت خاصية SetPosition لتحديد موقع الجسم باستخدام الكود التالي
Mesh1.SetPosition scene, 20, -20, 50
ثانياً استخدمت الكود التالي لعمل التصادم
if Mesh1.SetPosition >= Mesh2.SetPosition Then Mesh1.SetPosition scene, 10, 20, 40
لكن للاسف تطلع رالة تقول الخاصيه SetPosition ليست اختيارية.
حصلت موضوع اخر
يقول ان لعمل تصادم اجعل المجسم محاط بدائرة اومستطيل اذا كان التصادم في بعدين
http://www3.0zz0.com/2006/10/24/04/19027944.jpg
او اجعل المجسم محاط بكرة او مكعب اذا كان التصادم في ثلاثة ابعاد
http://www3.0zz0.com/2006/10/24/04/65810197.jpg
فاالرجاء مساعدتي في عمل ذلك ان أمكن
رد: موضوع لمناقشة التصادم في Directx
ليس لدي الكثير ولكن .. جرب GetPosition بدل SetPosition في كود التصادم ...
و بالنسبة للعملية الثانية فهي صحيحة ولكن لا اعرف طريقة تطبيقها ...
اعتقد يزيد يستطيع ان يساعدك ...
رد: موضوع لمناقشة التصادم في Directx
كود:
visual Basic 6 و الــ Directx7
هل يدعم الـ vb الـ DirectX 9 :33:
إذا كان يدعم النسخة السابعة فأنا أنصحك بالأنتقال إليها ... لأنها أفضل وأسهل ...
رد: موضوع لمناقشة التصادم في Directx
رد: موضوع لمناقشة التصادم في Directx
أشكر الجميع
بالنسبة للاخ Son Of UAE
في الحقيقة جربة GetPosition بس مانفع
اما الاخ RAAAAD
فشكر اً لشرحك بس الشرح علي c++
والــ vb لا يدعم الDirectX 9
والاخPRG of RPG
فشكراً لك بس والله مافهمت شيء
رد: موضوع لمناقشة التصادم في Directx
شوف إذا كان directx 7 يدعم حساب الـ normlization vector فتستطيع حساب التصادم عن طريق الدالة setnormal ...
جرب هذا الكود
كود:
if Mesh1.setnormal >= Mesh2.setnormal Then Mesh1.SetPosition scene, 10, 20, 40
أو شئ قريب لهذا ..
رد: موضوع لمناقشة التصادم في Directx
اقتباس:
المشاركة الأصلية كتبت بواسطة العالميه
حصلت موضوع اخر
يقول ان لعمل تصادم اجعل المجسم محاط بدائرة اومستطيل اذا كان التصادم في بعدين
او اجعل المجسم محاط بكرة او مكعب اذا كان التصادم في ثلاثة ابعاد
في موقعي عرضت طرق التصادم 2D ،،، عموماً الشائعة الإستخدام هي Rect و Circle و pixel للتودي
أما الثري دي فالشائعة هي Sphere و Box و Face زي ما تفضلت أخوي
أبعرض هنا طريقة 2D Rectangle Collision عشان فكرة التصادم واضحة :
هذي الخمس حالات الأساسية لأي مجسمين A و B :
http://www.axdteam.net/2dcol.jpg
كود:
الحالة 1
المجسمين غير متصادمين
الحالة 2 و 3 : توضحان متى يحدث التصادم الأفقي:
المجسين متصادمين لأن:
B.Right > A.left & A.Right > B.Left
الحالة 4 و 5 : توضحان متى يحدث التصادم العامودي:
المجسين متصادمين لأن:
B.Buttom > A.Top & A.Buttom > B.Top
وإذا حدث هذين الشرطين معاً يحدث التصادم
*قارن الكود بالصورة*
هذه كيفية إكتشاف التصادم بطريقة 2D Rectangle Collsion والطرق كثيرة، على حسب الحاجة
وبالنسبة لطرق الثري دي أعقد من التو دي بس بالنهاية راح تكون داخل كلاس مغلفة وبعد فترة يمكن تنسى كيف سويتها -.-
أتمنى فكرة التصادم وضحت ،،، والآن نحتاج منك إنك تحطنا في الصورة :
1- تو دي ولا ثري دي
2- نوع التصادم
3- شغال على محرك ولا على DirectX7 مباشرة
أول شي أقدر اقوله لك أنها GetPosition اللي تحتاجها لأنك ماتبي تغير مكان المجسم (SetPosition) بل تريد أن تعرف مكانه (GetPosition)
ملاحظة: للأسف أنا وضعت الرابطة للنسخة الإنجليزية ، هنا النسخة العربية
رد: موضوع لمناقشة التصادم في Directx
الاخPRG of RPG
التصادم ثري دي
انا اشتغل على DirectX7 مباشرة
رد: موضوع لمناقشة التصادم في Directx
بالنسبة للثري دي DX7 ما انصحك تشتغل عليه بالمرة
إذا إنت حاب الVisual Basic إشتغل على Visual Basic.Net - DirectX9 :)
الشغل عليه أسهل بكثير من DirectX7-VB6 وأمتع.... عموماً هذا ماهو الموضوع :)
__________________
بالنسبة للثري دي عندنا Box و Sphere و Face طرق لإكتشاف التصادم
أسهلها بالطبع Sphere وهي تشبة تماماً 2D Circle Collision فقط ضيف البعد Z في المعادلة
لنفرض أن لدينا مجسم A و مجسم B
والآن يجب أن نوجد الجسم المحيط Boundry للمجسمين وهو في حالتنا هذه الكره
كره تغلف المجسم A و كرة أخرة تغلف المجسم B ....
أنظر الصورة
http://localhost/english/noor/images/t16.jpg
ستجد نوعين من الBounders :
1- Sphere حتى نستخدم Sphere Collision ...
2- Box حتى نستخدم Box Collision ...
وحتى توجد الSphere Bounder لمجسم تحتاج الCenter في الغالب هي الOrigin وتحتاج الRadius فقط لاغير
وهي عملية إحصائية لجميع نقاط المجسم...
الآن لدينا Sphere Bounder للمجسم A و SphereBounder للمجسم B
المسافة بين الBounders عملية رياضية بسيطة : تأخذ المتجة بين المركزين ثم تحسب طول هذا المتجة
ثم تقارن ما اذا كان طول المسافة أكبر من مجموع القطرين وبالتالي لا يوجد تصادم...
ملاحظة: ليس بالضروري أن تستخدم الجذر التربيعي لحساب الطول (لأن هذا سيأخذ وقت معالجة طويل)
ملاحظة: لا تنسى أن تأخذ بعين الإعتبار الMatrix المطبقة على المجسمات
هذا كل شيء
لقد وضعت في محركي مثال على إكتشاف التصادم Sphere و Box تستطيع الرجوع وتتبع سير العملية (DX9-VB.Net)
الموضوع طويل واختصرت منه الكثير، حاول أن تنجح في صنع التصادم ولو لم تتمكن من العملية جرب أن تشتغل على Dx8 و Dx9 (أفضل بكثير) وإستخدم محركات جاهزة في البداية حتى تتعلم كيف تصنع محركك الخاص...
ByeBye :biggthump
رد: موضوع لمناقشة التصادم في Directx
الدايركت إكس يبيله واحد عنده إجازة سنتين و يمه قهوة :)
و شفتو اشلون الفيجوال بيسك ما يدعم الدايركت اكس 9 ؟؟
الـ ++C يدعم اخير اصدار :) و المثال اللي شرحه الاخو راااااد "عملاق"
رد: موضوع لمناقشة التصادم في Directx
اقتباس:
المشاركة الأصلية كتبت بواسطة GOGENDANTESS
و شفتو اشلون الفيجوال بيسك ما يدعم الدايركت اكس 9 ؟؟
بس أخوي لو قرأت ردي:
اقتباس:
المشاركة الأصلية كتبت بواسطة PRG of RPG
إذا إنت حاب الVisual Basic إشتغل على Visual Basic.Net - DirectX9
:أفكر:
رد: موضوع لمناقشة التصادم في Directx
اقتباس:
المشاركة الأصلية كتبت بواسطة PRG of RPG
بس أخوي لو قرأت ردي:
:أفكر:
هما تتظل الـ ++C بالصدار بسبب السرعة و اهي اختيار كل شركات الألعاب :)
رد: موضوع لمناقشة التصادم في Directx
السلام عليكم...
مسألة التصادم ليس لها علاقة بمحرك رسومي دونا عن الآخر
فمثلا لا يختلف مبدأ التصادم في DirectX عن OpenGL و...
ولكن المهم فهم كيفية التعامل مع التصادم..
في الألعاب يستخدم أكثر من مدخل في عالم الحسابات والفيزياء:
1) 3D Math:
أ. بسيطة: وهي أبسط طريقة وتعتبر أولية جدا
. المسافة بين نقطتين في الفضاء:
Assume we have 2 vectors (i.e each vector is the center-point for each object in the 3d space)
// --
v1 = obj1.gePosition();
v2 = obj2.getPosition();
distance = sqrt ((v1.x-v2.x)+(v1.y-v2.y)+(v1.z-v2.z))
// --
فإذا كانت النتيجة صفر فهما على نفس المكان...
الآن أنت بحاجة لمعرفة قطر كل منهما وإبدال الصفر بمجموع أنصاف أقطارهما..
// --
r1 = float(obj1.transform.boundingSphere[2])/2;
r2 = float(obj2.transform.boundingSphere[2])/2;
if (distance <= r1+r2)
// stop Moving
else
// Cont. Moving
// --
ب. تركيبية:
1.وهو يكون باستخدام Ray
2. استخدام خوارزميات تحسين الآداء Octree
2) Physics
باستخدام إحد حزم الفيزياء وتعريف الأجسام المتحرك منها والثابت وحساب Interpenetration بين الجسيمات.
عسى أن أكون أفدتك في شيء:أفكر:
وأعتذر عن عدم تنظيم المادة بسبب عدم سهولة التعامل مع محرر المنتدى...
رد: موضوع لمناقشة التصادم في Directx
اقتباس:
المشاركة الأصلية كتبت بواسطة H4 ZeQart
وأعتذر عن عدم تنظيم المادة بسبب عدم سهولة التعامل مع محرر المنتدى...
أوافق 100% الموضوع أطول من أن يشرح بشكل كامل،،، من هنا تأخذ المقدمة والمفاهيم أو المشاكل التقنية ، ولكن لا امتلك الوقت حالياً لكتابة الأمثلة الكاملة :) ، اتمنى لو يتفضل احد الإخوان/أخوات بوضع مثال Visual Basic للتوضيح ....