2016-07-23 91 views
3

美好的一天!我有以下問題。圖形模型顯示不正確:模型的某些應該被前側隱藏的背面仍然可見。這裏有一些exmples澄清:(等距)enter image description hereTriangleMesh - 背面可見

(問題)

enter image description here

應用光與物質時,這種問題出來的尤其顯着。所以問題是JavaFX如何解決這個問題?

UPD:

public class VertexTest extends Application { 

    PerspectiveCamera camera; 
    Cam cam = new Cam(); 
    double mouseOldX, mouseOldY, mousePosX, mousePosY, mouseDeltaX, mouseDeltaY; 

    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage primaryStage) throws Exception { 
     TriangleMesh mesh = new Shape3DRectangle(100, 100, 100); 
     MeshView view = new MeshView(mesh); 
     view.setDrawMode(DrawMode.LINE); 
     view.setMaterial(new PhongMaterial(Color.RED)); 

     cam.getChildren().add(view); 

     Scene scene = new Scene(cam, 1000, 1000, true); 

     addEvents(view, scene); 

     camera = new PerspectiveCamera(); 
     camera.setTranslateX(-500); 
     camera.setTranslateY(-500); 
     camera.setTranslateZ(1000); 


     scene.setCamera(camera); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

    private void addEvents(MeshView view, Scene s) { 

     s.setOnMouseDragged(new EventHandler<MouseEvent>() { 
      public void handle(MouseEvent me) { 
       mouseOldX = mousePosX; 
       mouseOldY = mousePosY; 
       mousePosX = me.getX(); 
       mousePosY = me.getY(); 
       mouseDeltaX = mousePosX - mouseOldX; 
       mouseDeltaY = mousePosY - mouseOldY; 
       cam.ry.setAngle(cam.ry.getAngle() - mouseDeltaX); 
       cam.rx.setAngle(cam.rx.getAngle() + mouseDeltaY); 
      } 
     }); 
    } 

    class Cam extends Group { 
     Translate t = new Translate(); 
     Translate p = new Translate(); 
     Translate ip = new Translate(); 
     Rotate rx = new Rotate(); 
     { 
      rx.setAxis(Rotate.X_AXIS); 
     } 
     Rotate ry = new Rotate(); 
     { 
      ry.setAxis(Rotate.Y_AXIS); 
     } 
     Rotate rz = new Rotate(); 
     { 
      rz.setAxis(Rotate.Z_AXIS); 
     } 
     Scale s = new Scale(); 

     public Cam() { 
      super(); 
      getTransforms().addAll(t, p, rx, rz, ry, s, ip); 
     } 
    } 



    public class Shape3DRectangle extends TriangleMesh { 

     public Shape3DRectangle(float Width, float Height, float deep) { 

      this.getPoints().setAll(-Width/2, Height/2, deep/2, // idx p0 
        Width/2, Height/2, deep/2, // idx p1 
        -Width/2, -Height/2, deep/2, // idx p2 
        Width/2, -Height/2, deep/2, // idx p3 
        -Width/2, Height/2, -deep/2, // idx p4 
        Width/2, Height/2, -deep/2, // idx p5 
        -Width/2, -Height/2, -deep/2, // idx p6 
        Width, -Height/2, -deep/2 // idx p7 
      ); 

      this.getTexCoords().addAll(0.0f, 0.0f); 

      this.getFaces().addAll(5, 0, 4, 0, 0, 0 // P5,T1 ,P4,T0 ,P0,T3 
        , 5, 0, 0, 0, 1, 0 // P5,T1 ,P0,T3 ,P1,T4 
        , 0, 0, 4, 0, 6, 0 // P0,T3 ,P4,T2 ,P6,T7 
        , 0, 0, 6, 0, 2, 0 // P0,T3 ,P6,T7 ,P2,T8 
        , 1, 0, 0, 0, 2, 0 // P1,T4 ,P0,T3 ,P2,T8 
        , 1, 0, 2, 0, 3, 0 // P1,T4 ,P2,T8 ,P3,T9 
        , 5, 0, 1, 0, 3, 0 // P5,T5 ,P1,T4 ,P3,T9 
        , 5, 0, 3, 0, 7, 0 // P5,T5 ,P3,T9 ,P7,T10 
        , 4, 0, 5, 0, 7, 0 // P4,T6 ,P5,T5 ,P7,T10 
        , 4, 0, 7, 0, 6, 0 // P4,T6 ,P7,T10 ,P6,T11 
        , 3, 0, 2, 0, 6, 0 // P3,T9 ,P2,T8 ,P6,T12 
        , 3, 0, 6, 0, 7, 0 // P3,T9 ,P6,T12 ,P7,T13 
      ); 
     } 
    } 

} 
+1

無代碼我唯一可以說的是:***祝你好運*** –

+0

@ΦXocę웃Пepeúpa謝謝你的願望) –

回答

3

我一直在與樣品玩弄,我想我已經找到了你的問題的原因。

首先,我檢查了臉部的纏繞。他們都是逆時針的,所以他們所有的法線都應該是向外的。

然後我修改了其他頂點而不是最後一個頂點。在某些情況下,沒有問題,而在其他情況下,問題仍然存在。

基本上,當存在「凹面」表面時,問題就會發生,這意味着兩個面有法線交叉。當所有表面都是「凸起的」時不會發生,這意味着它們的法線指向外並且不會交叉。

這既是型網格從here拍攝的清晰圖像:

enter image description here

返回到您的樣品,要定義一個凹目:

issue

但如果而不是修改頂點#7,我們使#5更大,我們有一個凸面網格,沒有渲染問題:

no issue

顯然,雖然這樣可以解決渲染問題,但它會改變您的初始形狀。

如果你想保持你的初始幾何,其他可能的解決方案是改變面,所以你沒有任何凹面區域。

讓我們來看一下5-1-3和5-3-7的面部,假設我們現在想要移動頂點#1。

如果我們保留三角形,面5-1-3和5-3-7將定義要渲染的凹面(它們的法線會交叉),而如果我們將這些三角形更改爲5-1-7並且1-3-7,那麼表面就會凸起(它們的法線不穿越):

normals

回到你最初的形狀,這種變化在這兩個面將解決渲染問題。

Solved

雖然頂點是一樣的,幾何形狀是一點點差別。所以它需要一些改進(更多元素)。應該牢記這個凸面概念來添加這些元素。但是,這個問題並不是微不足道的,因爲您可以看到here

+0

我想說感謝所有與JavaFx技術相關的答案。不幸的是,我需要工作的物體包含數百萬個面並且具有複雜的形狀。最重要的是,我在您的回覆中找到了正確的方向,並感謝您的特別感謝。 –

+0

我的榮幸,很高興能有任何幫助。我根據你的問題和示例代碼發現了這個問題,之前我沒有想到它,也沒有在其他地方找到它。可能它應該在文檔中提到...... –

0

您可以設置cullFaceProperty爲每一個Shape3D。我想這就是你需要的,但我不確定我是否正確理解你的問題。

Shape3D#cullFaceProperty

1

好的分析由何塞,但它看起來好像OP剛剛忘記在他的代碼的這一行中劃分寬度2。

Width, -Height/2, -deep/2 // idx p7 

應該

Width/2, -Height/2, -deep/2 // idx p7 

類被稱爲Shape3DRectangle但這個錯誤 幾何不再被矩形。

+0

也許這是一個錯字,但OP明確要求背面問題。這是一個可能的場景,你有一個盒子,你開始扭曲它的頂點創建其他3D形狀,而不總是一致和凸起的。 –

+0

mipa @JoséPereda是對的。班級名稱來自之前的測試...我的壞... –