2009-06-03 17 views
0

我使用Windows.Media.Media3D工具包將DirectX應用程序移植到WPF中。 除了即使已經獲得所有可能的數據,模型呈現完整之外,哪一個工作正常,並且都是正常工作的。MeshGeometry3D中的頂點平滑(WPF)

我懷疑這是因爲DirectX優化,並以某種方式平滑或幫助渲染額外的內容取決於頂點和指示。

所以我想知道是否有一個選項可以改變WPF渲染3D模型的方式?要表達我的意思有點困難,但我希望它能以某種方式理解。

這裏的重要代碼:

private void DrawModel() 
{ 
    SwordModel swordModel; 

    string filename = "PG_S8_02"; 

    using(FileStream stream = File.OpenRead(string.Format("Media/Models/{0}.gb", filename))) 
    using(BinaryReader reader = new BinaryReader(stream)) 
    { 
     swordModel = new SwordModel(reader);   
    } 

    var group = new Model3DGroup(); 

    foreach(var modelMesh in swordModel.Meshes) 
    { 
     var mesh3D = new MeshGeometry3D(); 

     // Indices 
     foreach(var index in modelMesh.Indices) 
     { 
      mesh3D.TriangleIndices.Add(index); 
     } 

     // Vertices 
     foreach(var vertex in modelMesh.Vertices) 
     { 
      mesh3D.Positions.Add(vertex); 
     } 

     // Normals 
     foreach(var normal in modelMesh.Normals) 
     { 
      mesh3D.Normals.Add(normal); 
     } 

     // Texture Coordinates 
     foreach(var vertex in modelMesh.Vertices) 
     { 
      mesh3D.TextureCoordinates.Add(new Point(vertex.X, vertex.Y)); 
     } 

     // Material 
     var material = new DiffuseMaterial(); 
     var texture = new BitmapImage(new Uri(
      string.Format("Media/Textures/{0}.png", filename), 
      UriKind.RelativeOrAbsolute 
     )); 
     material.Brush = new ImageBrush(texture);        

     // Add to View 
     group.Children.Add(
      new GeometryModel3D(mesh3D, material) 
     ); 
    }  

    mainViewport.Children.Add(
     new ModelVisual3D() { Content = group } 
    );   
} 

和XAML:

<Viewport3D Name="mainViewport" ClipToBounds="True"> 
    <Viewport3D.Camera> 
     <PerspectiveCamera 
      FarPlaneDistance="100" 
         LookDirection="-11,-10,-9" 
         UpDirection="0,1,0" 
         NearPlaneDistance="1" 
         Position="11,10,9" 
         FieldOfView="70" /> 
    </Viewport3D.Camera> 
    <ModelVisual3D> 
     <ModelVisual3D.Content> 
      <DirectionalLight Color="White" Direction="-2,-3,-1" /> 
     </ModelVisual3D.Content> 
    </ModelVisual3D> 
</Viewport3D> 

回答

2

的唯一的事情,但沒有看到網格看起來像我無法確定的。因此,我的意思是頂點法線與面向法線的平行線賦予網格多面的外觀。如果法線平滑,那麼整個形狀看起來很平滑。事情是這樣的:

平面渲染:

http://www.forman.free-online.co.uk/images/flatshading.png

光滑着色:

http://www.forman.free-online.co.uk/images/smoothshading.png

通過鏈接替換

圖像來限制我的帶寬使用

+0

它看起來像面子的「片面性」是問題(請參閱Ian Hopkinson的回答),雖然DirectX(我認爲)也是如此,所以我不能立即想到轉換會出錯的原因。 – ChrisF 2009-06-03 09:08:33

0

是否與片面性問題?默認情況下,我認爲WPF呈現方面 - 你不能從錯誤的一面看到它們。

同樣有燈光,你可以得到奇怪的效果,如果你的模型沒有從各個方向照射 - 嘗試把在我能想到的是,法線不進行平滑處理中AmbientLight