Создание эмулятора космоса
|
|
filkar2005 | Дата: Пятница, 15.01.2021, 15:28 | Сообщение # 1 |
Сержант
Группа: Пользователи
Сообщений: 26
Награды: 0
Репутация: 0
Статус: Offline
| Не знает ли кто нибудь, какими способами в Panda3D можно отрисовать фоновые звёзды, галактики, млечный путь и т.д? Я думал написать простенький эмулятор космоса (солнечной системы), работающий с физикой (реальные расстояния, реальные ускорения, притягивание корабля к планетам, лёгкость ускорения/поворота, зависящая от массы корабля и т.д.), но никак не получается придумать, как нарисовать фоновый космос, ведущий себя, как положено (изменение положения звёзд при повороте, невозможность выйти за пределы, неизменяемые размеры звёзд). Была идея нарисовать огромный куб, но, во-первых, я не знаю, как нарисовать текстуру внутри куба, а, во-вторых, он не удовлетворяет 2 и 3 пунктам похожести на настоящий.
Добавлено (16.01.2021, 19:22) --------------------------------------------- И возникла ещё проблема. Как назначить источником света модель, но так, чтобы сама модель тоже засвечивалась, притом полностью?
<°)))><
Сообщение отредактировал filkar2005 - Суббота, 16.01.2021, 19:28 |
|
| |
serg-kkz | Дата: Суббота, 16.01.2021, 22:56 | Сообщение # 2 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Тебе шейдеры нужны, так просто это не сделаешь. И да питон для такого размаха не годиться. Можешь попробовать этот рендер, он как раз поддерживает эмиссию. https://github.com/tobspr/RenderPipeline но лучше уж под такую задумку изучать Vulkan.
Вот все делается шейдером http://glslsandbox.com/e#69474.0 и движок особо не нужен.
ООП -
|
|
| |
filkar2005 | Дата: Воскресенье, 17.01.2021, 15:03 | Сообщение # 3 |
Сержант
Группа: Пользователи
Сообщений: 26
Награды: 0
Репутация: 0
Статус: Offline
| Разве питон не справится? Я думал все функции, отвечающие за физику написать на С++, а графика на питоне будет просто прорисовывать в 3д + некоторая обработка. Движок же на С++ написан, ну не очень большой код на питоне немного замедлит, с 60 FPS снизится до 40, мне вполне хватит. Я пока делаю базовую модель. Планеты простейшие, без всяких выкрутасов в плане отдельных частиц в кольцах и т.д. Для планет пока планировалось притяжение обрабатывать только к Солнцу, между собой - был уже следующий шаг. Просто буду высчитывать скорость планеты + сила притяжения/массу планеты, всё в векторном виде, в конце концов пока можно попробовать через numpy, может скорости окажется достаточно. Для моих целей вполне хватало PyOpenGl (OpenGl + python), скорость вхолостую - 650 FPS. С конечным проектом должна была быть в районе 100. Но совместимость PyOpenGl с питоном 3 оставляет желать лучшего. Половина функций просто не работает. С Panda3D проще. Тем более питон всё быстрее становится. Математику можно компилировать в JIT код, например через numba. Останется только графика.
<°)))><
|
|
| |
serg-kkz | Дата: Воскресенье, 17.01.2021, 16:59 | Сообщение # 4 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Ну дело твое, я в с помнил что на панда есть уже похожие задумки. https://github.com/cosmonium/cosmonium
ООП -
|
|
| |
filkar2005 | Дата: Понедельник, 18.01.2021, 09:19 | Сообщение # 5 |
Сержант
Группа: Пользователи
Сообщений: 26
Награды: 0
Репутация: 0
Статус: Offline
| А можете, пожалуйста, объяснить на примере кода, как назначить модель источником света? Просто в мануале есть фраза: Цитата Обратите внимание, что, в отличие от реальной лампочки, световые объекты не видны напрямую. Хотя вы не можете увидеть сам свет Панды, вы можете увидеть эффект, который он оказывает на геометрию вокруг него. Если вы хотите сделать свет видимым, есть один простой трюк - загрузить простую модель (например, сферу) и передать ее непосредственно самому источнику света. Что это значит? Я делал точечный источник света:
a = PointLight('name') a.setColor((20, 20, 10, 1)) b = render.attachNewNode(a) b.setPos(1000, 1000, 0) render.setLight(b)
Но как заставить светится саму модель? Я сделал так, и получил довольно неожиданный результат: a = PointLight('name') a.setColor((20, 20, 10, 1)) b = planet1.attachNewNode(a) #planet1 - модель планеты в камуфляже (просто экспериментальная планета) b.setPos(1000, 1000, 0) render.setLight(b) #планета была добавлена в рендеринг ранее
Вот результат: вот ссылка
А что я сделал на так? П.С. Извините, что код вставлен не как полагается, очень тупит здешний редактор, вставляет форматирование из неоткуда, практически.
<°)))><
Сообщение отредактировал filkar2005 - Понедельник, 18.01.2021, 09:31 |
|
| |
serg-kkz | Дата: Понедельник, 18.01.2021, 21:01 | Сообщение # 6 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Обратите внимание на пример bump-mapping, там вместо лампочки сфера это... и есть этот "эффект". Однако как я говорил авто шейдер в панде отсталый и не стоит его использовать. Лучше самому писать шейдеры, или использовать рендер паплайн, хотя он тормозной и перегруженный, однако его можно настроить. Можно также попробовать рендер simplepbr, я его не пробовал, из - за отсутствие тени от точечного источника света это для меня неюзабельно. Чтоб что сделать на панде нужно уметь писать шейдеры.
ООП -
|
|
| |
filkar2005 | Дата: Понедельник, 18.01.2021, 22:05 | Сообщение # 7 |
Сержант
Группа: Пользователи
Сообщений: 26
Награды: 0
Репутация: 0
Статус: Offline
| Понял, почему у меня свет неправильно работал. Но выяснил, что вообще не понимаю render. Почему я не могу добавить модель, как источник света просто в render, зачем привязывать к той модели, которую я хочу осветить?
<°)))><
|
|
| |
serg-kkz | Дата: Понедельник, 18.01.2021, 22:56 | Сообщение # 8 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Если вы имеете ввиду прикрепить свет:
Код plnp = render.attachNewNode(plight)
То этот шаг физически привязывает источник цвета к этому узлу. И при перемещении или вращении узла к которому вы прицепили свет, узел plnp света всегда будет наследовать трансформацию или состояние узла к которому он прикреплен. Что касается:
Это устанавливает узел который будет освещается и само собой все узлы которые находятся ниже, тем самым можно ограничить объекты которые будут освещены. Узел рендер является корнем сцены.
ООП -
|
|
| |
filkar2005 | Дата: Вторник, 19.01.2021, 11:14 | Сообщение # 9 |
Сержант
Группа: Пользователи
Сообщений: 26
Награды: 0
Репутация: 0
Статус: Offline
| Тогда я вообще ничего не понимаю. Я именно так и понял, но если я устанавливаю источник света в самый корень сцены, то свет от сферы появляется, но сама сфера становится просто чёрного цвета. А если я привязываю источник света к не корневому узлу, тогда только сфера начинает быть нормально видимой. Это глюк панды, или я что-то не так делаю?
<°)))><
|
|
| |
serg-kkz | Дата: Вторник, 19.01.2021, 17:56 | Сообщение # 10 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Здесь нет глюка, скорей всего вы используете прожектор. Тогда отражатель не будет освещаться, потому что находиться с противоположной стороны, а стекло не будет освещаться, потому что нормаль находиться с другой стороны. Чтоб решить эту проблему вы можете повесить дополнительный источник света AmbientLight и установить его для того что нужно, отражатель стекло, и так далее.
ООП -
Сообщение отредактировал serg-kkz - Вторник, 19.01.2021, 18:00 |
|
| |
filkar2005 | Дата: Вторник, 19.01.2021, 20:10 | Сообщение # 11 |
Сержант
Группа: Пользователи
Сообщений: 26
Награды: 0
Репутация: 0
Статус: Offline
| Так я использовал точечный источник света. Но, с помощью примера, получилось, что мне было нужно, и я понял, как делать, так что не суть важно. А как создать эмуляцию звёзд? Я так и не смог придумать, как это сделать более-менее нормально. Все примеры, которые я исследовал просто использовали дополнительную модель с текстурой. Но у меня даже сейчас камера находится в координате 0 -30000 0, и будет ещё дальше. Можно, конечно, попробовать сдвигать модель с звёздами вместе с камерой, но это как-то уж совсем, по-моему.Добавлено (20.01.2021, 15:49) --------------------------------------------- И ещё возникла проблема: камера находится cam.setPos(0, -27459009, 0), Солнце, в координатах (0, 0, 0). Радиус модели Солнца равен 1,8 единиц (не знаю, в чём измеряет расстояние panda3D). Модель увеличена в 10000000 раз. Солнце занимает почти весь экран. Задняя граница видимости сдвинута на 1000000000. Но если отодвинуть камеру ещё на 1 назад, то Солнце исчезает, будто вышло за пределы видимости. Почему это происходит? Неужели панда настолько некорректно отрабатывает большие модели/расстояния/пустоты?
<°)))><
|
|
| |
serg-kkz | Дата: Среда, 20.01.2021, 18:04 | Сообщение # 12 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| К этой ситуации могу добавить что панду можно собрать с поддержкой двойной точности, для этого нужно использовать гитхаб чтоб получить исходники, там подробно описаны команды сборки в справке makepanda. Расстояние панда ни чем не меряет, вы можете принять 1 единицу за метр или миллиметр, а может и за километр. Если исчезает объект, это значит происходит сбой Z буфера, причина банальна не хватает точности опять и панда здесь не причем, она поддерживает это на уровне графических библиотек. По поводу симуляции звезд, вроде уже сказал как это делается, без шейдеров ни как, если только спрайтами, но это сами уж смотрите.
ООП -
|
|
| |
filkar2005 | Дата: Среда, 20.01.2021, 18:17 | Сообщение # 13 |
Сержант
Группа: Пользователи
Сообщений: 26
Награды: 0
Репутация: 0
Статус: Offline
| То есть проблему с исчезновением нельзя никак решить? Неужели придётся самостоятельно пересчитывать размеры и скорости моделей?
<°)))><
|
|
| |
serg-kkz | Дата: Среда, 20.01.2021, 18:32 | Сообщение # 14 |
Генерал-полковник
Группа: Модераторы
Сообщений: 803
Награды: 3
Репутация: 18
Статус: Offline
| Если вы заметили луна и солнце на небе одного диаметра, то этот подход можно использовать и в играх, чтоб объект казался далеко его достаточно уменьшить и заменить на обычный спрайт, все строится на расчетах и обмане пользователя. Для решения как я сказал можно собрать панду с поддержкой двойной точности, и так же использовать масштаб в уменьшенном соотношении к реальному миру. Например 1 на единица - километр, чем больше тем лучше, тут нужно найти баланс.
ООП -
Сообщение отредактировал serg-kkz - Среда, 20.01.2021, 18:32 |
|
| |
filkar2005 | Дата: Пятница, 22.01.2021, 12:01 | Сообщение # 15 |
Сержант
Группа: Пользователи
Сообщений: 26
Награды: 0
Репутация: 0
Статус: Offline
| Мда... Привык к питону - отсутствие ограничений по величине чисел. Придётся считать всё более сложно. А я так надеялся, что будет достаточно высчитывать координаты тел в пространстве и передавать их панде. А каким образом реализуется картинка на заднем фоне 3д графики шейдерами? Я их ни разу сам не писал, да и не использовал. Или спрайтами? Выводить картинку на определённом расстоянии от камеры? Сейчас я просто ковыряюсь с графикой, физику, в принципе, понял, как писать. И возникла странная проблема. Я ввёл коэффициент bliz, влияющий на масштаб системы, не затрагивая внешний вид. (делю на него координаты и размеры, координаты всё равно питон обрабатывает, ему всё равно, на сколько они большие). Но при коэффициенте bliz >= 1000 (примерно, точнее не вычислял, где начинается ошибка), вначале поверх Солнца вырисовывается белый шар, а планеты остаются как есть, при ещё большем bliz планеты исчезают, белый шар увеличивается, а Солнце уменьшается. Я бы ещё понял глюки с планетами и Солнцем (координаты и размеры являются типом float, всё таки, мало ли, какие ошибки накопились), но откуда возникает белый шар? На всякий случай прикладываю код, буду очень благодарен за помощь. planets.7z planets.zip П.С. Код прилагаю в двух разных архивах, не знаю, какой Вам удобнее.
<°)))><
|
|
| |