Діагональна лінія зору з двома кутами


9

Зараз я використовую алгоритм лінійки Брезенама для огляду. Проблема в тому, що я знайшов крайній випадок, коли гравці можуть дивитись крізь стіни. Виникає, коли гравець дивиться між двома кутами стіни з зазором з іншого боку під певними кутами.

Корпус крапки прицілу

Я хочу, щоб плитка між двома стінами була позначена недійсною.

Бажаний результат

Який найшвидший спосіб змінити лінійний алгоритм Брезенама для вирішення цього питання? Якщо немає хорошого рішення, чи є більш підходящий алгоритм? Будь-які ідеї вітаються. Зверніть увагу, що рішення також має підтримувати 3d.

Редагувати: моє просте рішення - перевірити, чи закриваються обидва кути, коли змінюються координати лінії x і y рядка. Про робочий вихідний код та інтерактивну демонстрацію готового продукту див. На веб-сторінці http://ashblue.github.io/javascript-pathfinding/


2
Чи має значення це, якщо ви переключите початкову та кінцеву точку? Можливо, тоді ви могли просто прийняти результати, якщо обидва обчислення повернуть неперешкоджену зору зору. На RogueBasin ви також можете знайти корисні статті з LOS.
thalador

1
Так чи інакше, ці два діагоналі чорних блоків на 4-5 в першу чергу не з'єднані зі стіною, і я це кажу, тому що ви неявно дозволяєте рухатись по діагоналі. Ви повинні або відімкнути цю діагональ, щоб зробити її суміжною стіною, або зробити ходу ліній площею від її діагональних ходів, а не чисто діагональної, як 2-3 і 4-5.
Патрік Х'юз

Перегортання звучало як гарна ідея, але це не вирішує проблему. Єдине, про що я можу придумати, - це перевірити і перевірити, чи один з двох кутів порожній. Схоже, це дорого.
Попелясто-блакитний

5
"Здається дорого" ніколи не буває достатньо виправдання, щоб щось не спробувати. "Буде занадто дорого", як правило, припускаючи, що ви можете довести, що щось буде занадто повільним.
Мокоша

3
Зміни до необхідного алгоритму полягають у тому, що якщо і X, і Y змінюються на одному кроці, потім спочатку змінюють X, а потім змінюють Y, це повністю усуне діагоналі.
Патрік Хьюз

Відповіді:


7

Ерік Ліпперт написав чудову серію про створення прямолінійного огляду в C # з Shadow Shasting на прямокутній площинній сітці.

Серед інших питань Ерік займався різними питаннями, на які потрібно відповісти про вимоги до огляду, які дають різні результати, та наводить приклади пари різних результатів. В одній із статей глибоко йдеться про обставину "огляду за кутом", що сталася в ранній версії його алгоритму.

Я адаптував алгоритм Еріка до гексагональної сітки тут і успішно використовував його на великих шестикутних сітках (> 400 х 700) з великим радіусом видимості (> 60 шестигран). Ця реалізація обчислює і відображає повне поле зору так швидко, як я можу мигті, використовуючи один процесор i7. Це, безумовно, досить швидко для будь-яких застосувань, на які я сподіваюся застосувати його.

Оновлення - огляд лінії з висотою:
реалізація шестигранної сітки, пов'язаної вище, обчислює вигляд огляду з висотою, а не лише перешкодами. У документаційних записках також обговорюється додаткове рішення, яке необхідно прийняти стосовно розрахунків висоти: цільова висота та висота спостерігача. Вибір за замовчуванням полягає в тому, щоб обидва були рівними, що створює симетричне поле зору, але також можуть бути вибрані "земля-земля" та "очі-спостерігач-земля". (Код є відкритим кодом під ліцензією MIT)


Я справді копаю Shadow Casting, але я зіткнувся з проблемою. Не вдається знайти будь-яку інформацію щодо масштабування алгоритму для роботи з осі z. Вибачте, що згадую про це, але чи є у вас будь-які запропоновані ресурси для того, щоб він працював у 3d?
Попелястий блакитний

@AshBlue: див. Додаток вище
Пітер Геркенс

Я дивлюся на вашу кодову базу. У ньому є чудові речі, але я, здається, не знайшов алгоритм малювання ліній Брезена, адаптований до шестигранників. Ви робите це з LOS?
MLProgrammer-CiM

@EfEs: FieldOfView - повернутий об'єкт; ShadowCastingFov * .cs генерує поле зору, кидаючи тіні. Якщо у вас є конкретні запитання щодо коду, їх можна найкраще задати в розділі «Обговорення» на сайті; Більш загальні питання, які я із задоволенням відповідаю тут.
Пітер Геркенс

@PieterGeerkens Ви можете знайти тут питання gamedev.stackexchange.com/questions/57087 / ...
MLProgrammer-CIM

1

Що робити, якщо для обчислення LOS у вас є окрема сітка "з більшою роздільною здатністю", яка заповнює кутові прогалини. Я думав щось подібне:

введіть тут опис зображення

Зліва - оригінальний блок-секція з 4 квадратів.

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

Це означає, що простір координат є вчетверо, але я не думаю, що це є важливою проблемою продуктивності.


Досить впевнений, що вища роздільна здатність буде виглядати точно так само, як оригінал. При поділі сітки на меншу сітку ви отримуєте однакове візуальне зображення, лише з меншою сіткою. Кожен окремий квадрат просто стає 4 меншими квадратами в одному місці.
MichaelHouse

@ Byte56 Правильно, я мав на увазі, що після поділу його буде застосована додаткова логіка, щоб додати до зайвої блоки до цієї копії. Логіка зробити це - вправа, залишена читачеві.
Davy8

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