Contacts
صفحه اصلی پورتال | صفحه اصلی تالار | ثبت نام | اعضاء | گروه ها | جستجو | پرسش و پاسخ | فروشگاه الکترونیکی | خرید پستی بازی های کامپیوتری





صفحه اول انجمنها -> اصول اولیه در طراحی بازیهای کامپیوتری -> مقاله : تشخیص برخورد دو بعدی(قسمت دوم)
 

ارسال يك موضوع جديد   پاسخ به يك موضوع ديدن موضوع قبلي :: ديدن موضوع بعدي

نظر خود را در مورد مفید بودن این مقاله بیان کنید
چیز جدیدی یاد نگرفتم
0%
 0%  [ 0 ]
بد نبود
25%
 25%  [ 1 ]
خیلی به دردم خورد
75%
 75%  [ 3 ]
مجموع آراء : 4

مقاله : تشخیص برخورد دو بعدی(قسمت
نويسنده
پيغام
eta
مدیر سایت
مدیر سایت


تاريخ عضويت: 2 شنبه 27 تير 1384
تعداد ارسالها: 2153
محل سكونت: شاهين شهر


5 شنبه 30 فروردين 1386 - 13:23
پاسخ بصورت نقل قول
در صورتی که شما مقاله اول تشخیص برخورد دو بعدی را مطالعه نکرده اید به شما توصیه میگردد که ابتدا به مطالعه آن بپردازید.

درمقابل تکنیک های کم خرج، تکنیک هایی وجود دارند که هیچ توجهی به سخت افزار نمی کنند تنها چیزی که برای این تکتیکها اهمیت دارد تشخیص هر چه دقیقتر برخورد است الگوریتمهای مربوط به این تکنیکها به هر نحو و به هر میزانی که بخواهند از سخت افزار استفاده می نمایند. یک نمونه از این تکنیکها، تکنیک چک کردن تمام پیکسل ها یا pixel by pixel checking می باشد.
همانطور که از اسم این روش بر می آید در این روش کلیه پیکسل های یک شی برای اینکه آیا با پیکسلهای شکا دیگر تداخل دارند چک می شوند که این کار هزینه بسیار بالایی را به سخت افزار تحمیل می نماید.

قطعه کد نمادین زیر می تواند نحوه کار این الگوریتم را به شما نشان دهد.
توجه کنید که :
در این کدo1 شی اول و o2 شی دوم خواهد بود.
backGroundValue نشان دهنده رنگ پس زمینه تصویر است که در هنگام کشیدن تصویر شی روی صفحه بازی نشان داده نمی شود.(این قسمتها ممکن است ترنسپرنت شده باشند.)
تابع pixelValue برای پارامتر های منفی و یا خارج از محدوده طول و عرض تصویر مقدار backGroundValue را باز می گرداند.

كد:
collision = false;
for( i in 0 to o1. w )
{
   for( j in 0 to 01.h )
   {
      if( o1.pixelValue( i, j ) != o1.backGroundValue AND o2. pixelValue( o1.x + i - o2.x, o1.y + j - o2.y ) != o2.backGroundValue )
      {
         collision = true;
         break;
      }
   }
if( collision )
   break;
}
// here the collision variable can tell us there where any collision(with it's true value) or not(with it's false value).


البته می توان از روشهای دیگری نیز برای تشخیص پیکسل به پیکسل برخورد در دو عکس استفاده کرد. برای نمونه : (اگر از چند خط زیر چیز زیادی دست گیر شما نمی شود می توان آن را به آشنایی نداشتن شما با برخی مفاهیم کامپیوتری نسبت داد. بنا براین می توانید از این چند خط بگذرید. چرا که گذشتن از آن به کلیت مقاله لطمه ای وارد نمی کند.)

«ابتدا فرض کنید طول تصاویر بزرگتر از 32 بیت نباشد. و کامپیوتر شما نیز یک کامپیوتر 32 بیتی باشد.
می توان پیکسل های مربوط به هر سطر دو شکل را که روبروی هم قرار دارند(منظور این است که سطرها روبروی هم باشند.)، در یک حلقه for به دو متغیر از جنس int نسبت داد.(معمولا تعداد
بیتهای متغیرهای از نوع صحیح در زبانهای برنامه نویسی برابر تعداد بیتهای باس آدرس پردازشگر سیستم شما می باشد. در اینجا همان 32) سپس بیتهای متغیر مربوط به شی دوم را با توجه با
فاصله دو شی به سمت چپ یا راست شیفت داد. اکنون با and کردن منطقی این دو متغیر تداخل یا عدم تداخل در آن سطر از دو شکل مشخص می شود. برای تصاویر با طول های بالاتر از 32 می توان ابتدا پیکسلهای سطور آن را بین چند متغیر تقسیم نمود و سپس حاصل and متغیرهای متناظر را با یکدیگر xor نمود.
از کد مربوط به این الگوریتم جهت دور نشدن بیش از حد از اصل مطلب می گذریم.»

اینجا جایی است که خواننده با هوش اولین جرقه های یک راه حل کارآمد را در ذهن خود احساس خواهد کرد.
چه لزومی دارد که ما زمان سخت افزار را برای چک کردن پیکسل به پیکسل اشیائی که امکان تداخل ندارند هدر بدهیم؟
چقدر عالی خواهد بود اگر راه حلی پیدا بشود که بتواند قبل از ورود به مرحله تست تمام پیکسل ها، امکان تداخل را تشخیص دهد.
اینجاست که به فکر تلفیق روش های کم هزینه و پر هزینه می افتیم.

راه حل اینست :
ابتدا امکان برخورد دو شی را از طریق یکی از تکنیکهای مستطیل یا دایره محصور کننده یا حتی جدول مراقبت بسنجید. (هزینه چنین تستی تنها به اندازه چند عمل کوچک و ناقابل خواهد بود. در مورد مستطیل به چهار عمل مقایسه وجمع و در مورد دایره به دو عمل تفریق، چهار عمل مجذور کردن و دو عمل جمع. آنهم در مقابل 400 عمل تست پیکسلها برای یک تصویر فرضی 20*20)
اکنون که تشخیص داده اید این دو شی امکان تداخل دارند، نوبت به استفاده از الگوریتمهای دقیقتری می رسد. در اینجا می توان از الگوریتم تست پیکسل به پیکسل استفاده نمود.(توجه داشته باشید که در این مرحله تنها تست پیکسل های مشترک بین دو مسطتیل(دایره) کفایت می کند.)
اگر الگوریتم جدول مراقبت شما دقت کمتری از روش مستطیل محصور کننده دارد. شما می توانید در ابتدا از روش جدول مراقبت استفاده کنید. سپس در صورت تشخیص امکان برخورد در جدول مراقبت از مستطیل یا دایره محصور کننده استفاده نمایید و در نهایت اگر باز هم عدم برخورد ثابت نشد. از تست پیکسل به پیکسل استفاده نمایید.

عموما در صورتی که شما چند الگوریتم با کارایی های متفاوت داشته باشید. می توانید آنها را به ترتیب زمان اجرای کم به زیاد(و البته دقت کم به زیاد) مورد استفاده قرار دهید. در این میان شما شانس زیادی خواهید داشت تا قبل از رسیدن به الگوریتمهای پرهزینه عدم برخورد را تشخیص دهید.

توجه داشته باشید که :
1. الگوریتمهای مورد استفاده باید همگی رفتار مشابه داشته باشند. یعنی مثلا همگی توانایی تشخیص قطعی عدم برخورد را داشته باشند. چرا که در غیر این صورت استفاده آنها در زنجیره الگوریتمها غیر منطقی و اشتباه خواهد بود.(الگوریتمهایی وجود دارند که در تشخیص بر خورد یا عدم تشخیص آن قطعیت ندارند. این گونه الگوریتمها معمولا به صورت منفرد مورد استفاده قرار می گیرند. یک نمونه از این الگوریتمها الگوریتم تشخیص برخورد از طریق چند ضلعی محدب می باشد)
2. در این روش تصمیم در مورد وجود برخورددر آخرین سطح قابل انجام خواهد بود. اما تشخیص عدم برخورد ممکن است در هر مرحله ای باشد.
3. راههای دیگری به جز تشکیل زنجیره الگوریتمها، نیز برای ترکیب کردن روشهای متفاوت تشخیص برخورد به گونه ای که یک دیگر را تکمیل کنند وجود دارند. تنها چیزی که در این میان اهمیت دارد آشنایی با روشهای متفاوت و کمی خلاقیت برای ترکیب مناسب آنها در مسیر یافتن یک شیوه مناسب برای هر بازی است.


به این ترتیب شما توانسته اید، با صرف هزینه سخت افزاری قابل قبول به یک الگوریتم کاملا کارا و بدون خطا دست یابید

منابع :

http://forums.indiegamer.com/archive/index.php/t-307.html
http://www.gamedev.net/reference/articles/article735.asp

نوع استفاده از منابع :
برداشت تکمیل و افزودن اطلاعات شخصی

سطح مقاله : متوسط

نویسنده : احسان طاهری
پست الکترونیک : eh_taheri@yahoo.com

*** کلیه حقوق مطالب این پست برای نویستده و سایت طراحان ایرانی محفوظ است و استفاده از آن با ذکر منبع بلا مانع است.***

_________________
تالار اصول ->صفحه ها، مقالات و تاپیکهای مفید

ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ارسال ايميل
 

نويسنده
پيغام
شهروز
مدیر انجمن
مدیر انجمن


تاريخ عضويت: جمعه 16 مرداد 1383
تعداد ارسالها: 3277
محل سكونت: Germany


5 شنبه 30 فروردين 1386 - 14:20
پاسخ بصورت نقل قول
خيلي عالي بود.
روشي كه در اين مقاله توضيح داده شد به نظر من روش خيلي خوبي براي اين كار است.
منتظر مقاله هاي بعد و روش هاي بهتر هستم.

_________________




استدیوی نرم افزاری بلوبالک
www.Bluebulk.info
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ديدن وب سايت كاربر
 

نويسنده
پيغام
مصطفي سپهريان
پیر بازی سازی
پیر بازی سازی


تاريخ عضويت: جمعه 24 آذر 1385
تعداد ارسالها: 1147
محل سكونت: تو يه فلش مموري دو گيگ


5 شنبه 30 فروردين 1386 - 15:03
پاسخ بصورت نقل قول
احسان جان حالا كه بحث سر برخورد و تشخيص برخورد شد مي خوام بدونم مگه در ساخت بازي هاي سه بعدي يك مدل رو انتخاب نمي كنن كه با اون با خوردن بهش اين عمل انجام بشه... يا اينكه براي اون هم از تكنيك مكعب و ... استفاده ميشه؟!
آخه يه بازي سه بعدي ديدم كه اصلا توي اين زمينه خوب كار نكرده بود و بازيش خيلي تابلو شده بود... Very Happy

_________________
«پشتکار»«پشتکار»«پشتکار»
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ارسال ايميل ديدن وب سايت كاربر نام كاربري در پيغامگير Yahoo
 

نويسنده
پيغام
iran_adventure
مدیر انجمن
مدیر انجمن


تاريخ عضويت: شنبه 4 آذر 1385
تعداد ارسالها: 2066
محل سكونت: تهران


5 شنبه 30 فروردين 1386 - 18:44
پاسخ بصورت نقل قول
wow
خيلي عاليه . به احتمال زياد TGB هم از همين روش استفاده مي كنه در محيط ديباگ كه پليگان هاي برخورد رو نشون مي ده دور هر آبجكت يه دايره هم نشون مي ده . به نظر من دليل خطا در برخورد در سرعت بالا قبل از رسيدن 2 آبجكت به هم همينه يعني قبل از برخورد احتمال برخورد محاسبه مي شه و هيچ وقت 2 آبجكت روي هم نمي روند .

_________________
Make something happen
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ارسال ايميل نام كاربري در پيغامگير Yahoo
 

نويسنده
پيغام
mehdico
مدیر انجمن
مدیر انجمن


تاريخ عضويت: 2 شنبه 19 بهمن 1383
تعداد ارسالها: 1523
محل سكونت: اهواز


5 شنبه 30 فروردين 1386 - 20:40
پاسخ بصورت نقل قول
----------------=

قابل تحسین بود.

----------------=
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ارسال ايميل نام كاربري در پيغامگير Yahoo
 

نويسنده
پيغام
eta
مدیر سایت
مدیر سایت


تاريخ عضويت: 2 شنبه 27 تير 1384
تعداد ارسالها: 2153
محل سكونت: شاهين شهر


جمعه 31 فروردين 1386 - 09:54
پاسخ بصورت نقل قول
مرسی بچه ها شما به بنده واقعا لطف دارید Question
برای شهروز :
توی پروژه آزمایشی مون از یه روش ترکیب دیگه استفاده کردیم. که فکر میکنم اون رو هم برای بچه ها ارائه کنم. امیدوارم به دردشون بخوره.
و البته الگوریتمهای جدیدتر رو امیدوارم بعد از این که خودم درست یادشون گرفتم. به بچه ها نشون بدم.

برای مصطفی :
مصطفی جان متاسفانه من به اندازه ای که رو بازی دوبعدی کار کردم و توش اطلاعات دارم رو سه بعدی کار نکردم. اما در مورد تشخیص برخورد سه بعدی باید بگم که اونجا تنوع الگوریتمها بیشتره و مفاهیم ممکنه یه ذره متفاوت باشه. ولی خوب اولین و پیش پا افتاده ترین روش کره محصور کننده است که بسیار به دایره محصور کننده شبیهه. بعدش یه روشهایی هستش که برخورد رو بر اساس استخوانبندی مدل تشخیص میده و در نهایت روشهای پرهزینه ای هم وجود دارند. که از face ها برای تشخیص برخورد استفاده می کنند. راستی یه رشی هم علی آقا بهش اشاره کردن و اون اینه که با پخش یه سری شعاع های نوری(منظور همون خط راسته) اطراف یه آبجکت میشه امکان برخورد در لحضات بعدی رو تشخیص داد.ولی خوب منتظر مقالات برخورد سه بعدی هم باشید.(البته نه به زودی)
برای مجتبی :
والا قبلا هم گفتم که از موتور خاصی سر در نمیارم. اما این تلاش شما در کند و کاو و تطبیق مقالات با موتورهای خاص رو تحسین میکنم. اگرچه باید بگم اینایی که من میگم قطره ای از دریاست. و من از خیلی چیزها اطلاع ندارم و خیلی چیزهایی رو که اطلاع دارم برای حفظ سادگی مطلب نمی تونم بگم. بنابراین امکان بروز تناقض در حین این گونه تطبیق دادن ها وجود داره. اما در مورد اون دایره و چندضلعی باید بگم به نظر من هم به درد چیز دیگه ای نمی خورند. ولی خوب راهنمای نرم افزارها برای اینه که به نظر امثال من نیازی نباشه دیگه Rolling Eyes .

برای mehdico :
ممنون دوست عزیز.
راستی شما اسمت مهدیه دیگه؟

_________________
تالار اصول ->صفحه ها، مقالات و تاپیکهای مفید

ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ارسال ايميل
 

نويسنده
پيغام
iran_adventure
مدیر انجمن
مدیر انجمن


تاريخ عضويت: شنبه 4 آذر 1385
تعداد ارسالها: 2066
محل سكونت: تهران


جمعه 31 فروردين 1386 - 11:53
پاسخ بصورت نقل قول
نقل قول:

ولی خوب راهنمای نرم افزارها برای اینه که به نظر امثال من نیازی نباشه دیگه


چيزي در اين مورد ننوشته ...

_________________
Make something happen
ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ارسال ايميل نام كاربري در پيغامگير Yahoo
 

نويسنده
پيغام
eta
مدیر سایت
مدیر سایت


تاريخ عضويت: 2 شنبه 27 تير 1384
تعداد ارسالها: 2153
محل سكونت: شاهين شهر


جمعه 31 فروردين 1386 - 16:08
پاسخ بصورت نقل قول
عجب!!!

_________________
تالار اصول ->صفحه ها، مقالات و تاپیکهای مفید

ارسال  بازگشت به بالا
ديدن مشخصات كاربر ارسال پيغام خصوصي ارسال ايميل
 

نمايش نامه هاي ارسال شده قبلي:   
ارسال يك موضوع جديد   پاسخ به يك موضوع    صفحه 1 از 1 تمام ساعات و تاريخها بر حسب 3.5+ ساعت گرينويچ مي باشد


 
پرش به:  


شما نمي توانيد در اين انجمن نامه ارسال كنيد.
شما نمي توانيد به موضوعات اين انجمن پاسخ دهيد
شما نمي توانيد نامه هاي ارسالي خود را در اين انجمن ويرايش كنيد
شما نمي توانيد نامه هاي ارسالي خود را در اين انجمن حذف كنيد
شما نمي توانيد در نظر سنجي هاي اين انجمن شركت كنيد


unity3d

بازگردانی به فارسی : علی کسایی @ توسعه مجازی کادوس 2004-2011
Powered by phpBB © 2001, 2011 phpBB Group
| Home | عضويت | ليست اعضا | گروه هاي كاربران | جستجو | راهنماي اين انجمن | Log In |