Comment créer un cylindre creux et un cône tronqué avec JavaFX?


J'apprends JavaFX 3D. Jusqu'à présent, je n'ai pas trouvé de moyen de créer les objets suivants:

  • cylindre Creux
  • cône Tronqué

Quelqu'un peut-il me donner un exemple de code court?

Toute aide sera appréciée. :-)

Author: mamgoo, 2015-09-04

2 answers

Je sais que c'est une vieille question mais j'ai essayé de résoudre un problème similaire, alors voici ma solution pour le cône tronqué:

public class Cone extends Group{

int rounds = 360;
int r1 = 100;
int r2 = 50;
int h = 100;

public Cone() {
    Group cone = new Group();
    PhongMaterial material = new PhongMaterial(Color.BLUE);

    float[] points = new float[rounds *12];
    float[] textCoords = {
            0.5f, 0,
            0, 1,
            1, 1
    };
    int[] faces = new int[rounds *12];

    for(int i= 0; i<rounds; i++){
        int index = i*12;
        //0
        points[index] = (float)Math.cos(Math.toRadians(i))*r2;
        points[index+1] = (float)Math.sin(Math.toRadians(i))*r2;
        points[index+2] = h/2;
        //1
        points[index+3] = (float)Math.cos(Math.toRadians(i))*r1;
        points[index+4] = (float)Math.sin(Math.toRadians(i))*r1;
        points[index+5] = -h/2;
        //2
        points[index+6] = (float)Math.cos(Math.toRadians(i+1))*r1;
        points[index+7] = (float)Math.sin(Math.toRadians(i+1))*r1;
        points[index+8] = -h/2;
        //3
        points[index+9] = (float)Math.cos(Math.toRadians(i+1))*r2;
        points[index+10] = (float)Math.sin(Math.toRadians(i+1))*r2;
        points[index+11] = h/2;        
    }

    for(int i = 0; i<rounds ; i++){
        int index = i*12;
        faces[index]=i*4;
        faces[index+1]=0;
        faces[index+2]=i*4+1;
        faces[index+3]=1;
        faces[index+4]=i*4+2;
        faces[index+5]=2;

        faces[index+6]=i*4;
        faces[index+7]=0;
        faces[index+8]=i*4+2;
        faces[index+9]=1;
        faces[index+10]=i*4+3;
        faces[index+11]=2;
    }

    TriangleMesh mesh = new TriangleMesh();
    mesh.getPoints().addAll(points);
    mesh.getTexCoords().addAll(textCoords);
    mesh.getFaces().addAll(faces);

    Cylinder circle1 = new Cylinder(r1, 0.1);
    circle1.setMaterial(material);
    circle1.setTranslateZ( -h / 2);
    circle1.setRotationAxis(Rotate.X_AXIS);
    circle1.setRotate(90);

    Cylinder circle2 = new Cylinder(r2, 0.1);
    circle2.setMaterial(material);
    circle2.setTranslateZ( h / 2);
    circle2.setRotationAxis(Rotate.X_AXIS);
    circle2.setRotate(90);


     MeshView meshView = new MeshView();
    meshView.setMesh(mesh);
    meshView.setMaterial(material);
    //meshView.setDrawMode(DrawMode.LINE);
    cone.getChildren().addAll(meshView);
    Rotate r1 = new Rotate(90, Rotate.X_AXIS);
    cone.getTransforms().add(r1);
    getChildren().addAll(cone);
}

J'espère que cela aidera quelqu'un à l'avenir!

 2
Author: tokyo, 2017-05-02 10:52:45

Le premier - créez un cylindre et utilisez deux objets d'apparence différents - un pour le cylindre, le côté et un pour les deux bases. Pour les deux bases, utilisez une apparence invisible (attributs de rendu). Pour plus d'informations sur la façon de définir différentes apparences sur des bases, définissez thread: http://forum.java.sun.com/thread.jspa?threadID=663825&tstart=0

La seconde - utilisez un plan d'écrêtage pour clipser le bas et le haut du cylindre, et vous avez un cylindre creux.

Ces deux méthodes vous donnera un cylindre creux avec un intérieur COMPLÈTEMENT vide.

Si vous cherchez à avoir des murs avec une épaisseur donnée, un ensemble d'opérations booléennes est disponible sur Internet. Créez un grand cylindre et soustrayez un cylindre plus petit. Pour plus d'informations sur l'ensemble op booléen, définissez ce thread: http://forum.java.sun.com/thread.jspa?threadID=658612&tstart=0

Enfin, il est vraiment assez facile de créer soi-même la géométrie d'un cylindre, et il peut être automatisé très facilement avec une boucle. Je voudrais créer quatre géométries distinctes: une pour le cylindre intérieur avec le rendu des visages à l'intérieur, une pour l'extérieur du cylindre, avec le rendu des visages sur l'extérieur, un pour la base, un disque avec un trou au milieu et en bas surfaces rendu, et un pour le haut, un autre disque avec un trou au milieu et en haut des surfaces rendues.

Tout cela peut être fait assez facilement avec un tableau de bandes triangulaires.

 0
Author: Gerhard Eder, 2015-09-04 10:56:51