Представлення сферичної карти


19

Моя остання гра відбудеться на маленькому планетоїді. Я шукаю гарну структуру даних для представлення комірок на поверхні сфери. Трикутники, квадрати, п'ятикутники, шестикутники? Який з них мінімізує розтягнення найбільше і створює найкращу плитку?

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

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

У грі є елементи RTS, тому я буду зберігати такі речі, як карти впливу та виконання A * наведення маршрутів та згортання, тому представлення повинно бути ефективним.


Наскільки важлива точна топологія карти, на відміну від того, щоб просто відпустити акторів в один бік і врешті-решт опинитися там, де вони почали? Найпростішим та найефективнішим поданням буде торус / пончик.
congusbongus

1
Так, я згадав сферичне картографування та проблеми, пов'язані з полюсами. Я хочу зберігати значення по всій поверхні, тому мені потрібно відображення від 3D поверхні поверхні до індексу масиву з якомога меншим розтягуванням.
DaleyPaley

Ви можете спробувати підрозділити тетраедон для створення сфери. Він складається з однакових за розміром і розподілених трикутників.
thalador

1
@thalador Дякую за пропозицію. Не впевнений, але я думаю, що ікосаедри краще, ніж тетраедри, якщо я йду трикутним шляхом. Але так чи інакше, тесселяція не є проблемою. Мене турбує ефективна індексація масиву.
DaleyPaley

Відповіді:


12

Гаразд, для всіх, хто цікавиться цією темою, я зараз детально опишу рішення, яке я обрав. Дякую кожному, хто відповів і дав мені ідеї.

По-перше, для «найкращого» тесселяції я виберу усічений ікосаедр як вихідну точку. Підрозділення його призводить до дуже приємної теселяції шестикутників з 12 п'ятикутниками, що забезпечують кривизну. Крім того, продовження підрозділу на його подвійне дасть мені дуже гарну трикутну сітку для візуалізації з приємними властивостями. Щодо 12-ти п'ятикутних комірок: я можу їх ігнорувати, робити їх спеціальними (як єдині місця, де можуть бути побудовані бази), або я можу заховати їх під пейзажем.

Гексагональної і п'ятикутні клітини будуть зберігатися в половині краю структури даних для легкого доступу до сусідів і швидкий обхід. Єдина складна частина - знайти, в якій клітині знаходиться дана точка світу, але це можна зробити, починаючи з випадкової комірки та йдучи до точки через сусідів.

Сподіваюся, хтось вважає цю інформацію корисною. Я багато чого навчився і з нетерпінням чекаю отримання певних результатів.

Редагувати:

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

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

підрозділ ікосаедра


7

Існує спосіб зробити це досить елегантно на основі підрозділу ікосаедра, як ви запропонували у своєму запитанні. Ікосаедр складається з 20 рівносторонніх трикутників, і ці трикутники можна згрупувати у 5 множин, де 4 трикутники у множині утворюють паралелограмову форму:

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

(Групи з чотирьох трикутників із прокрученою через них бігункою - це паралелограми, про які я говорю. Стрілки говорять про те, які краї було б склеєно, щоб скласти це в ікосаедр.)

Якщо ці трикутники поділити на менші трикутники, весь паралелограм можна проіндексувати, як n прямокутний масив n (4 у прикладі):

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

Числа в кожній комірці - це номери стовпців прямокутного масиву. Правила пошуку сусідів у масиві досить прості: горизонтальні сусіди - це лише плюс або мінус 1 стовпець, тоді як вертикальний сусід - це мінус один рядок і плюс один стовпець, або плюс один рядок і мінус один стовпець, залежно від того номер стовпця парний чи непарний відповідно.

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


Це справді дуже приємне представлення. Моє головне питання трикутних методів було підтриманням трикутних масивів та всім зшиванням. Тут ще є невеликий шматочок, але масиви прямокутні. Дякую, дуже добре знати
DaleyPaley

3

Хммм - коментарі щодо розтягування вказують на те, що ви рухаєтесь між сферичним та площинним картографуванням, ось що призводить до спотворень на полюсах

Якщо ви хочете, щоб плитка була рівною і рівномірною, ви правильні, що ікосаедр, а саме усічений ікосаед, є досить поширеним

Ви можете знайти всі різні відображення тут - сферичні багатогранники на wikipedia

Що стосується збереження зв’язків між обличчями, то це проблема топології - ви можете виявити корисними або крилатий, або чотиригранний край (і ви отримаєте чудову можливість зустріти цілком нову форму алгебри) Крилатий край


Ах, усічений ікосаедр. Так, саме це мені і потрібно. Спасибі. Крім того, хоча я ніколи не використовував крилату кромку, я багато використовував половину ребер для маніпуляції з сіткою, тому я добре розбираюся в цій області. Ура, я біля рішення.
DaleyPaley

2

Я думаю, я трохи пізно заходжу на вечірку, але ось можливе рішення, яке можна використати для підтримки сферичного світу довільної величини та рівномірного вигляду.

Тут важливо зрозуміти, що світ не рівний, і тому 100% рівномірне облицювання було б неможливим (це випливає з так званої теореми волохатого м'яча ). Деякі нерівності повинні бути допущені, і найкраще, на що ми можемо сподіватися, - це розподілити ці нерівності рівномірно по всій поверхні, зробивши кожну якомога меншою.

Це насправді досить легко зробити недетермінованим способом. Спочатку виберіть N випадкових точок рівномірно по поверхні. Переконайтесь, що ці точки справді однакові (див. Вибір точок сфери , формули 9-11). На другому кроці ми робимо ці точки менш випадковими та більш рівномірними: припустимо, що всі ці точки мають негативний електричний заряд, щоб вони відштовхували один одного. Моделюйте рух точок протягом декількох кроків, поки вони не перейдуть у стан рівноваги. Ця остаточна конфігурація точок дасть вам сітку, яка майже рівномірно розподілена по поверхні сфери.


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