2009-06-03 6 views
0

Windows.Media.Media3D 툴킷을 사용하여 DirectX 응용 프로그램을 WPF로 포팅합니다. 가능한 모든 데이터를 가져 왔지만 모델이 완료되지 않은 것을 제외하고는 모두 잘 작동합니다.MeshGeometry3D (WPF)에서 Vertices 스무딩

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

0

이 일면성에 문제가

여기에서 중요한 코드는? 기본적으로 WPF는면을 한면으로 렌더링한다고 생각합니다. 잘못된면에서 볼 수는 없습니다.

마찬가지로 조명 당신은 당신의 모델이 모든 방향에서 조명되지 않은 경우 홀수 효과를 얻을 수 있습니다 - 나는 법선이 다듬어지지 않습니다 것입니다 생각할 수있는 주변 광