【问题标题】:3D surface JavaFX3D 表面 JavaFX
【发布时间】:2016-05-14 09:55:57
【问题描述】:

我正在尝试在 JavaFX 中实现我自己的 3D 表面动画,但我不明白它应该工作的所有内容,有人可以帮助我了解哪个应该去哪里吗?

  • 已经知道使用类构建Mesh需要类对象TraingleMesh然后必须使用方法mesh.getPoints.addAll(...);添加点但是..我的Function<Double, Double>在使用apply方法后对我没有帮助,因为第一个参数必须是数组浮点类型,而不是应用一些数据后的double 变量。

    • 我该如何解决这个问题?
  • 我在这里找到了@Roland 创建的纹理和面的一些实现:

3D surface - stack

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

这对我来说真的很重要,谢谢你的帮助!

【问题讨论】:

  • 这是关于在“恒定”表面上为变化的纹理制作动画还是关于改变表面?
  • 它会根据时间用新数据改变表面

标签: java javafx 3d surface javafx-3d


【解决方案1】:

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

有关纹理,请查看post

FXyz 有一个 SurfacePlotMesh 类,可以完全满足您的需求:使用 Function<Point2D, Number> function 参数,基于函数 g = f(x,y) 绘制 3D 表面。

它还包含纹理,因此您可以包含以Function<Point3D, Number> density 表示的密度图。每个值都映射到一种颜色。

检查这个测试Function2DPlotTesthere

使用这段代码 sn-p 你可以绘制一个函数:

@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(); 
}

如果添加密度图:

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

你会得到这个:

现在如果你想要一个表面的动画,你只需要创建一个:

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();
}

你会得到你的表面动画:

【讨论】:

  • 我将 jar 包含到 java 项目中,但它不起作用,仍然有例如“SurfacePlotMesh”无法解析符号。
  • 您使用的是什么版本的 Java?你的进口是什么?也许您错过了正确的导入?
  • 我通过将所有源导入项目解决了这个问题,而不仅仅是 jar 的
  • 您不应该这样做,这不是正确的方法。你用的是什么IDE?什么构建系统? (Ant、Maven、Gradle 等)
猜你喜欢
  • 2018-05-27
  • 2015-09-13
  • 2018-04-14
  • 2013-10-21
  • 1970-01-01
  • 2017-04-04
  • 1970-01-01
  • 1970-01-01
  • 2016-04-07
相关资源
最近更新 更多