Javafx 如何创建3d数据播放器?

Javafx 如何创建3d数据播放器?,javafx,3d,javafx-3d,Javafx,3d,Javafx 3d,我有一个3D数据文件(time,x,y,z),我想创建一个带有播放、暂停按钮和旋转3D对象选项的JavaFX交互式动画 我在JavaFX中找不到任何基本示例,似乎我必须重新创建自己的mediaplayer。看看这个,F(X)yz是一个开放源码 JavaFX3D库,提供基础JavaFX83D包所不具备的其他原语、复合对象、控件和数据可视化 有几个组件可以帮助您。例如,所有的TexturedMesh子类都是3D形状,允许使用数学表达式(通过使用纹理)创建等高线图 作为一个例子,看看二十面体 你会看到

我有一个3D数据文件(
time,x,y,z
),我想创建一个带有播放、暂停按钮和旋转3D对象选项的JavaFX交互式动画

我在JavaFX中找不到任何基本示例,似乎我必须重新创建自己的mediaplayer。

看看这个,F(X)yz是一个开放源码

JavaFX3D库,提供基础JavaFX83D包所不具备的其他原语、复合对象、控件和数据可视化

有几个组件可以帮助您。例如,所有的
TexturedMesh
子类都是3D形状,允许使用数学表达式(通过使用纹理)创建等高线图

作为一个例子,看看二十面体

你会看到类似的东西

您可以在子场景的顶部添加常用的媒体播放器控件,并将它们绑定到动画。还可以添加其他动画来旋转三维形状

因此,您唯一需要添加的是将数据文件传递到形状的方法。。。您可以在F(X)yz上添加功能请求,提供一些特定格式的数据、所需的形状


有关更多信息,您也可以看一看。

请详细说明您要实现的目标?什么样的数据文件?@jdub1581是一个csv文件,用逗号分隔,文件格式如下:时间,x1,y1,z1,x2,y2,z2,。。。(x1,y1,z1)是第一个点的坐标,(x2,y2,z2)是第二个点的坐标等。。。我必须从该文件中读取数据,并将结果显示为3D动画,这样我就可以转动相机。我还需要添加视频控件(播放/暂停、停止和时间滑块)来在动画中导航。好了,我想我现在明白多了,MediaPlayer把我甩了。。那么{x,y,z}值是网格中的顶点吗?或者说是“球体”的位置?你需要向前和向后插值吗?@jdub1581{x,y,z}值代表一个球体位置,不,我不需要插值。我想你不会发现很多“预先制作”的东西。。(只是大声思考)首先你需要一个解析器。。一个列表,用于存储您的积分,另一个用于存储时间。你可以使用时间线,但这有它自己的困难。你也可以使用AnimationTimer(像一个持续运行的游戏循环),这可能是与标准动画结合使用时最简单的方法。构建GUI(按钮等),让它启动和停止计时器。在计时器中,创建一些布尔标志:if(canRotate())->startRotate()。。。其中startRotate开始旋转转换。。
private IcosahedronMesh ico;
private DensityFunction<Point3D> dens = p-> (double)p.x*p.y*p.z;

@Override
public void start(Stage primaryStage) throws Exception {
     ...
     ico = new IcosahedronMesh(5,1f);
     ico.setTextureModeVertices3D(1530,dens);

     Group sceneRoot = new Group(ico);
     Scene scene = new Scene(sceneRoot, 800, 600, true, SceneAntialiasing.BALANCED);
     ...
}
long lastEffect = System.nanoTime();
AtomicInteger count=new AtomicInteger();

AnimationTimer timerEffect = new AnimationTimer() {
    @Override public void handle(long now) {
        if (now > lastEffect + 50_000_000l) {
            double t=count.getAndIncrement()%10;
            dens = p->(double)(p.x+t)*(p.y+t)*(p.z+t);
            ico.setDensity(dens);
            lastEffect = now;
        }
    }
};
timerEffect.start();