المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : موضوع لمناقشة التصادم في Directx



العالميه
24-10-2006, 07:49 AM
السلام عليكم
في الحقيقة هذا الموضوع استفسار عن كيفيت صناعة تصادم باستخدام كلاً من 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

فاالرجاء مساعدتي في عمل ذلك ان أمكن

Son Of UAE
24-10-2006, 09:12 AM
ليس لدي الكثير ولكن .. جرب GetPosition بدل SetPosition في كود التصادم ...
و بالنسبة للعملية الثانية فهي صحيحة ولكن لا اعرف طريقة تطبيقها ...

اعتقد يزيد يستطيع ان يساعدك ...

RAAAAD
25-10-2006, 02:38 PM
نفرض أن لدي دائرتان وهما c1 و c2 ولدي كل واحدة إحداثيات هم x, y, z في حالة ثلاثي الأبعاد ... و x,y في حالة ثنائي الأبعاد ..
r1 يمثل نصف القطر لي c1
r2 يمثل نصف القطر لي c2


===========


فستكون لدي المعادلة الخاصة بالتصادم هي



||c2-c1|| <= r2+r1


===========




نقوم أولاً بطرح الـ vectors للدائرتان وهما c2 – c1 ونضع النتيجة بي الـ vector المسي u .. ومن ثم نحسب الـ Normalization له ... لعمل خط مستقيم بين الجسمين ...


وبواسطة جمع أنصاف الأقطار .. نستطيع معرفة هل الدائرنات تقاطعا .. إم لا





Vector3 Vector3::operator-(Vector3& rhs)
{
//step 1
Vector3 u;
u.mX = mX - rhs.mX;
u.mY = mY - rhs.mY;
u.mZ = mZ - rhs.mZ;

//step 2
sqrtf(uX*uX + uY*uY + uZ*uZ);;


//step 3

float len;

mX /= len;
mY /= len;
mZ /= len;

return u;

}

RAAAAD
25-10-2006, 02:44 PM
visual Basic 6 و الــ Directx7


هل يدعم الـ vb الـ DirectX 9 :33:

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

PRG of RPG
25-10-2006, 04:03 PM
هنا (http://axdteam.net/english/start.php?page=articles/2dcollision) :)

بالتوفيق

العالميه
26-10-2006, 05:19 PM
أشكر الجميع
بالنسبة للاخ Son Of UAE (http://www.montada.com/member.php?u=46611)
في الحقيقة جربة GetPosition بس مانفع

اما الاخ RAAAAD (http://www.montada.com/member.php?u=295246)
فشكر اً لشرحك بس الشرح علي c++
والــ vb لا يدعم الDirectX 9


والاخPRG of RPG (http://www.montada.com/member.php?u=39851)
فشكراً لك بس والله مافهمت شيء

RAAAAD
26-10-2006, 08:00 PM
شوف إذا كان directx 7 يدعم حساب الـ normlization vector فتستطيع حساب التصادم عن طريق الدالة setnormal ...

جرب هذا الكود



if Mesh1.setnormal >= Mesh2.setnormal Then Mesh1.SetPosition scene, 10, 20, 40


أو شئ قريب لهذا ..

PRG of RPG
26-10-2006, 08:40 PM
حصلت موضوع اخر
يقول ان لعمل تصادم اجعل المجسم محاط بدائرة اومستطيل اذا كان التصادم في بعدين

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


في موقعي عرضت طرق التصادم 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)

ملاحظة: للأسف أنا وضعت الرابطة للنسخة الإنجليزية ، هنا النسخة العربية (http://axdteam.net/arabic/start.php?page=vb)

العالميه
30-10-2006, 12:43 PM
الاخPRG of RPG (http://www.montada.com/member.php?u=39851)

التصادم ثري دي
انا اشتغل على DirectX7 مباشرة

PRG of RPG
31-10-2006, 01:06 AM
بالنسبة للثري دي 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

GOGENDANTESS
03-11-2006, 06:16 AM
الدايركت إكس يبيله واحد عنده إجازة سنتين و يمه قهوة :)


و شفتو اشلون الفيجوال بيسك ما يدعم الدايركت اكس 9 ؟؟

الـ ++C يدعم اخير اصدار :) و المثال اللي شرحه الاخو راااااد "عملاق"

PRG of RPG
03-11-2006, 09:30 AM
و شفتو اشلون الفيجوال بيسك ما يدعم الدايركت اكس 9 ؟؟


بس أخوي لو قرأت ردي:



إذا إنت حاب الVisual Basic إشتغل على Visual Basic.Net - DirectX9


:أفكر:

GOGENDANTESS
05-11-2006, 09:09 AM
بس أخوي لو قرأت ردي:



:أفكر:

هما تتظل الـ ++C بالصدار بسبب السرعة و اهي اختيار كل شركات الألعاب :)

H4 ZeQart
11-11-2006, 09:51 AM
السلام عليكم...

مسألة التصادم ليس لها علاقة بمحرك رسومي دونا عن الآخر

فمثلا لا يختلف مبدأ التصادم في 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 بين الجسيمات.

عسى أن أكون أفدتك في شيء:أفكر:

وأعتذر عن عدم تنظيم المادة بسبب عدم سهولة التعامل مع محرر المنتدى...

PRG of RPG
11-11-2006, 12:34 PM
وأعتذر عن عدم تنظيم المادة بسبب عدم سهولة التعامل مع محرر المنتدى...

أوافق 100% الموضوع أطول من أن يشرح بشكل كامل،،، من هنا تأخذ المقدمة والمفاهيم أو المشاكل التقنية ، ولكن لا امتلك الوقت حالياً لكتابة الأمثلة الكاملة :) ، اتمنى لو يتفضل احد الإخوان/أخوات بوضع مثال Visual Basic للتوضيح ....

محمدهلال
03-06-2008, 05:58 PM
انا عندي برنامج الفيجوال دوت نت ومش عارف استخدمه اذاي وسمعت انه يمكن صناعة الالعاب بهذا البرنامج الي يعرف اذاي ارجوكم عرفوني اذاي وده وارجو من الادارة تبعت علي الايميل لما حد يرد