четверг, 2 июля 2015 г.

Кончился очередной сумасшедший день, в котором все наложилось и сбило обычные ритмы. Неправильное обещание выпускать серии летсплея в определенные дни, наверное, сказалось. Как только подошло время заливать серию на Youtube, стало весело. Сначала провайдер приказал "наши специалисты уже работают над исправлением проблемы, ждите", а потом появилось жгучее желание поднять еще один сервис по работе прям щас. Параллельно кое-кто решил, что его взломали и требовал внимания к собственной персоне. В общем, дурдом.
Вчерашний вечер внезапно посвятил исследованию проблемы генерирования планетарных систем, которые бы вменяемо выглядели. Я давно начал этим заниматься, так что просто дорабатывал вещи, которые были сугубо случайными. А, как говорится, случайные числа появляются там, где мы чего-то не знаем. Вот я решил узнать.

foo-5


Чуть ранее я написал код, который генерировал случайным образом определенное количество звезд. Пока что они "в нигде", то есть не обращаются вокруг чего-то, хотя это влияло бы, пожалуй, на их характеристики, такие как сфера влияния гравитации, что повлекло бы определенные ограничения на число и размеры планет.
Одно сейчас сделано правильно - пользуясь открытой статистикой по наблюдаемым звездам, генератор создает примерно такое же количество разных типов звезд, по размерам, температуре и массе. То есть, наверное, эти параметры у меня получаются достаточно вменяемыми.

Следующим шагом было добавлять обращающиеся вокруг планеты, пока что по круглым и экваториальным орбитам. Для простоты. Сначала их количество было вовсе случайным от 1 до 16, теперь немного лучше, хотя и не идеально - просто берется отношение массы Солнца к числу планет в нашей системе, а потом на основе массы звезды определяется, сколько там может обращаться планет.
Затем генерировались абсолютно случайные планеты. После пары тестов это пришлось изменить - иногда планеты могли оказаться больше самой звезды, что было весело. Также интересно было узнать, как же все-таки определить плотность планеты и какими большими они бывают. Оказалось, что планеты, которые больше Юпитера раз в 15 неминуемо становятся звездами, из-за сжатия и нагрева внутри себя, приводящего к запуску термоядерной реакции. Так что верхний предел нашелся быстро. Также есть некоторое соотношение массы и плотности, выведенное из обнаруженных уже экзопланет, так что кроме массы стали известны и их радиусы, из чего следует плотность. Чтобы не было случая, когда звезда должна бы явно обращаться вокруг одной из планет, а не наоборот (гм, а ведь интересный вариант...), пришлось ограничить массу планет одной сотой от массы звезды. Теперь нужно было узнать, на каком минимальном расстоянии планета может быть от звезды, и здесь есть предел Роше, который возникает из-за того, что слишком близко к звезде планеты находиться не могут - их неминуемо разрушают приливные силы. :)

Дальше остались случайности. Случайное число спутников, которое завязано на отношение сферы влияния Юпитера и числа его спутников (хотя, если честно, оно могло бы быть любым), и, таким образом, чем дальше и тяжелее планета - тем больше у нее будет спутников. Так стало получаться, что у ближних планет спутники бывают редко и их мало. У тех, что дальше - больше. Выглядело вменяемо.

Чтобы не смотреть на голые цифры, я быстренько написал рисовалку картинок, вроде той, что сверху, чтобы можно было посмотреть, что выйдет. Оказалось, иногда выходит явный бред, когда орбиты спутников пересекаются с орбитами других планет. Пришлось применить хитрость, разглядывая большие полуоси в Солнечной системе. Дело в том, что полуось следующей планеты, как правило, отличается от предыдущей примерно в два раза. Это почти сработало. Ну, то есть я еще не уверен, что это работает всегда. И сама надуманность без каких-то подтверждений мне не нравится. Но это все равно придется менять, когда для разнообразия и интереса я таки решу добавить эксцентриситет и склонение орбиты в параметры. Хотя, конечно, эти вещи без общей картины возникновения вселенной, наверное, будут случайными.
И, о ужас, я еще не придумал, как быстро вращаться будут эти планеты и как будет наклонена их ось. И из чего они при этом будут сделаны, будут ли иметь атмосферу и все такое. Ведь эти вопросы тоже требуют прояснения. А вот насчет того, какая температура будет у их поверхности я, в первом приближении, уже понял. Это можно относительно легко посчитать на основе излучения звезды и расстояния. Уточнять можно только после определения материалов и наличия атмосферы.

Ну и последним на рисуночек хотелось добавить для наглядности нормальный цвет звезды. То есть, тот самый, который вытекает из ее температуры. Оказалось, это не так просто. Я некоторое время смотрел на разные алгоритмы рассчета RGB из температуры и везде получалось что-то неправильное. Сначала попробовал это: https://gist.github.com/paulkaplan/5184275. Оно почему-то генерило розовый цвет разных оттенков. Потом нашел http://www.vendian.org/mncharity/dir3/blackbody/UnstableURLs/bbr_color.html, это была ссылка из этого треда на StackOverflow: http://stackoverflow.com/questions/7229895/display-temperature-as-a-color-with-c. Здесь, кстати, нашелся алгоритм, который генерил что-то близкое к примерной таблице, которая казалась вменяемой. Тот самый, что основан на Numpy.polyfit. Правда, и он был не идеальным и пришлось поправить некоторые коэффициенты. Так что есть планы этот исправленный сунуть в какой-то gist после тщательной проверки.

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

Следующая интересная задача, это, пожалуй, начать осваивать OpenGL, чтобы вместо плоских картинок получить объемные. Тем более что это я не делал ни разу.

И да, трудно объяснить, зачем это всё. Я сам еще не понял. :) Но как-то это хочется потом увязать с этой вот темой: http://www.gamedev.net/blog/33/entry-2227887-more-on-minecraft-type-world-gen/. Да-да, я хочу как-то попробовать генерировать миры на этих планетах. Вменяемо, так чтобы любители физики, геологии и астрономии видели эти миры и говорили: да, блин, таким он и должен быть. Ну и, конечно, про преобразование сферических планет в кубический плоский мир можно тоже отдельно и долго думать, ведь есть множество подходов к проблеме.

2 комментария:

  1. почему бы тебе вообще не выкладывать весь код на гитхаб? было бы интересно посмотреть

    ОтветитьУдалить
  2. Там пока нету ничего впечатляющего, а выкладывать что-то, что просто является попыткой прототипирования мне не кажется стоящей затеей.

    ОтветитьУдалить