Перейти к содержанию

Долгий путь от Spherrra к Hexagon Area J


superregistr

Рекомендуемые сообщения

Опубликовано

Разработка графического движка Spherrra, ожидается, будет состоять из двух этапов:

 

Этап 1

1) создание сферы из динамических тайлов с уровнями детализации

2) позиционирование юнита на сфере

3) перемещение юнита в любом направлении

4) нахождение соседних юнитов с помощью радиусов видимости, а так же радиусы действия и радиусы расположения

 

Этап 2

1) создание ландшафтов: физическая карта

2) создание текстурного LOD

3) создание ландшафтов (продолжение): климатическая карта, природная карта

3) создание рек и озер

4) создание лесов

5) создание визуальной карты

6) генератор карты

 

 

Средства разработки: C++/OpenGL/Qt

No comments

Опубликовано

Этап 1

1) создание сферы из динамических тайлов с уровнями детализации

Этап 1, пункт 1 в свою очередь состоит из создания функций и алгоритмов. Сфера получается итерационным делением икосаэдра. Каждый треугольник или вершина на сфере имеют следующие координаты (номер слоя, номер в слое). Используя эти координаты можно получить порядковый номер треугольника или вершины. Треугольники и вершины закручиваются на сфере по правилу правого винта с севера на юг. Предполагается написание следующих функций:

* координата треугольника дает координаты 4 новых треугольников при делении

* координата треугольника дает координаты 3 своих вершин

* координата вершины дает координаты 6-5 своих треугольников

* (?) координата вершины дает свои сферические координаты в двух углах: тета и фи

No comments

Опубликовано

Движок допилил уже?

Чем анимацию делать будешь?

На чем оснуешь ИИ?

Насчет создания рек и озер. Это что- то вроде алгоритма,который я тебе на геймдеве предлагал,

Или все уложится в зарисовывание очертаний рек в редакторе?

Если добавить мой алгоритм, то рекки будут вести сябя так же как

в реальности, т. е. менять русло. :good:

Ведь развитие цивилизаций редко укладывается в промежуток меньше 5 тыс. лет.

Любая река за это время может даже начать впадать в другое море.

Опубликовано

Движок допилил уже?

Разработал функцию: * координата треугольника дает координаты 4 новых треугольников при делении

Сейчас делаю: * координата треугольника дает координаты 3 своих вершин

Но пока большее затруднение вызывает вот это: (?) координата вершины дает свои сферические координаты в двух углах: тета и фи

 

Чем анимацию делать будешь?

Не знаю, что посоветуешь?

 

На чем оснуешь ИИ?

Есть идея создание иерархического AI, каждый бот решает сугубо свою задачу и передает решение выше, самый высокий бот принимает окончательное решение. Не знаю, насколько это выполнимо.

 

Насчет создания рек и озер. Это что- то вроде алгоритма,который я тебе на геймдеве предлагал,

Или все уложится в зарисовывание очертаний рек в редакторе?

Если добавить мой алгоритм, то рекки будут вести сябя так же как

в реальности, т. е. менять русло. :good:

Ведь развитие цивилизаций редко укладывается в промежуток меньше 5 тыс. лет.

Любая река за это время может даже начать впадать в другое море.

Хотелось бы для начала создать простую модель, но так, чтобы ее можно было модернизировать в последствии.

No comments

Опубликовано
Ведь развитие цивилизаций редко укладывается в промежуток меньше 5 тыс. лет.

Любая река за это время может даже начать впадать в другое море.

Как мне видится, река математически будет представлять набор вершин. Чтобы можно было изменять русло, вершины нужно хранить не в векторе (QVector), а в списке (QList).

No comments

Опубликовано

Разработал функцию: * координата треугольника дает координаты 4 новых треугольников при делении

Вот исходный код: функция get4Triangles() в качестве аргумента берет номер слоя и номер в слое и возвращает через указатель номера слоев и в слоях новых 4-х треугольников. Функция нужна для LOD.

No comments

Опубликовано

У тебя ведь должен быть какой-то "нижний", самый мелкий уровень, на котором задаются физические характеристики тайлов (степь\горы\вода, например). Именно на этом уровне всё и будет работать, а остальное - это так, для "красоты", чтобы полетать над планетой

Опубликовано

У тебя ведь должен быть какой-то "нижний", самый мелкий уровень, на котором задаются физические характеристики тайлов (степь\горы\вода, например). Именно на этом уровне всё и будет работать, а остальное - это так, для "красоты", чтобы полетать над планетой

Немного тебя подправлю - самый высокий уровень детализации :) Остальные уровни нужны не только, чтобы полетать над планетой. Планета всегда строится из икосаэдра делением. Например, вы совершили поворот планеты на самом высоком уровне детализации, но тогда необходимо знать, какие тайлы видны на экране, а какие нет. И вот начинается деление икосаэдра - выбираются видные на экране его тайлы, они делятся, потом выбираются видные из них, потом они делятся и т.д., пока не будет достигнут нужный уровень детализации. Т.е. любое изменение камеры вызывает деление первоначального икосаэдра, а потом деление того, что получилось и т.д. :)

 

Более того, крупные тайлы будут использоваться в нахождении радиусов юнита.

 

Поправка: не в нахождении самого радиуса, а в нахождении того, что лежит в пределах этого радиуса.

No comments

Опубликовано

* координата треугольника дает координаты 3 своих вершин

Написана функция get3Vertices(), ее аргументом является координата (номер слоя, номер в слое) треугольника, через указатель она возвращает координаты (номера слоя, номера в слое) 3-х своих вершин.

No comments

Опубликовано

Тебе нужна помощь по графическому движку, или ты пока сам справляешься?

От помощи не отказываюсь) Пишу вот эту функцию:

* координата вершины дает координаты 6-5 своих треугольников

Так же придумал как по коодинате вершины (номер слоя, номер в слое) вычислить реальную декартову или сферическую координату вершины. Но увы нездоровится(

 

Можешь освоить технологию снятие и наложение текстуры в OpenGL? Или разобраться как устроены файлы .3ds и .blender, чтобы сделать загрузчик моделей? Или же придумать алгоритм как юнит будет понимать, что он вышел за пределы треугольника?

No comments

Опубликовано

* координата вершины дает координаты 6-5 своих треугольников

Написана функция get6Triangles(), ее аргумент координата вершины, через указатель она возвращает 6 координат треугольников. Критерий отличия 6 треугольников от 5 - последняя координата равна предпоследней.

No comments

  • 3 недели спустя...
Опубликовано

Описание функций:

 

st - номер слоя для треугольника

jt - номер в слое для треугольника

 

sv - номер слоя для вершины

jv - номер в слое для вершины

 

void get4Triangles(int st, int jt, int *st0, int *jt0, int *st1, int *jt1, int *st2, int *jt2, int *st3, int *jt3)

Определяет 4 новых треугольника при разбивке старого треугольника: st, jt - координаты старого треугольника; *st0, *jt0, *st1, *jt1, *st2, *jt2, *st3, *jt3 - координаты новых треугольников.

 

void get3Vertices(int st, int jt, int *sv0, int *jv0, int *sv1, int *jv1, int *sv2, int *jv2)

Определяет 3 вершины треугольника: st, jt - координаты треугольника; *sv0, *jv0, *sv1, *jv1, *sv2, *jv2 - координаты вершин треугольника.

 

void get6Triangles(int sv, int jv, int *st0, int *jt0, int *st1, int *jt1, int *st2, int *jt2, int *st3, int *jt3, int *st4, int *jt4, int *st5, int *jt5)

Определяет 6-5 треугольников вершины. Если 6-ого треугольника не существует, то 6-ой треугольник равен 5-ому -- это критерий отличия шестиугольника от пятиугольника. Треугольники закручиваются последовательно по правилу правого винта.

 

Чтобы рассчитать сферические координаты вершины есть два подхода: 1) итерационная разбивка - все стороны треугольника делятся пополам, потом вершины выносятся на сферу, операция повторяется 2) неитерационная разбивка - любая разбивка производится функционально на 20 треугольниках икосаэдра, далее вершины выносятся на сферу. 1-ый способ дает более красивую сферу, но чтобы его использовать необходимо итерационные разбивки сохранять в файл и потом грузить из файла: например при 8-ой разбивке сферические углы занимают уже(!) 5 МБ и увеличиваются каждый раз в 4 раза. 2-ой способ дает менее красивую сферу, но любые сферические координаты можно рассчитать динамически. Думаю, какой из способов лучше.

No comments

  • 1 месяц спустя...
Опубликовано

Доделал свой механизм. С динамическими тайлами и уровнями детализации.

 

Определение виден ли треугольник на экране или нет оставляет желать лучшего. Возможно, лучше переделать этот момент через буфер выбора или еще какой-нибудь буфер. Надо подумать.

 

2) позиционирование юнита на сфере

3) перемещение юнита в любом направлении

Приняты дискретные положения и перемещение по узлам.

No comments

  • 6 лет спустя...
Опубликовано

После нескольких лет молчания, хочу сообщить, что проект не закрыт, а делается понемногу. За это время пришло новое переосмысление, что и как нужно сделать. В качестве единицы поверхности выбрал шестиугольники, как интуитивно понятные человеку. Почти полностью переписал все алгоритмы. Теперь сфера вычисляется не итерационно, а с помощью поворотов. Выглядит так. Разбивки: 4, 5, 10, 20, 30, 40, 50

 

Разбивка 100 тоже шустро работает, но файл сюда не влез.

post-3864-1514490790_thumb.jpg

post-3864-1514490803_thumb.jpg

post-3864-1514490817_thumb.jpg

post-3864-1514490926_thumb.jpg

post-3864-1514490937_thumb.jpg

post-3864-1514491056_thumb.jpg

post-3864-1514491156_thumb.jpg

No comments

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
×
×
  • Создать...