Який найефективніший спосіб знайти місце перетину ракети та ракетного рельєфу?


10

Після мого попереднього запитання про пошук схилу двовимірної растрової місцевості мені тепер потрібно знати найкращий спосіб пошуку точки на 2D місцевості, в яку потрапила ракета. Очевидно, я бачу, чи перетинаються місцевості пікселі під ракетою, але скажу, що вона просунулася досить глибоко в місцевість.

Який найкращий спосіб відступити назад, щоб знайти місце, де воно спочатку зіткнулося? Я міг би рухатись назад пікселями X назустріч попередньому положенню ракети, але що було б гарним значенням X? А чи є розумніший спосіб? Можливо, переміщення на половину відстані, потім на чверть тощо?


Явище, яке ви описуєте, зазвичай називають "тунельним", і найкращий спосіб впоратися з ним - це запровадити тест розгортки - як TetraD та JasonD обоє згадували нижче.
jpaver

просто кажучи "тестова перевірка" насправді мені не допомагає. Як це зробити з растровою місцевістю?
Ієн

Пропозиція Джейсона, здається, найкраще мені: один піксель.
jpaver

Відповіді:


3

Для тестування на зіткнення не слід проводити статичне тестування "тик-на-тик", ви повинні робити тести на простеження / зачитування.

Тут вичерпний перелік різних формул для різних видів примітивів: http://www.realtimerendering.com/intersections.html

Це, звичайно, якщо припустити, що ви можете розбити свою місцевість на якийсь набір примітивів, на який ви можете протестувати (тобто сегменти лінії). Існують різні способи зробити це.

Дивіться також це питання (лише злегка пов'язане): Який хороший алгоритм виявлення зіткнення між рухомими сферами?


Я думав про руйнувальну місцевість растрових зображень, як у Worms. Чи можете ви динамічно генерувати примітиви з растрової карти чи це буде занадто шалено?
Ієн

1
Я впевнений, що можна, але це може бути легше / швидше просто зробити піксель шляхом тестування пікселів для довільної растрової карти.
Тетрад

З ЧЕТВЕРТОЮ !! (так це не візьметься назавжди)
bobobobo

3

Бінарний пошук не допоможе, якщо у вас є тонкі шматочки декорацій і швидко рухаються снаряди - ви можете їх пропустити.

Я думаю, що ваш найкращий варіант - провести лінію по передній частині снаряда по шляху, який він проходить, піксель за раз. Ви можете зробити обмежувальну перевірку спочатку на весь том, щоб не робити це кожен крок.


Що таке двійковий пошук?
Iain

1
Вибачте - бінарний пошук - це більш-менш те, про що ви говорили у питанні. Ви починаєте з середини та ділите простір пошуку на два, поки не сходитесь з відповіддю. У багатьох випадках це оптимально, але у вашому випадку це не спрацює (ви можете повністю пропустити правильну відповідь).
JasonD

3

Оскільки ракета навряд чи перемістить величезну кількість пікселів у кожному кадрі (це не було б гладко на екрані), я не бачу причин не просто перевіряти кожен піксель на шляху. Лінійний алгоритм Bressenham - це ваш друг, і переконайтеся, що ви також отримали локальну копію растрової карти, оскільки ви, як правило, не бажаєте отримувати доступ до відеопам'яті на кожен піксель. Це якщо припустити, що ваші растрові місцевості є повністю випадковими (відповідно до руйнуючих черв'яків). Якщо ваш світ заснований на плитці, ви можете пропустити кожну плитку, яку ви знаєте, для початку порожня, але, як згадувалося раніше, якщо ви не маєте величезну кількість ракет, щоб перевірити, я не міг придумати платформу, яка потребуватиме занадто повільно просто тестувати піксель за пікселем, і вам не потрібно буде визначати свій світ у примітивах (клон черв'яків зробить це хитро)


так, я думав про черв'яківську місцевість. Чи можете ви поділити його на плитки динамічно, а потім просто позначити порожні плитки, щоб їх не перевіряли? Якби відразу було багато ракет, можливо, це трохи пришвидшило б справи?
Ієн

Отже, ви думаєте, я мав би рухатись пікселем уперед за пікселем, перевіряючи перехрестя, а не відступаючи назад?
Iain

Я думаю, що всі три відповіді запропонували пошук вперед. Перевірка назад не спрацює, якщо крок вперед змусить її пропустити певний пейзаж.
JasonD

Так, безумовно вперед.
Кай

1

На додаток до інших відповідей, ви можете зробити деякі заходи, щоб прискорити це, якщо ви хочете зробити трохи бухгалтерського обліку щодо "збору" купки пікселів у блоки "відомого подібного стану". Наприклад, ви могли б зберігати висоту найвищого рельєфу місцевості, тож ви можете вважати, що ракета нічого не вдарить, поки вона вище цього. Ви також можете зберігати висоту найнижчого "повітряного" простору, тож ви знатимете, що якщо ракета потрапить на таку висоту, вона, мабуть, щось вдарила (хоча це, можливо, найкраще використовувати в якості перевірки стану безпеки). Подальше від цього ви можете зберігати прямокутники, що представляють усі місцевості та інші прямокутники, які є все повітряними, але це може бути більшою роботою, ніж цінністю.

Зрештою, найкращим методом, мабуть, буде "зберігання висоти кожного стовпчика місцевості", а потім просто обчислення висоти ракети на кожному кроці її шляху. Я не можу розмовляти з більш сучасними іграми, але я вважаю, що коли ви зробили "печеру" на обгорілій Землі, місцевість над цією печерою впала прямо вниз, не залишаючи надвісів. Якщо ви хочете, щоб завіси були, роботи будуть трохи більше, але це буде продовженням цієї основної ідеї. (Підказка: спочатку довідайтесь основну ідею!)

Оскільки ваша місцевість, мабуть, абсолютно довільна, ярликів немає. Навіть якщо ви змусили свою місцевість бути сплайною чи щось подібне, це засмутиться, коли ви почнете її руйнувати, і тести на перехрестя ліній оциліндрів будуть ітеративними та не досконалими або вичерпними та безглуздо повільними для вашого типу проблем.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.