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
*** کلیه حقوق مطالب این پست برای نویستده و سایت طراحان ایرانی محفوظ است و استفاده از آن با ذکر منبع بلا مانع است.*** |
_________________ تالار اصول ->صفحه ها، مقالات و تاپیکهای مفید
|
|