Я использую Java и Java3D для построения относительно простой модели галактики Млечный Путь, через которую можно «пролететь».
Пока у меня работает наивная версия, которая читает 40000 известных звезд и отображает их (с помощью клавиатуры и мыши) как объекты Sphere. Однако есть несколько проблем, препятствующих дальнейшему прогрессу.
Одна из проблем, с которыми я сталкиваюсь, заключается в том, что мне нужно визуализировать звезды в соответствии с их видимой величиной, которая является функцией абсолютной величины яркости звезды (логарифмическая шкала) и ее текущего расстояния от наблюдателя. Звезды с очень низкой видимой величиной (такие как Проксима Центавра, видимая с орбиты Земли) должны быть невидимыми, в то время как очень яркие звезды (такие как Денеб) должны быть видимы даже на относительно большом расстоянии от Земли.
Так что я не могу просто отобразить звезды, основываясь на их фиксированном «фактическом» размере и их расстоянии от текущего места наблюдения. Это приводит к появлению гигантских пятен даже для очень тусклых близких звезд, в то время как безумно светящиеся звезды, такие как Денеб, вообще не отображаются из-за своего расстояния.
Вопрос в том, как я могу представить изображение звезды на основе ее видимой величины, которая изменяется в соответствии с ее расстоянием от текущего положения точки обзора, без динамического выделения и удаления объектов Java3d? Или, если мне нужно изменить объекты в Java3D после начала рендеринга, как я могу это сделать без потери частоты кадров?
Я пытался использовать прозрачность; это просто делает гигантские круги немного труднее увидеть. Я пытался использовать туман, но он полностью затуманивает далекие звезды (и линии созвездий). Я пытался преобразовать сферы в объекты Shape3D, но это в два раза больше места в куче.
Один счастливый особый случай заключается в том, что мне не нужно отображать звезды, видимая величина которых превышает 7,00, поскольку человеческий глаз их не видит. Теоретически, мне нужно только генерировать трехмерный объект для любой вещи, которую я могу видеть, основываясь на моем текущем положении в пространстве. Это не только улучшит производительность по сравнению с созданием объекта Sphere для каждой звезды в базе данных, но и поможет избежать нехватки кучи Java. (У меня есть более 100 000 реальных звезд, которые я хотел бы включить, но после 40 000 у меня заканчивается куча, и ни одна настройка Java, которую я пробовал, не дает мне больше места в куче.)
Я знаю, что такого рода динамическое отображение яркости звезды возможно. Создатель замечательной программы имитации космического двигателя делает это (и ему удается получать 60 кадров в секунду). Я просто не могу за свою жизнь понять, как он делает это.
Я полностью ожидаю, что я достиг пределов своей наивной реализации и что единственный способ получить приемлемую производительность и функциональность - это перестроить всю концепцию дисплея. Я хотел бы увидеть некоторые конкретные ответы о том, как сделать динамическую видимость объектов с помощью Java3D, но на этом этапе я согласен на экспертные предположения. (Я бы предпочел не отказываться от Java3D, но я также открыт для конкретных рекомендаций.)