2016-05-14 7 views
2

J'essaye d'implémenter ma propre animation de surface 3D dans JavaFX mais je ne comprends pas tout comme cela devrait fonctionner, est-ce que quelqu'un pourrait m'aider à comprendre ce qui devrait aller où?Surface 3D JavaFX

  • Vous savez déjà que pour construire Mesh en utilisant la classe besoin objet de classe TraingleMesh et d'avoir à ajouter des points en utilisant la méthode mesh.getPoints.addAll(...); mais .. mon Function<Double, Double> après avoir utilisé la méthode apply ne me permet pas du tout, cuz le premier argument doit être de type float de tableau, pas double variable après l'application de certaines données.

    • Comment pourrais-je résoudre ce problème?
  • J'ai trouvé quelques implémentations de texture et des visages créés par @Roland ici:

3D surface - stack

  • Comment les textures et les visages de travail?

C'est vraiment important pour moi, merci pour votre aide!

+0

S'agit-il d'animer une texture changeante sur un "c surface "constante" ou sur le changement de la surface? – fabian

+0

Il va changer la surface avec les nouvelles données basées sur le temps – yerpy

Répondre

3

Jetez un oeil à la FXyz library. C'est open source, et vous pouvez apprendre du code. Pour les textures, jetez un oeil à ce post.

fxyz a une classe SurfacePlotMesh qui fait exactement ce que vous voulez: tracer une surface 3D basée sur une fonction g = f(x,y), en utilisant un paramètre Function<Point2D, Number> function.

Il inclut également la texturation, de sorte que vous pouvez inclure une carte de densité en termes de Function<Point3D, Number> density. Chaque valeur est mappée à une couleur.

Cochez cette case Function2DPlotTesthere.

Avec ce code snippet vous pouvez tracer une fonction:

@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

Et si vous ajoutez une carte de densité:

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

vous obtiendrez ceci:

Textured SurfacePlotMesh

Maintenant, si vous voulez une animation de la surface, il vous suffit de créer un:

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

Et vous obtiendrez votre animation de surface:

SurfacePlotMesh 2

SurfacePlotMesh 3

SurfacePlotMesh 4

+0

J'ai inclus jar de projet java et il ne fonctionne pas, toujours pour exmaple sur "SurfacePlotMesh" ne peut pas résoudre le symbole. – yerpy

+0

Quelle version de Java utilisez-vous? Quelles sont vos importations? Peut-être que vous manquez l'importation correcte? – Birdasaur

+0

J'ai résolu ce problème en important toute la source au projet, pas seulement – yerpy