2017-10-21 51 views
2

J'ai écrit un objet javafx "Ball" pour créer une sphère. J'essaie maintenant de faire apparaître l'objet dans ma classe principale. Idéalement, j'utiliserais un écouteur clé pour créer/détruire des balles. Mais je ne peux même pas faire apparaître les boules sur l'écran, ni même faire apparaître mon écran 1500x900.Comment afficher un objet 3D javafx?

Voici mon code pour la balle:

// ball object 
package bouncingballs; 

import javafx.animation.Interpolator; 
import javafx.animation.PathTransition; 
import javafx.animation.Timeline; 
import javafx.scene.layout.Pane; 
import javafx.scene.paint.PhongMaterial; 
import javafx.scene.shape.Polygon; 
import javafx.scene.shape.Sphere; 
import javafx.util.Duration; 
import static javafx.util.Duration.seconds; 

public class Ball extends Pane { 
    //Create 3D ball 
    private Sphere ball; 
    private Double radius; 
    private PhongMaterial color; 
    private Polygon poly; 

    private PathTransition path; 
    private Integer speed; 
    //Create path and animate ball in constructor 
    public Ball(Double radius, PhongMaterial color, Polygon poly) { 
     this.radius = radius; 
     this.color = color; 
     ball.setRadius(radius); 
     ball.setMaterial(color); 
     this.poly = poly; 
     speed = 10; 
     path.setPath(poly); 
     path.setNode(ball);    
     path.setInterpolator(Interpolator.LINEAR); 
     path.setDuration(Duration.seconds(speed)); 
     path.setCycleCount(Timeline.INDEFINITE); 
     path.play(); 

    } 

    //some test accessors/mutators 
    public void setRadius(Double radius) { 
     this.radius = radius; 
    } 

    public Double getRadius() { 
     return radius; 
    } 

} 

Voici mon code pour ma classe principale, il faut créer des objets de balle et de les afficher d'animation. L'animation doit suivre l'objet Polygon poly pour simuler une balle rebondissante.

//main object to show Balls to screen 
package bouncingballs; 

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.layout.StackPane; 
import javafx.scene.paint.Color; 
import javafx.scene.paint.PhongMaterial; 
import javafx.scene.shape.Polygon; 
import javafx.stage.Stage; 

public class BouncingBalls extends Application { 
    @Override 
    public void start(Stage primaryStage) { 

     //create path to simulate bouncing ball 
     Polygon poly = new Polygon(750, 850, 50, 675, 500, 50, 750, 850, 1000, 50, 1450, 675);//creates path to simulate bouncing ball on 1500x900 screen 
     Double radius = 50.0; 
     PhongMaterial color = new PhongMaterial(); 
     color.setDiffuseColor(Color.OLIVE); 
     Ball ball = new Ball(radius, color, poly); 
     StackPane root = new StackPane(); 
     root.getChildren().add(ball); 
     Scene scene = new Scene(root, 1500, 900); 
     primaryStage.setTitle("Bouncing Balls"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

public static void main(String[] args) 
    {launch(args); 
    } 

} 

Répondre

3

Vous avez un tas d'erreurs ou des choses autrement étranges:

  1. Votre classe Ball crée une sphère, mais vous ne jamais ajouter que Sphère au graphe de scène (il ne pourrait jamais être vu).
  2. Votre classe Ball étend le volet, ce qui est étrange car une balle n'est pas vraiment une fenêtre. Si vous voulez étendre quelque chose, Sphère serait probablement le meilleur.
  3. Vous utilisez un StackPane pour votre racine. Il n'est probablement pas préférable de faire cela pour les graphiques 3D, car les sous-classes de Pane sont vraiment conçues pour la mise en page de systèmes 2D. Pour la 3D, vous voulez probablement simplement coller aux groupes de base en tant que conteneurs.
  4. Lorsque vous avez une scène 3D, vous voulez probablement utiliser le constructeur qui active la mémoire tampon de profondeur.
  5. Pour le travail en 3D, vous souhaitez définir un PerspectiveCamera sur la scène.
  6. Vous voulez probablement un éclairage sur votre scène. JavaFX ajoute un éclairage par défaut, mais il peut ne pas correspondre à ce dont vous avez besoin.
  7. Vous devriez vérifier le Scene3D ConditionalFeature pour voir si 3D est pris en charge sur votre plate-forme.
  8. Vous souhaitez probablement définir correctement les coordonnées Z de votre Sphère et vous assurer que c'est quelque chose qui se situera dans le champ de vision de votre caméra perspective.

Vous pouvez trouver un exemple de code qui affiche une sphère (la terre), ici:

L'exemple montre quelques-uns des points soulevés ci-dessus.