|
Еще немного идей и предложений
|
|
| ABetc | Дата: Суббота, 30.07.2016, 21:43 | Сообщение # 556 |
Космический турист
Группа: Пользователи
Российская Федерация
Сообщений: 36
Награды: 0
Статус: Offline
| Возникла идея. Интересна для тех, кто предпочитает, найдя интересную планету, "обживаться" на ней.
Рисовалка созвездий.
2 режима, которые могут работать одновременно. 1. Соединять линиями звёзды 2. Очерчивать границы созвездий. Как известно, сейчас принято границы созвездий составлять из линий 2 видов: постоянного восхождения и постоянного склонения. Вполне подходящий вариант. Карта созвездий сохранялась бы как личная настройка с возможностью импорта/экспорта. 3. Ну и названия давать, включая греческие обозначения Что же касается рисунков, лично мне это не очень интересно, но наверное кому-то тоже понравилось бы :)
Видимо, в рисовалке должен быть запрет на компоненты своей кратной системы.
Кольца планет - это диски, на которые предыдущие цивилизации записали всю свою историю и как они довели планету до такого состояния...))
|
|
|
| |
| ABetc | Дата: Суббота, 30.07.2016, 23:34 | Сообщение # 557 |
Космический турист
Группа: Пользователи
Российская Федерация
Сообщений: 36
Награды: 0
Статус: Offline
| Цитата SpaceEngineer (  ) Ещё, ненаправленные источники освещения сделать непросто - надо реализовывать хитрые модели Обнаружил в настройках параметр "подсветка". В принципе, можно было бы использовать его. До величин 0.02 хотя бы.
Кольца планет - это диски, на которые предыдущие цивилизации записали всю свою историю и как они довели планету до такого состояния...))
|
|
|
| |
| SpaceEngineer | Дата: Воскресенье, 31.07.2016, 00:46 | Сообщение # 558 |
Автор Space Engine
Группа: Администраторы
Российская Федерация
Сообщений: 5547
Награды: 55
Статус: Offline
| Цитата ABetc (  ) Подавить вероятность генерации в трёхмерных полостях. Решаема ли задача? По идее, да. Существует такая тема, как диаграмма Вороного. Можно её перенести на 3D. Оно так и работает сейчас в SE. Проблема - подобрать более-менее реалистичную фрактальную функцию (функцию, в которой участвует тот самый вороной). Если зашкаливать коэффициенты плотности, чтобы волокна были более узкие, то это оверкилл: 99,9% сгереренных точек попадут в полости и не дадут галактик, а процессорное время уже сожрано. Ведь самая тяжелая функция - фрактал от вороного - вызывается для всех точек. Как иначе узнать, попала точка в полость или в волокно?
Цитата ABetc (  ) Но ведь откуда-то движок знает, какие звёзды нарисовать на небе? Причём берёт самые яркие, а не по расстоянию. И делает это быстро. Почему бы не воспользоваться как раз этими данными? Для этого нет механизма в движке. Надо добавлять какой-то буфер или кэш объектов окружения. Потом его ещё и сортировать, чтобы выбрать самые яркие. Опять же, все равно будет ограничение на их количество. Нет, я буду делать, как обычно поступают в графике: рендерить небо в текстуру-скайбокс, а далее сферические гармоники или что-то подобное. Для кораблей всё равно придётся это делать, для реалистичного освещения.
Цитата ABetc (  ) Либо проще. Расставляем точки скоплений и их веса. На линиях, соединяющих соседние точки (ну тут можно поиграться), генерим галактики. Всё. Тем более что скопления уже известны некоторые. Тоже покажу моделирование потом. Ага, а теперь надо учесть, что галактики генерируются блоками. Вот есть куб с ребром s в координатах xyz. Задача - сгенерировать в нем галактики. Желательно ещё и со спутниками. Ни о каких точках и линиях куб не знает. Алгоритму вообще должно быть все равно, где куб находится. Он может брать только данные из куба-родителя, если надо (ах да, это octree, 8 кубов вложены в куб большего размера, где генерируются более яркие галактики).
|
|
|
| |
| ABetc | Дата: Воскресенье, 31.07.2016, 01:44 | Сообщение # 559 |
Космический турист
Группа: Пользователи
Российская Федерация
Сообщений: 36
Награды: 0
Статус: Offline
| Цитата SpaceEngineer (  ) Алгоритму вообще должно быть все равно, где куб находится. Но алгоритму не должно быть всё равно, каков размер куба. Т.к. структура имеет вполне определённый диапазон масштаба. Значит, только при определённых размерах запускать алгоритм...
Ну и вопрос. Менять сам подход уже невозможно? Чтобы не octree использовать, а другой алгоритм. Неужели не делается какая-либо стыковка этих кубов между собой? И каждый куб совершенно изолирован параметрически от других? Тогда делать волокна действительно сложно.
Кольца планет - это диски, на которые предыдущие цивилизации записали всю свою историю и как они довели планету до такого состояния...))
|
|
|
| |
| ABetc | Дата: Воскресенье, 31.07.2016, 02:29 | Сообщение # 560 |
Космический турист
Группа: Пользователи
Российская Федерация
Сообщений: 36
Награды: 0
Статус: Offline
| Цитата Нельзя не отметить и пустоты, которые ограничивают видимое распределение галактик. Они, как правило, имеют грубо сфероидальную форму и соединяются друг с другом. Спектр их размеров простирается от сотней км/с до 10000 км/с. В этих областях плотность галактик на порядки меньше средней, либо они там и вовсе отсутствуют.
Отсюда.
Можно ли в каждом кубе генерить галактики просто на поверхности таких сфер плюс минус шумовая составляющая?
И далее.
Цитата на каком масштабе Вселенную можно считать однородной? Обзоры близкой Вселенной указывали на существование структур больших 10000 км/с. ... создается впечатление, что однородность достигается на шкале около 20000 км/с.
И там же см. картинки. В принципе, в пределах 1 куба генерировать неоднородности по любому "правдоподобному" алгоритму - и этого достаточно?
Кольца планет - это диски, на которые предыдущие цивилизации записали всю свою историю и как они довели планету до такого состояния...))
Сообщение отредактировал ABetc - Воскресенье, 31.07.2016, 02:32 |
|
|
| |
| SpaceEngineer | Дата: Воскресенье, 31.07.2016, 11:50 | Сообщение # 561 |
Автор Space Engine
Группа: Администраторы
Российская Федерация
Сообщений: 5547
Награды: 55
Статус: Offline
| Это особенность процедурной генерации. Генератор должен выдавать значение функции в точке сразу, желательно очень быстро. Тут не годятся сложные алгоритмы типа сделать 1000 итераций релаксации или N-body симуляции, причём где надо брать объём, заведомо больший, чем объём данного куба, иначе на границах будет нестыковка с соседними. То же самое касается ландшафта планет - обработать его фильтрами, имитирующими эрозию, можно, но придётся захватывать и соседние квады - иначе на границах будет неправильно. Я собираюсь это реализовать в будущем, всё-таки без эрозии реализма не добиться. Можно и с галактиками так поступить - делать 10-20 итерций взаимного притяжения, тогда волокна и скопления станут более выраженными. Пока не задумывался, что там с граничными условиями.
|
|
|
| |
| ABetc | Дата: Воскресенье, 31.07.2016, 18:20 | Сообщение # 562 |
Космический турист
Группа: Пользователи
Российская Федерация
Сообщений: 36
Награды: 0
Статус: Offline
| SpaceEngineer, какие именно значения должна выдавать функция? Координаты очередного объекта? (Говорим о галактиках)
Кольца планет - это диски, на которые предыдущие цивилизации записали всю свою историю и как они довели планету до такого состояния...))
Сообщение отредактировал ABetc - Воскресенье, 31.07.2016, 18:21 |
|
|
| |
| SpaceEngineer | Дата: Понедельник, 01.08.2016, 00:51 | Сообщение # 563 |
Автор Space Engine
Группа: Администраторы
Российская Федерация
Сообщений: 5547
Награды: 55
Статус: Offline
| Если бы выдавала координаты, это было бы вообще шикарно. Сейчас функция выдаёт вероятность появления галактики в данной точке. Соответственно алгоритм генерации такой: сгенерировать N точек, случайно равномерно распределенных в кубе; вызвать функцию для каждой точки, сгенерировать случайное число и сравнить со значением функции: если меньше, галактика есть, если больше - переходим к следующей точке.
|
|
|
| |
| ABetc | Дата: Понедельник, 01.08.2016, 19:14 | Сообщение # 564 |
Космический турист
Группа: Пользователи
Российская Федерация
Сообщений: 36
Награды: 0
Статус: Offline
| Цитата SpaceEngineer (  ) Проблема - подобрать более-менее реалистичную фрактальную функцию (функцию, в которой участвует тот самый вороной). Если зашкаливать коэффициенты плотности, чтобы волокна были более узкие, то это оверкилл: 99,9% сгереренных точек попадут в полости и не дадут галактик, а процессорное время уже сожрано. Ведь самая тяжелая функция - фрактал от вороного - вызывается для всех точек. Как иначе узнать, попала точка в полость или в волокно?
Вот здесь есть зацепки.
Значит, уже есть функция принадлежности координат волокну? Обозначу как р(а). И явно она не двоичный результат возвращает, а вещественное число? Чтобы сравнивать с порогом. А что если сделать иначе? Ещё на этапе:
Цитата SpaceEngineer (  ) сгенерировать N точек, случайно равномерно распределенных в кубе Но генерировать иначе: 1. Генерируем точку. 2. Генерируем пороговую величину: случайную, но не равномерную. 3. Если функция принадлежности даёт величину выше пороговой, идём к п. 1, а точку не ставим. Всего скажем 3 таких итерации. Если ниже пороговой - ставим галактику. Если за 3 итерации не прошли под пороговую - не ставим точку. 4. Идём к п.1 за новой точкой. Таким образом мы: 1. Не ставим лишних точек, которые потом не используются, не занимаем память. 2. Избавляемся от задирания плотности а значит и от генерёжки кучи лишних точек. 3. Точки кучкуются ближе к волокнам, что нам и надо. Играемся с параметрами, получаем результат.
Или так. 1. Генерим энное кол-во точек, проверяя значение р(а), пока не попадём ниже некоторого порога (параметр b). Значит, мы попали вблизи волокна. 2. Берём эту точку за отсчёт и собираем множество точек таким образом:
1) Генерим 8 точек в вершинах куба с некоторой стороной (параметр c), центр куба - наша нынешняя точка. 2) Берём вершины куба и ищем 2 точки с минимальными значениями р(а). 3) При этом все такие точки запоминаются, чтобы не вызывать тяжёлую функцию р(а) лишний раз. Поэтому в 2) мы ищем минимумы среди ещё не найденных точек (не записанных в массив). 4) Если среди новых точек нет подпороговых (слишком далеко от волокна), не продолжаем алгоритм. 5) Повторяем процедуру. Таким образом мы имеем множество точек, связанных между собой определённым шагом. 6) Берём эти точки и с шумовой поправкой разбрасываем желаемое количество галактик вокруг. Всё! При этом шумовая поправка штука очень гибкая и интересная. Она может и должна зависеть от р(а): чем ниже величина, тем больше плотность. Ну и задействовать в ней функции от равномерной случайной величины. Чтобы получать более "комковатую" структуру волокон, например.
Ориентиром результата может быть например вот эта картинка: https://upload.wikimedia.org/wikiped....rus.gif
Ну и ещё идейка. С некоторой натяжкой такая "пенистая" структура - это суперпозиция колебаний, т.е. функций вида cos®, r - линейная или какая-то другая функция радиус-вектора. Складываем эти колебания, возведя предварительно в какие-то степени, чтобы "прижать" косинус к 1, а точнее, 1-((1+cos®)/2)^k, чтобы уж нормировано было. Тогда получаем вот такие подобные как на картинке максимумы, которые имеют некоторую геометрическую структуру. Играясь с фазой и периодом колебаний, можно получать волокна безо всяких фракталов. Более того. Это может быть функция, задающая смещение точек. И тогда действительно мы бросаем случайные точки, пропускаем их через функцию, получаем смещённые точки сразу готовые. Ну это поле для экспериментов.
Кольца планет - это диски, на которые предыдущие цивилизации записали всю свою историю и как они довели планету до такого состояния...))
Сообщение отредактировал ABetc - Понедельник, 01.08.2016, 19:16 |
|
|
| |
| ABetc | Дата: Понедельник, 01.08.2016, 19:27 | Сообщение # 565 |
Космический турист
Группа: Пользователи
Российская Федерация
Сообщений: 36
Награды: 0
Статус: Offline
| Функция смещения точек может быть вообще очень забавной: это просто векторная сумма r/r^3 - расстояний от предварительно набросанного небольшого количества центров полостей до текущей равномерно случайно брошенной точки. Ну можно играться степенями и коэффициентами, весами этих центров полостей, шумовыми поправками. Таким образом каждая точка "отталкивается" - куда? - правильно, к периферии каждой из полостей. Можно в несколько итераций каждую точку так. Ну и там - галактика.
И между прочим, этот подход может быть очень близок к реальной физике образования нынешней структуры! Что там у нас говорится о тёмной энергии? Отрицательная гравитация? Так может быть полости - это и есть скопления отталкивающей тёмной энергии? Моделирование покажет.
Кольца планет - это диски, на которые предыдущие цивилизации записали всю свою историю и как они довели планету до такого состояния...))
|
|
|
| |
| KostaR_Max | Дата: Вторник, 02.08.2016, 00:16 | Сообщение # 566 |
Космический турист
Группа: Пользователи
Российская Федерация
Сообщений: 20
Награды: 0
Статус: Offline
| Так ведь говорят что темная материя находится в большом колличестве в самих галактиках, что объясняет одинаково равномерную скорость вращения звезд вокруг ядра по всему радиусу галактики. Или же темная материя и энергия это разные вещи?
|
|
|
| |
| mrdvorchuk | Дата: Вторник, 02.08.2016, 00:22 | Сообщение # 567 |
Исследователь
Группа: Пользователи
Пират
Сообщений: 195
Награды: 1
Статус: Offline
| Цитата KostaR_Max (  ) Или же темная материя и энергия это разные вещи? Да. Темная материя обладает массой и таким образом сдерживает галактик не давая ей разлетаться. Тёмная энергия - это нечто, которая наоборот расширяет вселенную.
«…и если долго всматриваться в бездну, бездна тоже начнёт всматриваться в тебя» Фридрих Ницше
|
|
|
| |
| SpaceEngineer | Дата: Вторник, 02.08.2016, 11:29 | Сообщение # 568 |
Автор Space Engine
Группа: Администраторы
Российская Федерация
Сообщений: 5547
Награды: 55
Статус: Offline
| Цитата ABetc (  ) 1. Генерируем точку. 2. Генерируем пороговую величину: случайную, но не равномерную. 3. Если функция принадлежности даёт величину выше пороговой, идём к п. 1, а точку не ставим. Всего скажем 3 таких итерации. Если ниже пороговой - ставим галактику. Если за 3 итерации не прошли под пороговую - не ставим точку. 4. Идём к п.1 за новой точкой. Оно так и работает. Это я упрощенно написал, что якобы сначала генерируется N точек, а потом считается функция плотности для каждой. На самом деле это происходит одновременно в цикле, но не суть. В любом случае вам не избавиться от вызова функции плотности N раз, а функция эта тяжелая, спасает только наличие многих ядер в процессоре (оно распараллелено, движок генерирует одновременно много кубов галактического octree).
Цитата ABetc (  ) Или так. 1. Генерим энное кол-во точек, проверяя значение р(а), пока не попадём ниже некоторого порога (параметр b). Значит, мы попали вблизи волокна. 2. Берём эту точку за отсчёт и собираем множество точек таким образом:
Это может прокатить, но не получится ли то же самое, если тупо вместо 1 галактики ставить 10 вокруг найденной точки?
Цитата ABetc (  ) Таким образом каждая точка "отталкивается" - куда? - правильно, к периферии каждой из полостей. Можно в несколько итераций каждую точку так. Ну и там - галактика. Тут проблема как и с эрозией - придётся генерировать и соседние кубы. Ведь точка может как выползти за пределы данного куба, так и вползти в него из соседнего. Это оверхед, и придётся подбирать функцию так, чтобы точки не могли уползать дальше, например, одного дополнительного куба.
|
|
|
| |
| ABetc | Дата: Вторник, 02.08.2016, 11:57 | Сообщение # 569 |
Космический турист
Группа: Пользователи
Российская Федерация
Сообщений: 36
Награды: 0
Статус: Offline
| Цитата SpaceEngineer (  ) Ведь точка может как выползти за пределы данного куба, так и вползти в него из соседнего. Это оверхед, и придётся подбирать функцию так, чтобы точки не могли уползать дальше, например, одного дополнительного куба.
Мне бы понимать: каковы размеры минимального куба? Можно ли передавать данные из родительского куба? Ведь точек - центров войдов во много раз меньше самих галактик, очевидно. Практически, это вполне небольшой массив, который можно даже не генерить каждый раз. А обращаться к нему уже готовому. И ещё непонятно: сколько вообще кубов охватывается при отображении? Если например я на стыке максимального количества, т.е. 8 кубов. Все они генерятся? По всем этим данным можно было бы что-то подобрать, оптимизировать...
Кольца планет - это диски, на которые предыдущие цивилизации записали всю свою историю и как они довели планету до такого состояния...))
|
|
|
| |
| SpaceEngineer | Дата: Вторник, 02.08.2016, 13:20 | Сообщение # 570 |
Автор Space Engine
Группа: Администраторы
Российская Федерация
Сообщений: 5547
Награды: 55
Статус: Offline
| Вся Вселенная - куб со стороной 10 гигапарсек Octree имеет 10 уровней, т.е. самый маленький нод (кубик) - 10 Гпк / 210 = 9.77 Мпк Обход дерева начинается сверху вниз: 0 уровень (вся Вселенная) обычно всегда виден - генерируем до 10000 самыx яркиx галактик (если ещё не сгенерировано) и добавляем в рендер-лист. 1 уровень - смотрим, какие из 8 потомков нода 0 уровня видны в поле зрения - далее работаем только с ними. Генерируем до 10000 галактик только в тех нодах, которые видны, если они ещё не сгенерированы. Светимость галактик для нодов уровня 1 лежит между светимостью галактик 0 уровня и 2 уровня. Добавляем в рендер-лист. 2 уровень - смотрим, какие из 8 потомков нода 1 уровня (каждого из тех, что были пройдены на предыдущем шаге) видны в поле зрения - далее работаем только с ними. Генерируем до 10000 галактик только в тех нодах, которые видны, если они ещё не сгенерированы. Добавляем в рендер-лист. ... 10 уровень - то же самое.
Кроме проверки на попадание в поле зрения камеры, ноды проходят ещё проверку на видимость по расстоянию. Берётся максимальная возможная светимость галактики данного уровня, берется расстояние до ближайшей точки нода, считается видимая яркость и сравнивается с пороговой. Если меньше - то нод не прошел тест и далее он не обрабатывается (и все его потомки тоже - они даже не создаются; это важный момент и он возможен потому, что диапазоны светимостей галактик на разных уровнях не пересекаются, т.е. все галактики уровня N+1 гарантированно тусклее самой тусклой галактики уровня N). Без проверки по расстоянию/светимости нодов 10 уровня было бы сотни миллионов - комп бы не справился, при том что большинство их просто не были бы видны из-за расстояния. Именно поэтому не стоит задирать предельную зв. величину галактик или звёзд - комп просто не сможет сгенерить столько нодов и заполнить их галктиками/звездами, кэш нодов заполнится до предела и будет бесконечное удаление/генерация нодов.
В среднем получается видно порядка 80 нодов разных уровней, которые отправляют на рендер 120-150 тыс. галактик. Это при дефолтной включенной настройке автоувеличение яркости галактик (т.е. пороговой зв. величины, при которой галактика видна) - до 15m. При отключенной порог будет 7m, и видно всего лишь 24-28 нодов с ~40 тыс галактик, из которых дай бог 2-3 реально можно заметить на экране.
Так работает octree галактик (звёздный устроен аналогично). При желании, при генерации нода-потомка, в него можно передать массив галактик или какие-то другие данные из нода-родителя. А вот данные из соседних нодов нельзя - они вообще могут не существовать, т.к. ни разу не были видны камере по границам поля зрения/расстоянию. Генерировать всех соседей каждый раз будет очень накладно, тем более что это будут не совсем "полоноценные" соседи (если запускать полноценный алгоритм генерации галактик для каждого соседа, то надо будет генерировать и его соседей, т.е. получается, что надо сгенерировать вообще всю Всленную).
10000 галактик на нод - это и есть то число точек N, которое генерируется в объёме нода (куба) и смотрится функция плотности вероятности нахождения галактики в данной точке. Реально сгенерированное число галактик получается 500-2000 на нод. Так что оверхед уже и так довольно значительный; с учётом медленности функции плотности (там диаграмма Вороного, точнее шум Волрея) генерация нода галактики происходит раз в 100 дольше, чем нода звёзд. Тут спасает только то, что галактик реально мало видно по сравнению со звёздами, даже при предельной величине 15m. Чтобы сделать волокна тоньше, а галактик в них больше, можно например функцию плотности возвести в какую-нибудь степень, и увеличить число N до 100к. Но это будет убийственно долго. Но можно действительно применить хак с прореживанием, который вы предложили - вызывать функцию плотности не на каждую точку, а на скопление из 10-100 точек, которые заодно модулировать какой-нибудь локальной шумовой функцией.
|
|
|
| |