علم هیتباکسها و تشخیص برخورد: چگونه ریکستینگ و AABBها مرگ و زندگی مجازی را تعیین میکنند
هر مشت فرود آمده و هر هدشات از دست رفته، به هندسهای نامرئی وابسته است. در اینجا میبینیم که موتورهای بازی چگونه تشخیص برخورد را محاسبه میکنند و هزینه محاسباتی را در مقابل دقت پیکسلی متعادل میسازند.
به قلم آناهیتا یوسفی
این خبر را به اشتراک بگذارید
- معماران موتور
- اولویت دادن به کارایی محاسباتی و نرخ فریم پایدار بر دقت فیزیکی پیکسلی.
- توسعهدهندگان بازیهای مبارزهای
- استفاده از هیتباکسها و هارتباکسهای متمایز به عنوان ابزاری برای تعادلسازی، نه یک شبیهسازی فیزیکی دقیق.
- طراحان بازیهای تیراندازی تاکتیکی
- اتکا به ریکستینگ آنی و کپسولهای برخورد برای ایجاد گیمپلی واضح و پاسخگو.
آنچه نمیدانیم
- اینکه خطوط لوله تشخیص برخورد شتابیافته با GPU با چه سرعتی جایگزین بررسیهای سنتی حجمهای مرزی وابسته به CPU در عناوین رقابتی ورزشهای الکترونیک خواهند شد.
- آیا افزایش تولید انیمیشن مبتنی بر هوش مصنوعی، توسعهدهندگان را مجبور به بازطراحی اساسی نحوه طراحی هیتباکسهای پویا خواهد کرد یا خیر.
فینال بزرگ یک بازی مبارزهای اغلب با یک پیکسل تعیین میشود. صفحه نمایش روی یک ضربه حیاتی متوقف میشود. شمشیر از نظر بصری از بازوی حریف عبور میکند، اما هیچ آسیبی ثبت نمیشود. جمعیت از سردرگمی فریاد میزنند، مفسران برای توضیح تقلا میکنند و بازیکن مهاجم کنترلر خود را با ناباوری رها میکند. این یک گلیچ (Glitch) نیست؛ این واقعیت سرد و ریاضیاتی تشخیص برخورد است.
هر بار که یک ضربه شمشیر به هدف میخورد، یک گلوله فرود میآید، یا یک پرش پلتفرمینگ به سختی از لبهای عبور میکند، موتور بازی همان سؤال خاموش را میپرسد: آیا این شکل، آن شکل را لمس کرد؟ پاسخ از هیتباکسها (Hitboxes) میآید، هندسههای نامرئی که فضای تعاملی را تعریف کرده و قوانین فیزیک مجازی را دیکته میکنند.[3][5]
مدل بصری شخصیت – مش (Mesh) با وضوح بالا که دارای هزاران چندضلعی، زرههای پیچیده و پارچههای روان است – تنها یک لباس است. بدن واقعی که موتور بازی به آن اهمیت میدهد، از اشکال ریاضیاتی اولیه ساخته شده است. درک نحوه عملکرد این اشکال، لایهای از طراحی را آشکار میکند که اکثر بازیکنان آن را حس میکنند اما هرگز نمیبینند.[5]
دلیل اینکه توسعهدهندگان از مدل بصری شخصیت برای تشخیص برخورد استفاده نمیکنند، به هزینه محاسباتی خام بازمیگردد. اگر یک بازی هزاران جسم در شبیهسازی داشته باشد، بررسی هر چندضلعی در برابر هر چندضلعی دیگر، پیچیدگی محاسباتی O(n²) ایجاد میکند. تعداد تستهای جفتی به صورت درجه دوم افزایش مییابد، که فوراً موتور را از کار میاندازد.[1]
در یک بازی مدرن که با نرخ ۶۰ فریم در ثانیه اجرا میشود، CPU تنها ۱۶.۶ میلیثانیه فرصت دارد تا فیزیک، هوش مصنوعی، ورودی بازیکن و رندرینگ را محاسبه کند. محاسبه برخوردهای دقیق مش برای هزاران شیء در این بودجه سخت، غیرممکن است. برای بقا، توسعهدهندگان با استفاده از حجمهای مرزی سادهشده (bounding volumes) به شدت میانبر میزنند.[6]
به جای مشهای پیچیده، موتورها به اشکال ساده متکی هستند. رایجترین آنها جعبه مرزی تراز با محور (Axis-Aligned Bounding Box یا AABB) است. AABB یک مستطیل یا مکعب ساده است که کاملاً با محورهای X، Y و Z جهان تراز باقی میماند، صرف نظر از اینکه شخصیت درون آن چه کاری انجام میدهد.[2][4]
بررسی برخورد AABB فوقالعاده سریع است. موتور به سادگی بررسی میکند که آیا فواصل در امتداد هر محور همپوشانی دارند یا خیر. اگر لبه راست جعبه A از لبه چپ جعبه B عبور کرده باشد و محورهای عمودی آنها نیز تلاقی داشته باشند، برخورد ثبت میشود. این کار فقط به محاسبات پایه نیاز دارد و آن را به ستون فقرات بازیهای پلتفرمر ۲ بعدی و سیستمهای رابط کاربری (UI) تبدیل میکند.[2]
با این حال، AABBها یک نقص مهلک دارند: آنها نمیتوانند بچرخند. هنگامی که یک شخصیت به جلو خم میشود، AABB آن باید به طرز نامناسبی گسترش یابد تا ژست جدید را در بر بگیرد، و فضای خالی نامرئی ایجاد میکند که در آن بازیکن میتواند مورد اصابت قرار گیرد، با وجود اینکه از نظر بصری از حمله جاخالی داده است.[1][2]
با این حال، AABBها یک نقص مهلک دارند: آنها نمیتوانند بچرخند.
برای حل این مشکل، توسعهدهندگان از جعبههای مرزی جهتدار (Oriented Bounding Boxes یا OBBs) یا کپسولهای برخورد (Capsule colliders) استفاده میکنند. یک OBB میتواند همراه با شخصیت بچرخد و دقت بسیار بالاتری برای اندامها و سلاحها ارائه دهد، اگرچه به ریاضیات پیچیدهتری نیاز دارد – که اغلب از قضیه محور جداکننده (Separating Axis Theorem یا SAT) برای بررسی همپوشانیها استفاده میکند.[7]
تقریباً تمام بازیهای تیراندازی اول شخص (FPS) که در دو دهه اخیر توسعه یافتهاند، از کپسولهای برخورد برای حرکت بازیکن استفاده میکنند. یک کپسول – استوانهای با کلاهکهای کروی – از نظر ریاضیاتی ظریف است. موتور فقط باید فاصله از یک پارهخط مرکزی تا شعاع کپسول را بررسی کند، که آن را برای حرکت در زمینهای ناهموار بدون گیر کردن در گوشهها عالی میسازد.[4][6]
در دنیای فوقالعاده دقیق بازیهای مبارزهای ۲ بعدی، توسعهدهندگان این اشکال را به دستههای متمایز تقسیم میکنند. یک «هارتباکس» (Hurtbox) شکل غیرفعالی است که بدن آسیبپذیر شخصیت را نشان میدهد، در حالی که یک «هیتباکس» (Hitbox) شکل فعالی است که آسیب وارد میکند.[5]
این تمایز حیاتی است زیرا این دو شکل طول عمر کاملاً متفاوتی دارند. هارتباکس در هر فریمی که شخصیت زنده است وجود دارد. اما هیتباکس ممکن است تنها برای ۳ تا ۵ فریم – تقریباً ۵۰ تا ۸۰ میلیثانیه – وجود داشته باشد و سپس ناپدید شود.[5]
هنگامی که یک بازیکن مشت میزند، موتور یک هیتباکس متصل به مشت ایجاد میکند. اگر آن هیتباکس با هارتباکس حریف همپوشانی داشته باشد، موتور یک رویداد برخورد را فعال میکند که منجر به آسیب، گیجی (Hitstun) و جلوههای ذرات میشود.[3][5]
بازیهای تیراندازی تاکتیکی لایه دیگری از پیچیدگی را معرفی میکنند: ریکستینگ (Raycasting). هنگامی که یک بازیکن با یک سلاح «هیتاسکن» (Hitscan) مانند تفنگ تکتیرانداز شلیک میکند، بازی یک گلوله فیزیکی ایجاد نمیکند. در عوض، یک پرتو ریاضیاتی نامرئی را مستقیماً از لوله تفنگ به جلو پرتاب میکند.[1]
سپس موتور بررسی میکند که آیا این پرتو در طول مسیر خود با کپسولهای برخورد دشمن تلاقی دارد یا خیر. از آنجایی که ریکستینگ آنی است، گیمپلی واضح و پاسخگویی را ایجاد میکند که ورزشهای الکترونیک مدرن را تعریف میکند، اگرچه برای اطمینان از اینکه آنچه تیرانداز میبیند با واقعیت سرور مطابقت دارد، نیاز به جبران تأخیر (lag compensation) پیچیدهای دارد.[6]
پرتابههای با سرعت بالا یک مشکل فیزیکی منحصر به فرد به نام «تونلزنی» (Tunneling) را معرفی میکنند. اگر گلولهای به اندازه کافی سریع حرکت کند، ممکن است در فریم ۱ در یک طرف یک دیوار نازک و در فریم ۲ در طرف دیگر آن وجود داشته باشد. از آنجایی که تشخیص برخورد گسسته (discrete) فقط همپوشانیها را در لحظات خاصی از زمان بررسی میکند، گلوله به طور کامل از دیوار عبور میکند.[1]
برای جلوگیری از تونلزنی، موتورها از تشخیص برخورد پیوسته (Continuous Collision Detection یا CCD) استفاده میکنند. CCD به جای بررسی موقعیتهای ایستا، زمان برخورد را با جارو کردن شکل شیء در امتداد مسیر آن محاسبه میکند و کسری دقیق از میلیثانیه را پیدا میکند که در آن فاصله بین دو جسم به صفر رسیده است.[7]
در نهایت، تشخیص برخورد یک شاهکار مصالحه است. توسعهدهندگان باید دائماً تقاضای بازیکن برای دقت پیکسلی کامل را در برابر تقاضای سختافزار برای کارایی محاسباتی متعادل کنند. دفعه بعد که از یک هدشات به اندازه یک میلیمتر جان سالم به در بردید، از هندسه نامرئی که سرنوشت شما را تعیین کرد، تشکر کنید.[6]
چرا مهم است
تنها یک پیکسل همپوشانی، سرنوشت تورنمنتهای میلیون دلاری ورزشهای الکترونیک (Esports) را تعیین میکند. درک اینکه موتورهای بازی چگونه این برخوردهای نامرئی را محاسبه میکنند، نشان میدهد که چرا شلیکهای شما خطا میروند و چرا توسعهدهندگان باید سرعت محاسباتی را بر دقت بصری کامل اولویت دهند.
منابع
[1]Wikipediaمعماران موتورCollision detection
مطالعه در Wikipedia →
[2]LearnOpenGLمعماران موتورCollision detection
مطالعه در LearnOpenGL →
[3]Valve Developer Communityطراحان بازیهای تیراندازی تاکتیکیHitbox
مطالعه در Valve Developer Community →
[4]Unity Documentationطراحان بازیهای تیراندازی تاکتیکیBoxCollider
مطالعه در Unity Documentation →
[5]The Fighting Game Glossaryتوسعهدهندگان بازیهای مبارزهایHitbox
مطالعه در The Fighting Game Glossary →
[6]تیم سردبیری کوهستانمعماران موتورتحلیل تیم سردبیری کوهستان
مطالعه در تیم سردبیری کوهستان →
[7]GitHubمعماران موتورqu3e: A compact, light-weight and fast 3D physics engine in C++
مطالعه در GitHub →
نظرات
هر زاویه. هر روز.
دریافت بازی و ورزشهای الکترونیک اخبار همراه با پوشش کامل منابع و تحلیل دیدگاهها، مستقیم در صندوق ورودی شما.
