Сглаживание вершин в MeshGeometry3D (WPF) - PullRequest
0 голосов
/ 03 июня 2009

Я портирую приложение DirectX в WPF, используя инструментарий Windows.Media.Media3D. Что работает хорошо и все, за исключением того, что Модель отображается полностью, даже когда она получила все возможные данные.

Я подозреваю, что это потому, что DirectX оптимизирует и каким-то образом сглаживает или помогает рендерить дополнительный контент в зависимости от вершин и признаков.

Так что мне интересно, есть ли возможность изменить способ отображения 3D-моделей в WPF? Трудно точно сказать, что я имею в виду, но я надеюсь, что это как-то понятно.

Вот важный код:

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 ]

2 голосов
/ 03 июня 2009

Единственное, о чем я могу думать, это то, что нормали не сглаживаются, но, не видя, как выглядит сетка, я не могу сказать точно.

Под этим я подразумеваю, что нормали вершин параллельны нормалам граней, что придает сетке граненый вид. Если нормали сглажены, то вся форма выглядит сглаженной. Примерно так:

Плоское затенение:

http://www.forman.free -online.co.uk / изображения / flatshading.png

Плавное затенение:

http://www.forman.free -online.co.uk / изображения / smoothshading.png

изображения заменены ссылками для ограничения использования моей полосы пропускания

0 голосов
/ 03 июня 2009

Есть ли проблема с односторонностью? По умолчанию я думаю, что WPF отображает фасеты односторонне - вы не можете видеть их с «неправильной» стороны.

Аналогично с освещением вы можете получить странные эффекты, если ваша модель не освещена со всех сторон - попробуйте включить AmbientLight

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...