Динамическая видимость объектов в Java3D - PullRequest
0 голосов
/ 22 июня 2011

Я использую Java и Java3D для построения относительно простой модели галактики Млечный Путь, через которую можно «пролететь».

Пока у меня работает наивная версия, которая читает 40000 известных звезд и отображает их (с помощью клавиатуры и мыши) как объекты Sphere. Однако есть несколько проблем, препятствующих дальнейшему прогрессу.

Одна из проблем, с которыми я сталкиваюсь, заключается в том, что мне нужно визуализировать звезды в соответствии с их видимой величиной, которая является функцией абсолютной величины яркости звезды (логарифмическая шкала) и ее текущего расстояния от наблюдателя. Звезды с очень низкой видимой величиной (такие как Проксима Центавра, видимая с орбиты Земли) должны быть невидимыми, в то время как очень яркие звезды (такие как Денеб) должны быть видимы даже на относительно большом расстоянии от Земли.

Так что я не могу просто отобразить звезды, основываясь на их фиксированном «фактическом» размере и их расстоянии от текущего места наблюдения. Это приводит к появлению гигантских пятен даже для очень тусклых близких звезд, в то время как безумно светящиеся звезды, такие как Денеб, вообще не отображаются из-за своего расстояния.

Вопрос в том, как я могу представить изображение звезды на основе ее видимой величины, которая изменяется в соответствии с ее расстоянием от текущего положения точки обзора, без динамического выделения и удаления объектов Java3d? Или, если мне нужно изменить объекты в Java3D после начала рендеринга, как я могу это сделать без потери частоты кадров?

Я пытался использовать прозрачность; это просто делает гигантские круги немного труднее увидеть. Я пытался использовать туман, но он полностью затуманивает далекие звезды (и линии созвездий). Я пытался преобразовать сферы в объекты Shape3D, но это в два раза больше места в куче.

Один счастливый особый случай заключается в том, что мне не нужно отображать звезды, видимая величина которых превышает 7,00, поскольку человеческий глаз их не видит. Теоретически, мне нужно только генерировать трехмерный объект для любой вещи, которую я могу видеть, основываясь на моем текущем положении в пространстве. Это не только улучшит производительность по сравнению с созданием объекта Sphere для каждой звезды в базе данных, но и поможет избежать нехватки кучи Java. (У меня есть более 100 000 реальных звезд, которые я хотел бы включить, но после 40 000 у меня заканчивается куча, и ни одна настройка Java, которую я пробовал, не дает мне больше места в куче.)

Я знаю, что такого рода динамическое отображение яркости звезды возможно. Создатель замечательной программы имитации космического двигателя делает это (и ему удается получать 60 кадров в секунду). Я просто не могу за свою жизнь понять, как он делает это.

Я полностью ожидаю, что я достиг пределов своей наивной реализации и что единственный способ получить приемлемую производительность и функциональность - это перестроить всю концепцию дисплея. Я хотел бы увидеть некоторые конкретные ответы о том, как сделать динамическую видимость объектов с помощью Java3D, но на этом этапе я согласен на экспертные предположения. (Я бы предпочел не отказываться от Java3D, но я также открыт для конкретных рекомендаций.)

1 Ответ

0 голосов
/ 22 июня 2011

Видимость объектов можно управлять без добавления и удаления их из графа сцены следующим образом:

  • RenderingAttributes

Добавьте экземпляр RenderingAttributes к внешнему виду Shape3D и вызовите RenderingAttributes.setVisible (логический видимый). Один экземпляр можно использовать совместно, добавив его в несколько появлений, чтобы их Shape3D видимость была синхронизирована.

  • SharedGroup и ссылка

Добавьте объекты в SharedGroups и свяжите их через узел Link с их родителем в графе сцены. При вызове Link.setSharedGroup (mySharedGroup) объекты будут видны, а при вызове Link.setSharedGroup (null) они будут невидимыми.

  • переключатель

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

Размер кучи

В Win XP 32 бит с 4 ГБ оперативной памяти мой размер кучи: -Xmx1536m.

Сфера

Как строятся ваши объекты Sphere? Используете ли вы com.sun.j3d.utils.geometry.Sphere?

Смотри также: http://www.java.net/forum/topic/javadesktop/java-desktop-technologies/java-3d/why-large-number-hidden-shapes-slows-rende

Август, InteractiveMesh

...