2016-05-17 38 views
0

我用下面的代碼頂點和法線玩:3d矩形開關可見一側在負z?

float col = 0; 
    float row = 0; 
    float level = 1; 

private Vector3 tmp(float x, float y, float z) { 
     return new Vector3(x, y, z); 
    } 

    meshPartBuilder.rect(tmp(col, 0, row +1), 

      tmp(col, level, row +1), 

      tmp(col, level, row), 

      tmp(col, 0, row), new Vector3(-1, 0, 0)); 

這給了我預期的結果:

enter image description here

現在我進入負Z區域:

meshPartBuilder.rect(tmp(col, 0, row - 1), 

      tmp(col, level, row - 1), 

      tmp(col, level, row), 

      tmp(col, 0, row), new Vector3(-1, 0, 0)); 

enter image description here

現在突然間矩形不可見。由於未知的原因,從另一側可以看到,看起來「可見」側已經切換到負z時。

enter image description here

進入負Z時,我怎樣才能使矩形可見?

回答

1

這被稱爲背面剔除。頂點的順序(逆時針方向)用於確定面的哪一面在前面,哪一面是背面。背面默認情況下不會渲染(剔除),因此GPU無需渲染無論如何都不可見的東西。

MeshPartBuilder#rect方法允許您在查看矩形正面時指定角點。 Corner00是左下角,corner10是右下角,corner11是右上角,corner01是左上角。

透視投影默認使用右手系統。這意味着Z軸指向觀察者。所以你實際上必須交換水平角以使其從另一側可見。或者,如果你願意,你可以交換垂直的角落。

+0

歡呼的答案@Xoppa,我理解背面剔除和直接工作的方式。因爲我渲染的臉是左側,我使用矩形001,011,010,000作爲矩形函數(http://www.scratchapixel.com/old/assets/Uploads/Interpolation/trilinearfig.png)。我很感謝您交換角落的解決方案,但我無法理解原因。你能解釋一下這一點嗎?我問這個,因爲否則我必須實現2種呈現矩形的方法,一種用於正z,另一種用於當直角位於負z中。 –

+0

你不明白什麼?您需要按照正確的順序指定角點。如果這意味着你必須以兩種方式來實現它,那就是這樣。 – Xoppa

+0

在今天早上重新看了這個話題之後,我開始更好地理解它,我對左窗格上的頂點繞組感到困惑。頂點風應始終逆時針旋轉,否則三角形將翻轉。 –