2015-09-04 294 views
0

我正在学习JavaFX 3D。到目前为止,我还没有找到一种方法,我怎样才能创建下列对象:如何用JavaFX创建空心圆柱体和圆锥体?

  • 空心圆柱
  • 圆台

可有人请给我一个短的代码示例?

任何帮助将不胜感激。 :-)

+0

我站在JavaFX的年初,我有几个3D例子中查看和Netbeans的尝试。我的问题是如何计算两个对象的TriangleMesh? – mamgoo

+0

那么,你可以[从thingsiverse下载一个圆柱体模型](http://www.thingiverse.com/thing:35331/#files),并用[interactive mesh importer](http://www.interactivemesh .ORG /模型/ jfx3dimporter.html)。但是,也许你不想要预先生成的模型,也许你实际上想要实现一种算法来为代码中的形状生成三角形网格,在这种情况下,我会建议您尝试自己解决问题并发布示例代码如果你遇到问题。相关:http://stackoverflow.com/questions/19459012/how-to-create-custom-3d-model-in-javafx-8。 – jewelsea

+0

“...要实现一个算法来为代码中的形状生成一个三角形网格。” - 是的,你是对的,因此我正在寻找一个示例代码来计算一个空心圆柱体,第一个步。 – mamgoo

回答

0

第一个 - 创建一个圆柱体,并使用两个不同的外观对象 - 一个用于圆柱体,一个用于两个基底。对于两个基地,使用不可见的外观(渲染属性)。有关如何设置不同外观的信息,请设置线程: http://forum.java.sun.com/thread.jspa?threadID=663825&tstart=0

第二个 - 使用裁剪平面夹住圆柱体的底部和顶部,并且您有一个空心圆柱体。

这两种方法会给你一个空心圆柱体具有完全空的内部。

如果你正在寻找有墙壁与给定的厚度,还有一个布尔运算设定在互联网上公布。创建一个大圆柱体,并减去一个较小的圆柱体。有关布尔操作集的信息,请设置以下线程:http://forum.java.sun.com/thread.jspa?threadID=658612&tstart=0

最后,您自己创建圆柱体的几何图形真的很容易,并且它可以通过循环很容易地实现自动化。我会创建四个独立的几何图形:一个用于内部渲染面的内部圆柱体,一个用于外部圆柱体,外部渲染面,底部一个,中间和底部有一个孔的圆盘渲染,一个用于顶部,另一个中间有孔的光盘,以及渲染的顶部表面。

这都可以用三角形条阵列很容易地完成。

+1

对不起,但您的所有链接都已损坏... – mamgoo

2

我知道这是一个老问题,但我一直在试图使这里解决类似的问题,是我截锥的解决方案:

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

希望这可以帮助别人的未来!