2017-03-23 7 views
0

Je fais une application avec une énorme masse de formes 3D et j'ai besoin d'eux entièrement transparent et avec bordure. J'ai essayé de trouver un moyen d'appliquer une bordure à Shape3D, spécifiquement à Box et Sphere mais je ne trouve rien. Donc mes questions sont:javafx Shape3D avec bordure

  • Est-il possible d'ajouter une bordure à Shape3D?
  • Si oui, comment le faire?
+1

Je suppose que vous ne parlez pas de dessiner des wireframes en utilisant 'drawMode'' DrawMode.LINE' ??? – fabian

+0

Vous ne pouvez pas vraiment ajouter une bordure à un Shape3D arbitraire dans JavaFX via l'API. – Birdasaur

+0

Vous pouvez créer un second maillage qui trace essentiellement les sommets du premier maillage en utilisant un algorithme comme l'algorithme FXyz3d.org PolyLine3D. Cela créerait essentiellement une structure de squelette comme un seul maillage. Quel que soit l'algorithme que vous avez implémenté, vous devez imiter le motif d'enroulement du maillage d'origine dans une certaine mesure. Cela devrait probablement être personnalisé pour un maillage particulier. Je ne suis pas sûr qu'il serait possible d'avoir un algorithme de traçage générique comme ça. (au moins dans JavaFX 3D) – Birdasaur

Répondre

0

Non, il n'y a pas possibilité d'ajouter des bordures aux formes 3D, mais vous pouvez utiliser cyllinders très mince à la place (ne fonctionne que pour les boîtes bien):

public void createBoxLines(double contW, double contH, double contD, double x, double y, double z) { 
     //You call this method to create a box with a size and location you put in 
     //This method calls the createLine method for all the sides of your rectangle 
     Point3D p1 = new Point3D(x, y, z); 
     Point3D p2 = new Point3D(contW + x, y, z); 
     Point3D p3 = new Point3D(x, contH + y, z); 
     Point3D p4 = new Point3D(contW + x, contH + y, z); 
     createLine(p1, p2); 
     createLine(p1, p3); 
     createLine(p3, p4); 
     createLine(p2, p4); 

     Point3D p5 = new Point3D(x, y, contD + z); 
     Point3D p6 = new Point3D(contW + x, y, contD + z); 
     Point3D p7 = new Point3D(x, contH + y, contD + z); 
     Point3D p8 = new Point3D(contW + x, contH + y, contD + z); 
     createLine(p5, p6); 
     createLine(p5, p7); 
     createLine(p7, p8); 
     createLine(p6, p8); 

     createLine(p1, p5); 
     createLine(p2, p6); 
     createLine(p3, p7); 
     createLine(p4, p8); 
    } 

    double strokewidth = 1; 
    public void createLine(Point3D origin, Point3D target) {   
     //creates a line from one point3d to another 

     Point3D yAxis = new Point3D(0, 1, 0); 
     Point3D diff = target.subtract(origin); 
     double height = diff.magnitude(); 

     Point3D mid = target.midpoint(origin); 
     Translate moveToMidpoint = new Translate(mid.getX(), mid.getY(), mid.getZ()); 

     Point3D axisOfRotation = diff.crossProduct(yAxis); 
     double angle = Math.acos(diff.normalize().dotProduct(yAxis)); 
     Rotate rotateAroundCenter = new Rotate(-Math.toDegrees(angle), axisOfRotation); 

     Cylinder line = new Cylinder(strokewidth, height); 

     line.getTransforms().addAll(moveToMidpoint, rotateAroundCenter); 

     myGroup.getChildren().add(line); 
    } 

La méthode createLine peut être utilisé séparément pour faire des lignes entre différents points. Je ne peux pas fournir beaucoup de commentaires pour cette méthode, parce que j'ai essentiellement copié à partir d'un blog. Bien que j'ai du mal à trouver ce blog à nouveau.

+0

Pensez à ajouter des commentaires dans votre code pour clarifier ce qu'il fait. –