2010-01-25 59 views
6

我通過製作MeshGeometry3D並向其添加頂點和法線來渲染WPF 3D場景。渲染場景中的所有東西都看起來不錯(材質看起來很好),但在網格三角形重疊的位置,靠近相機的三角形不一定呈現在頂部。它看起來像是以隨機順序繪製的。有什麼辦法可以確保網格三角形以「正確」順序呈現?WPF三角形重疊問題

萬一有幫助,這是我的XAML:

<Viewport3D> 
    <ModelVisual3D> 
     <ModelVisual3D.Content> 
      <Model3DGroup> 
       <AmbientLight Color="#FF5A5A5A" /> 
       <GeometryModel3D x:Name="geometryModel"> 
        <GeometryModel3D.Material> 
         <DiffuseMaterial Brush="DarkRed"/> 
        </GeometryModel3D.Material> 
       </GeometryModel3D> 
      </Model3DGroup> 
     </ModelVisual3D.Content> 
    </ModelVisual3D> 
</Viewport3D> 

,並在代碼中,我生成網格是這樣的:

var mesh = new MeshGeometry3D(); 

foreach (var item in objectsToTriangulate) { 
    var triangles = item.Triangulate(); 
    foreach (var triangle in triangles) { 
     mesh.Positions.Add(triangle.Vertices[0]); 
     mesh.Positions.Add(triangle.Vertices[1]); 
     mesh.Positions.Add(triangle.Vertices[2]); 
     mesh.Normals.Add(triangle.Normal); 
     mesh.Normals.Add(triangle.Normal); 
     mesh.Normals.Add(triangle.Normal); 
    } 
} 

geometryModel.Geometry = mesh; 

編輯:三角形沒有相交(除了在邊緣處),有時在頂部出現的三角形實際上是在另一個後面,所以我不認爲這是三角形的3D排序的模棱兩可的問題,正如Ray Burns所建議的那樣。

我注意到的其他行爲是,當我在場景中移動時,三角形渲染的順序似乎沒有改變。即如果我從另一面查看問題區域,則三角形將呈現相同的現在「正確」順序。

回答

6

在WPF中,就像在大多數3D系統中一樣,假設任何給定的三角形完全位於任何其他給定三角形的前面或完全位於其後面。但實際上並非總是如此。具體來說,如果兩個三角形沿着它們的內部相交(而不僅僅是在它們的邊緣處)並且不沿着它們的分割線觀看,則準確的渲染會將每個三角形前部繪製爲視口的一部分。

由於這個假設,3D引擎通過考慮他整個三角形與照相機相距一定距離來排序三角形。它可以選擇三角形的最近的角落,最遠的角落,平均角落或者使用其他算法,但是最終它選擇用於計算Z順序的代表點。

我的猜測是,你的三角形的結構方式,代表點是用於計算Z順序是導致他們以意想不到的順序顯示。

編輯

從您在編輯提供的信息,我可以看到我的第一個猜測是錯誤的。如果它對其他人有用,我會留下它,並提供一些我有過的更多想法。希望別人能在這裏發出響聲。我自己從未有過這種深度問題,所以這些都只是教育猜測。

這裏是我的想法:

  1. 這可能是因爲你的BackMaterial未設置或透明的,導致你只能看到三角形,其纏繞順序爲順時針方向從你的角度。根據您的實際網格,缺失的不可見三角形可能會使後面的三角形看起來重疊,實際上它們只是通過它們可見。如果材質未設置或透明,也可能發生這種情況。

  2. 某些事情明確地確定三角形顯示的順序。它可能是您的TriangleIndices數組的順序嗎?如果您隨機對TriangleIndices數組重新排序(當然是三組),而不做任何其他更改,它是否會更改顯示?如果是這樣,你已經學到了關於這個問題的一些東西,並且可能找到了一個解決方法(如果它使用TriangleIndices順序,你可以自己排序)。

  3. 如果您正在使用ProjectionCamera或OrthoGraphicCamera,是NearPlaneDistance和FarPlaneDistance設置是否正確?特別是錯誤的NearPlaneDistance可能會使三角形更接近你,使其看起來更遠處的三角形實際上被繪製在頂部。錯誤的距離也會影響深度緩衝區的粒度,這可能會給您帶來的影響。

  4. 您的模型是非常大還是非常小?如果您縮放模型和相機位置,它是否有所作爲?深度緩衝區通常是32位整數,所以在極小的模型中可能有兩個三角形舍入相同的深度緩衝區值。這也會導致你描述的效果。

  5. 這可能是您遇到錯誤。您可以嘗試進行一些更改以查看它們是否會影響問題,例如,您可以嘗試僅使用純軟件渲染,使用不同的照明類型(漫反射和鏡面反射等),不同的相機類型,來自不同供應商的圖形卡等。

我希望其中的一些想法有所幫助。

+0

感謝您的幫助。我不認爲這是問題,正如我在對問題的編輯中解釋的那樣。還有什麼想法? 關於你的一面:我意識到能夠指定獨特的頂點,然後調用'TriangleIndices.Add(...)',但我沒有這樣做,因爲我希望我所有的網格面都有它們的自己的法線(通常我使用平坦的表面渲染項目,而我不想要光滑的網格)。考慮到我對不同法線的渴望,是否有重複的頂點是不好的,或者沒有什麼可做的事情? – 2010-01-26 02:05:46

+0

我拿出了關於共享頂點的評論,因爲如果你想控制法線,你需要單獨的頂點。我還添加了我的其他幾個想法。希望別人也會在這裏發出噓聲。 – 2010-01-26 08:42:51

+0

那麼,#3是它!我把我的NearPlaneDistance設置爲0,我想這使得WPF對深度緩衝區更加隨意。將其設置爲0.5會使所有內容看起來不錯。非常感謝所有的幫助! – 2010-01-26 14:08:56