Программа Java/Scala, Имитирующая Анимацию Капель Дождя.

Видео: Эту заметку, вероятно, следует воспринимать скорее как обзор библиотеки org.fxyz3d, поскольку сама программа достаточно проста.

В последний выпуск «Слайсер: нарезка твёрдых предметов для резки» Я упомянул интересный предмет мебели, который мне очень понравился:

Программа Java/Scala, имитирующая анимацию капель дождя.
</p><p>

Хотя я никогда раньше не сталкивался с рубином, я набросал программу что на выходе дало поверхность вида:

Программа Java/Scala, имитирующая анимацию капель дождя.
</p><p>

Теперь я с удивлением обнаружил, что об обратной совместимости в SketchUp никто не слышал, и код просто больше не запускается.

Это прискорбно, но я, конечно, это не исправлю.

Вместо этого я ловко создал новая, улучшенная программа на Java/Scala на 120 строк, который не только рисует такую сетку из двух волн, но и сдвигает фазы этих волн по таймеру, тем самым имитируя анимацию (см.

видео).

Используемая библиотека: org.fxyz3d. В это время вы можете вращать камеру с помощью мыши и перемещать ее с помощью клавиатуры с помощью WASD.

Программа Java/Scala, имитирующая анимацию капель дождя.
</p><p>

В целом в коде все просто, но дам пару комментариев:

  • Очень удобно, что можно наследовать от класса ShapeBaseSample, который является универсальным.

    Не очень удобно, что org.fxyz3d.samples нет внутри библиотеки (можно было просто создать еще 1 артефакт), и все это добро приходится копировать в проект вручную.

  • Еще более неудобно то, что встроенное поведение обработки клавиатуры при наследовании по каким-то причинам ломается (возможно только в scala).

    Потребовалось время, чтобы исправить.

  • Координата Z задается функцией, основанной на координатах текущей точки и координатах двух центров колебаний:
   

def z(x:Int,y:Int):Float = { (Math.cos(-t+Math.sqrt(pow(ox1 - x,2) + pow(oy1 - y,2)) / 5 * 2 * 3.14) * 5 * (Math.max(0,1-Math.sqrt(pow(ox1 - x,2) + pow(oy1 - y,2))/30)) + Math.cos(-t+Math.sqrt(pow(ox2 - x,2) + pow(oy2 - y,2)) / 5 * 2 * 3.14) * 4 * (Math.max(0,1-Math.sqrt(pow(ox2 - x,2) + pow(oy2 - y,2))/30))).

toFloat }

Это косинус, параметром которого является расстояние до центра колебаний (плюс временное смещение), вычисляемый тривиально по теореме Пифагора.



Программа Java/Scala, имитирующая анимацию капель дождя.
</p><p>

.

В формулу добавлен коэффициент. линейное затухание, равное 1 в центре колебаний и 0 на достаточном расстоянии (30).

  • Карты были выбраны не просто так, как коллекции для хранения сетки высот и линий.

    Дело в том, что я рассчитывал оптимизировать производительность программы за счет повторного использования объектов (для чего необходимо сохранять ссылки на них), но это оказалось напрасно.

    Дело в том, что замена списка точек PolyLine3D не влияет на его отражение на экране — при создании он уже сгенерировал дочерние Mesh-объекты и не собирается их воссоздавать.

  • Однако все это почти не занимает времени — затычка находится в методе Scene.getChildren.addAll( .

    ).

    На 30*30 пикселей анимация видна, но кадр 100*100 уже рисуется несколько секунд. Это неприемлемо.

Должен признать, что библиотека org.fxyz3d не очень подходит для работы с морфингом объектов в реальном времени, что меня немного разочаровало.

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

Теги: #3d #java #Графический дизайн #scala #Функциональное программирование #графика #Компьютерная анимация #формулы #демо #начинающие #JavaFX #красота #fxyz3d

Вместе с данным постом часто просматривают: