2016-05-14 2 views
2

Я пытаюсь реализовать свою собственную 3D-анимацию поверхности в JavaFX, но я не понимаю, как все должно работать, может кто-то помочь мне с пониманием, куда идти?3D-поверхность JavaFX

  • Уже известно, что для создания сетки с помощью класса нужен объект класса TraingleMesh и затем добавлять точки, используя метод mesh.getPoints.addAll(...);, но .. мой Function<Double, Double> после использования apply метода не помогает мне на всех, Потому что первый аргумент должен быть массивом типа float, а не double переменной после применения некоторых данных.

    • Как я могу решить эту проблему?
  • Я нашел несколько реализаций текстуры и лица, созданные @Roland здесь:

3D surface - stack

  • Как текстуры и лица работает?

Это действительно важно для меня, спасибо за помощь!

+0

Это о анимации изменяющейся текстуры на "c на постоянной "поверхности или об изменении поверхности? – fabian

+0

Он изменит поверхность с новыми данными, основанными на времени – yerpy

ответ

3

Посмотрите на FXyz library. Это с открытым исходным кодом, и вы можете узнать из кода.

Для текстур, посмотрите на это post.

FXyz имеет SurfacePlotMesh класс, который делает именно то, что вы хотите: участок 3D-поверхности на основе функции g = f(x,y), используя параметр Function<Point2D, Number> function.

Он также включает текстурирование, поэтому вы можете включить карту плотности в терминах Function<Point3D, Number> density. Каждое значение отображается в цвет.

Проверьте этот тест Function2DPlotTesthere.

С помощью этого кода фрагмента кода вы можете построить функцию:

@Override 
public void start(Stage primaryStage) { 
    PerspectiveCamera camera = new PerspectiveCamera(true); 
    camera.setTranslateZ(-30); 
    SurfacePlotMesh surface = new SurfacePlotMesh(
      p-> Math.sin(p.magnitude() + 1e-10)/(p.magnitude() + 1e-10), 
      20, 20, 100, 100, 4); 
    surface.setCullFace(CullFace.NONE); 
    surface.setTextureModeVertices3D(1530, p -> p.magnitude()); 
    surface.getTransforms().addAll(new Rotate(200, Rotate.X_AXIS), new Rotate(-20, Rotate.Y_AXIS)); 

    final Group group = new Group(surface); 
    Scene scene = new Scene(group, 600, 400, true, SceneAntialiasing.BALANCED); 
    scene.setCamera(camera); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 

SurfacePlotMesh

А если добавить карту плотности:

surface.setTextureModeVertices3D(1530, p -> p.magnitude()); 

вы получите это:

Textured SurfacePlotMesh

Теперь, если вы хотите анимацию поверхности, вам просто нужно создать один:

private SurfacePlotMesh surface; 
private long lastEffect; 

@Override 
public void start(Stage primaryStage) { 
    PerspectiveCamera camera = new PerspectiveCamera(true); 
    camera.setTranslateZ(-30); 
    surface = new SurfacePlotMesh(
      p-> Math.sin(p.magnitude() + 1e-10)/(p.magnitude() + 1e-10), 
      20, 20, 100, 100, 4); 
    surface.setCullFace(CullFace.NONE); 
    surface.setTextureModeVertices3D(1530, p -> p.magnitude()); 
    surface.getTransforms().addAll(new Rotate(200, Rotate.X_AXIS), new Rotate(-20, Rotate.Y_AXIS)); 

    final Group group = new Group(surface); 
    Scene scene = new Scene(group, 600, 400, true, SceneAntialiasing.BALANCED); 
    scene.setCamera(camera); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 

    lastEffect = System.nanoTime(); 
    AtomicInteger count=new AtomicInteger(); 
    AnimationTimer timerEffect = new AnimationTimer() { 

     @Override 
     public void handle(long now) { 
      if (now > lastEffect + 1_000_000_000l) { 
       double t = (count.get() % 5 + 1); 
       surface.setFunction2D(p -> Math.sin(t * p.magnitude() + 1e-10)/(t * p.magnitude() + 1e-10)); 
       count.getAndIncrement(); 
       lastEffect = now; 
      } 
     } 
    }; 
    timerEffect.start(); 
} 

И вы получите вашу поверхность анимации:

SurfacePlotMesh 2

SurfacePlotMesh 3

SurfacePlotMesh 4

+0

Я включил проект jar's в java, и он не работает, но для exmaple на «SurfacePlotMesh» невозможно разрешить символ. – yerpy

+0

Какую версию Java вы используете? Какой у вас импорт? Может быть, вам не хватает правильного импорта? – Birdasaur

+0

Я решил эту проблему, импортировав весь исходный код в проект, а не только jar's – yerpy