2016-05-14 273 views
2

我想在JavaFX中实现我自己的3D表面动画,但我不明白它应该起作用的一切,有人可以帮助我理解哪些应该去哪里?3D表面JavaFX

  • 已经知道,通过使用类构建网格需要类对象TraingleMesh,然后必须使用方法mesh.getPoints.addAll(...);但要加点..我的​​使用apply方法并不能帮助我在所有以后的辩论,因为第一个参数必须是数组浮点类型,而不是double变量在应用一些数据后。

    • 我该如何解决这个问题?
  • 我发现@Roland这里创建质感的一些实现和面:

3D surface - stack

  • 如何纹理和面临的工作?

这对我来说非常重要,感谢您的帮助!

+0

这是关于动画“c瞬间“表面或关于改变表面? – fabian

+0

它会根据时间更改新数据表面 – yerpy

回答

3

看看FXyz library。它是开源的,你可以从代码中学习。

对于纹理,看看这个post

FXyz有SurfacePlotMesh的类,它正是你想要的:情节基于函数g = f(x,y),通过使用Function<Point2D, Number> function参数3D表面。

它还包含纹理,因此您可以根据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包括到java项目中,它不起作用,仍然有例如“SurfacePlotMesh”无法解析符号。 – yerpy

+0

您使用的是什么版本的Java?你的进口是什么?也许你错过了正确的导入? – Birdasaur

+0

我通过将所有源代码导入到项目中解决了这个问题,不仅是jar的 – yerpy