2016-05-14 15 views
2

Ich versuche meine eigene 3D-Oberflächenanimation in JavaFX zu implementieren, aber ich verstehe nicht alles so, wie es funktionieren sollte, könnte mir jemand mit dem Verständnis helfen, was wohin gehen soll?3D-Oberfläche JavaFX

  • wissen bereits, dass Ineinander greifen zu bauen nach Klasse verwenden, müssen Klassenobjekt TraingleMesh und müssen dann Punkte hinzufügen, indem Methode mesh.getPoints.addAll(...); aber .. mein Function<Double, Double> nach apply Methode hat mir nicht helfen, Cuz das erste Argument muss Array-Float-Typ sein, nicht double Variable nach dem Anwenden von Daten.

    • Wie könnte ich dieses Problem lösen?
  • fand ich einige Implementierungen von Textur und durch @Roland hier erstellt Gesichter:

3D surface - stack

  • Wie Texturen und Gesichter zu arbeiten?

Es ist wirklich wichtig für mich, danke für Hilfe!

+0

Ist das Animieren einer sich ändernden Textur auf einem "c onstant "Oberfläche oder über die Änderung der Oberfläche? – fabian

+0

Es wird die Oberfläche mit den neuen Daten basierend auf der Zeit ändern – yerpy

Antwort

3

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 Function2DPlotTesthere.

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

SurfacePlotMesh

Und wenn Sie eine Dichtekarte hinzufügen:

:

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

Sie diese erhalten

Textured SurfacePlotMesh

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:

SurfacePlotMesh 2

SurfacePlotMesh 3

SurfacePlotMesh 4

+0

Ich habe Jar's zu Java-Projekt und es funktioniert nicht, immer noch zum Beispiel auf "SurfacePlotMesh" kann nicht auflösen Symbol. – yerpy

+0

Welche Version von Java verwenden Sie? Was sind deine Importe? Vielleicht fehlt dir der korrekte Import? – Birdasaur

+0

Ich löste dieses Problem, indem ich die gesamte Quelle in das Projekt importierte, nicht nur – yerpy