c# Wpf 3D组合模型导致光照问题

本文关键字:问题 模型 Wpf 3D 组合 | 更新日期: 2023-09-27 18:02:58

我正在制作一个简单的3D模型查看器,我需要能够支持非常大的模型(100,000 +三角形),并且在旋转相机时具有平滑的运动。

为了优化绘图,而不是在polymesh中创建每个部分的GeometryModel3D,我想使用顶点和三角形索引的完整列表。加速是惊人的,但现在灯光是混乱的。每个三角形现在都有自己的阴影。

我认为这个问题与法线有关,如果我手动设置所有法线为Vector3(0,0,1),那么我得到均匀照明。但当我试着看模型的一面或反面时,它是黑暗的。我还尝试用一个公式来计算每个三角形的法线,但结果是一样的:一个大的模型会搞砸,单独的模型看起来会很好。所以也许这不是一个正常的问题?

我很好奇为什么当模型分开时,一切都正常工作,而组合模型会导致问题。

图片显示问题

polyMesh对象包含一堆面,其中包含它使用的顶点索引。不是三角形就是四边形。polyMesh有所有顶点信息。

        var models = new Model3DCollection();
        var brush = new SolidColorBrush(GetColorFromEntity(polyMesh));
        var material = new DiffuseMaterial(brush);
        foreach (var face in polyMesh.FaceRecord)
        {
            var indexes = new Int32Collection();
            if (face.VertexIndexes.Count == 4)
            {
                indexes.Add(face.VertexIndexes[0]);
                indexes.Add(face.VertexIndexes[1]);
                indexes.Add(face.VertexIndexes[2]);
                indexes.Add(face.VertexIndexes[2]);
                indexes.Add(face.VertexIndexes[3]);
                indexes.Add(face.VertexIndexes[0]);
            }
            else
            {
                indexes.Add(face.VertexIndexes[0]);
                indexes.Add(face.VertexIndexes[1]);
                indexes.Add(face.VertexIndexes[2]);
            }
            MeshGeometry3D mesh = new MeshGeometry3D()
            {
                Positions = GetPoints(polyMesh.Vertices),
                TriangleIndices = indexes,
            };
            GeometryModel3D model = new GeometryModel3D()
            {
                Geometry = mesh,
                Material = material,
            };
            models.Add(model);
        }
        return models;

如果我把网格和几何从循环中取出来,创建一个大的网格,事情就会出错。

        var models = new Model3DCollection();
        var brush = new SolidColorBrush(GetColorFromEntity(polyMesh));
        var material = new DiffuseMaterial(brush);
        var indexes = new Int32Collection();
        foreach (var face in polyMesh.FaceRecord)
        {
           //Add indices as above (code trimmed to save space.)
           indexes.Add(face.VertexIndexes[0]);               
        }
        MeshGeometry3D mesh = new MeshGeometry3D()
        {
            Positions = GetPoints(polyMesh.Vertices),
            TriangleIndices = indexes,
        };
        GeometryModel3D model = new GeometryModel3D()
        {
            Geometry = mesh,
            Material = material,
        };
        models.Add(model);
        return models;

其他重要细节:该模型不仅仅是一个平面,它是一个复杂的道路模型。我无法展示整个模型,也无法提供如何导入模型的代码。我正在使用HelixToolKit进行相机控制和诊断。

窗口代码:

<h:HelixViewport3D ZoomExtentsWhenLoaded="True" IsPanEnabled="True" x:Name="ViewPort" IsHeadLightEnabled="True">
        <h:HelixViewport3D.DefaultCamera>
            <!--フリッカー回避方法 This code fixes a flicker bug! Found at http://stackoverflow.com/a/38243386 -->
            <PerspectiveCamera NearPlaneDistance="25"/>
        </h:HelixViewport3D.DefaultCamera>
        <h:DefaultLights/>
    </h:HelixViewport3D>

设置背景材料不会改变任何东西。我希望我只是一个白痴,错过了一些明显的东西,因为我是3D新手。

c# Wpf 3D组合模型导致光照问题

终于自己修复了。

归结为对Wpf3D(或一般的3D ?)的了解不够。

如果一个顶点在组合模型中被重用,则应用平滑阴影。平滑阴影在平面上看起来如此糟糕的原因是它将阴影应用于完整的3D模型。我拥有的每个多边形都是一个3D形状。墙上的每一部分都是一个不同的多边形,有6个面。(前,上,下,左,右,后).

当每个顶点位置都是唯一时,即使组合模型,问题也会消失。当分开时,因为每个模型都有一个位置的副本,它们是唯一的。从

找到答案http://xoax.net/blog/automatic-3d-normal-vector-calculation-in-c-wpf-applications/