2015-09-04 107 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); 
} 

希望這可以幫助別人的未來!