IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaFX Discussion :

Rotation avec des objets 3D


Sujet :

JavaFX

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 11
    Points : 9
    Points
    9
    Par défaut Rotation avec des objets 3D
    Bonjour a tous , je suis débutant en javafx et j'aimerais avoir des conseils concernant la manipulation d'objet 3D.

    Je me suis créer des objets 3D héritant de la classe Group de javafx. Je n'ai aucun problème concernant les translations cela fonctionne a merveille cependant je n'arrive pas a utiliser correctement les rotations quand mon objet est en 3 dimensions.

    Je m'explique , j'arrive a faire une rotation de mon objet mais celui-ci a pour centre de rotation son propre centre alors que j'aimerais le faire tourné autour du centre d'un autre objet 3D. Quelque chose m’échappe je n'arrive même pas a obtenir le centre d'un objet (x,y,z).

    ps : Dans mon cas je souhaite faire tourner un cylindre autour d'une sphère. Sachant que les 2 sont coller la rotation fera que le cylindre tourne bien autour de la sphère sans jamais la traverser ou la toucher.

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Même sans rien connaitre de particulier à la 3D, et avec mes maigres souvenirs de terminale/DEUG, j'ai pu faire ça assez rapidement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    package rotate3d;
     
    import javafx.animation.KeyFrame;
    import javafx.animation.KeyValue;
    import javafx.animation.RotateTransition;
    import javafx.animation.Timeline;
    import javafx.application.Application;
    import javafx.collections.FXCollections;
    import javafx.geometry.Point3D;
    import javafx.scene.Group;
    import javafx.scene.PerspectiveCamera;
    import javafx.scene.Scene;
    import javafx.scene.SceneAntialiasing;
    import javafx.scene.SubScene;
    import javafx.scene.control.Button;
    import javafx.scene.control.ComboBox;
    import javafx.scene.control.ListCell;
    import javafx.scene.control.ToolBar;
    import javafx.scene.layout.BorderPane;
    import javafx.scene.layout.Pane;
    import javafx.scene.paint.Color;
    import javafx.scene.paint.PhongMaterial;
    import javafx.scene.shape.Cylinder;
    import javafx.scene.shape.Sphere;
    import javafx.scene.transform.Rotate;
    import javafx.stage.Stage;
    import javafx.util.Duration;
     
    public final class Main extends Application {
     
        private ComboBox<Point3D> combo;
        private final Sphere sphere = new Sphere(50);
        private final Cylinder cylinder = new Cylinder(25, 100);
     
        @Override
        public void start(Stage primaryStage) {
            sphere.setTranslateX(400);
            sphere.setTranslateY(400);
            // Centre sphere à (400, 400, 0);
            sphere.setMaterial(new PhongMaterial(Color.RED));
            cylinder.setMaterial(new PhongMaterial(Color.CYAN));
            cylinder.setTranslateX(600);
            cylinder.setTranslateY(400);
            // Centre sphere à (600, 400, 0);
            final Group root3D = new Group();
            root3D.getChildren().addAll(sphere, cylinder);
            final SubScene subScene = new SubScene(root3D, 500, 500, true, SceneAntialiasing.BALANCED);
            final Pane pane3D = new Pane() {
                {
                    getChildren().add(subScene);
                }
     
                @Override
                protected void layoutChildren() {
                    subScene.setWidth(getWidth());
                    subScene.setHeight(getHeight());
                }
            };
            subScene.setFill(Color.BLACK);
            subScene.setCamera(new PerspectiveCamera());
            final Button button = new Button("Test");
            button.setOnAction(actionEvent -> toggleAnimation());
            combo = new ComboBox(FXCollections.observableArrayList(Rotate.X_AXIS, Rotate.Y_AXIS, Rotate.Z_AXIS));
            combo.getSelectionModel().select(Rotate.Y_AXIS);
            combo.setButtonCell(new AxisListCell());
            combo.setCellFactory(listView -> new AxisListCell());
            combo.valueProperty().addListener(observable -> {
                if (animation != null) {
                    boolean wasRunning = (animation.getStatus() == Timeline.Status.RUNNING);
                    animation.stop();
                    animation = null;
                    cylinder.getTransforms().clear();
                    if (wasRunning) {
                        toggleAnimation();
                    }
                }
            });
            final ToolBar toolBar = new ToolBar(button, combo);
            final BorderPane borderPane = new BorderPane();
            borderPane.setTop(toolBar);
            borderPane.setCenter(pane3D);
            final Scene scene = new Scene(borderPane, 800, 900);
            primaryStage.setTitle("Test Rotate 3D");
            primaryStage.setScene(scene);
            primaryStage.show();
        }
     
        private Timeline animation;
     
        private void toggleAnimation() {
            if (animation == null) {
                final Point3D axis = combo.getValue();
                final Rotate rotate = new Rotate(0, axis);
                // Centre rotation = centre sphere - centre cylindre
                rotate.setPivotX(400 - 600);
                rotate.setPivotY(400 - 400);
                rotate.setPivotZ(0 - 0);
                animation = new Timeline(
                        new KeyFrame(Duration.ZERO, new KeyValue(rotate.angleProperty(), 0)),
                        new KeyFrame(Duration.seconds(5), new KeyValue(rotate.angleProperty(), 360))
                );
                animation.setCycleCount(RotateTransition.INDEFINITE);
                cylinder.getTransforms().add(rotate);
            }
            if (animation.getStatus() == Timeline.Status.RUNNING) {
                animation.pause();
            } else {
                animation.play();
            }
        }
     
        public static void main(String[] args) {
            launch(args);
        }
     
        private static class AxisListCell extends ListCell<Point3D> {
     
            @Override
            protected void updateItem(Point3D item, boolean empty) {
                super.updateItem(item, empty);
                String text = null;
                if (!empty && item != null) {
                    if (Rotate.X_AXIS.equals(item)) {
                        text = "Axe X (" + item + ")";
                    } else if (Rotate.Y_AXIS.equals(item)) {
                        text = "Axe Y (" + item + ")";
                    } else if (Rotate.Z_AXIS.equals(item)) {
                        text = "Axe Z (" + item + ")";
                    }
                }
                setText(text);
            }
        }
    }
    Note : il faut penser à activer le depth buffer lors de la création de la sous-scène (paramètre à true dans le constructeur) sinon l'ordre Z des nœuds affichés est celui du SceneGraph et donc le cylindre s'affiche tout le temps par dessus la sphère même dans une animation autour de l'axe Y. Avec le depth buffer activé c'est bien la profondeur Z qui est utilisée et donc le cylindre passe bien derrière la sphère au cours de l'animation.

    Nom : cylindresorbitesphere.jpg
Affichages : 886
Taille : 31,1 Ko

    Pour des transfos plus complexes, je pense qu'il faut bien revoir ses bases en mathématiques dans l'espace.

    PS : la prochaine fois tu penseras à nous poster du code quand même !!!
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/06/2008, 18h03
  2. [XSD] Mapper intelligemment un XSD avec des Objets Java
    Par PoteA_Tooz dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 09/05/2008, 10h33
  3. [POO] Listing avec des objets
    Par estampille dans le forum Langage
    Réponses: 5
    Dernier message: 27/08/2007, 16h19
  4. Réponses: 1
    Dernier message: 05/06/2007, 17h14
  5. [C#]Travailler en synchrone avec des objets asynchrone
    Par mister3957 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 19/10/2006, 18h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo