Schauen Sie sich den FXyz library an. Es ist Open Source, und Sie können aus dem Code lernen.
Für Texturen, sehen Sie sich diese post.
FXyz hat eine SurfacePlotMesh
Klasse, die genau das tut, was Sie wollen: Grundstück eine 3D-Oberfläche auf der Basis einer Funktion g = f(x,y)
, durch einen Function<Point2D, Number> function
Parameter verwendet wird.
Es enthält auch Texturierung, so dass Sie eine Dichtekarte in Bezug auf Function<Point3D, Number> density
einschließen können. Jeder Wert wird einer Farbe zugeordnet.
Überprüfen Sie diesen Test Function2DPlotTest
here.
Mit diesem Code-Schnipsel Sie eine Funktion zeichnen kann:
@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();
}

Und wenn Sie eine Dichtekarte hinzufügen:
:
surface.setTextureModeVertices3D(1530, p -> p.magnitude());
Sie diese erhalten

Jetzt
, wenn Sie eine Animation der Oberfläche wollen, müssen Sie nur eine erstellen:
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();
}
Und Sie werden Ihre Oberfläche Animation erhalten:



Ist das Animieren einer sich ändernden Textur auf einem "c onstant "Oberfläche oder über die Änderung der Oberfläche? – fabian
Es wird die Oberfläche mit den neuen Daten basierend auf der Zeit ändern – yerpy