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新手。
终于自己修复了。
归结为对Wpf3D(或一般的3D ?)的了解不够。
如果一个顶点在组合模型中被重用,则应用平滑阴影。平滑阴影在平面上看起来如此糟糕的原因是它将阴影应用于完整的3D模型。我拥有的每个多边形都是一个3D形状。墙上的每一部分都是一个不同的多边形,有6个面。(前,上,下,左,右,后).
当每个顶点位置都是唯一时,即使组合模型,问题也会消失。当分开时,因为每个模型都有一个位置的副本,它们是唯一的。从
找到答案http://xoax.net/blog/automatic-3d-normal-vector-calculation-in-c-wpf-applications/