MeshGeometry3D(WPF)中顶点的平滑

时间:2009-06-03 06:16:12

标签: wpf silverlight

我正在使用Windows.Media.Media3D工具包将DirectX应用程序移植到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 个答案:

答案 0 :(得分:2)

我唯一能想到的是法线没有平滑,但没有看到网格看起来像什么我无法肯定地说。

我的意思是顶点法线与面法线平行,使网格具有刻面外观。如果法线平滑,则整个形状看起来平滑。像这样:

平面着色:

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

平滑着色:

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

图片被链接取代以限制我的带宽使用

答案 1 :(得分:0)

侧面有问题吗?默认情况下,我认为WPF呈现出一个方面 - 你无法从'错误'那里看到它们。

与灯光类似,如果您的模型没有从各个方向照亮,您可以获得奇怪的效果 - 尝试加入AmbientLight