Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否有一种有效的方法来确定MeshGeometryModel3D的任何顶点在视口中是否可见?_C#_Wpf_Sharpdx_Helix 3d Toolkit - Fatal编程技术网

C# 是否有一种有效的方法来确定MeshGeometryModel3D的任何顶点在视口中是否可见?

C# 是否有一种有效的方法来确定MeshGeometryModel3D的任何顶点在视口中是否可见?,c#,wpf,sharpdx,helix-3d-toolkit,C#,Wpf,Sharpdx,Helix 3d Toolkit,我需要尽可能高效地检测视口3DX上给定2d选择形状内网格中的哪些三角形可见(忽略透明度)。网格由大量三角形组成,因此执行光线投射效率极低。有没有一种方法可以使用SharpDX或其HelixToolkit包装器实现这一点 我提出的方法确定网格中所有三角形与视口摄影机的平均距离,然后使用“画笔”方法将它们绘制到二维位图上。如果要绘制的三角形的所有给定角都已着色(或其质心),则认为三角形不可见 这在大多数情况下都能很好地工作,但是如果缩小网格并且网格分辨率特别高,那么像素之间不可避免地会有重叠(因为它

我需要尽可能高效地检测视口3DX上给定2d选择形状内网格中的哪些三角形可见(忽略透明度)。网格由大量三角形组成,因此执行光线投射效率极低。有没有一种方法可以使用SharpDX或其HelixToolkit包装器实现这一点

我提出的方法确定网格中所有三角形与视口摄影机的平均距离,然后使用“画笔”方法将它们绘制到二维位图上。如果要绘制的三角形的所有给定角都已着色(或其质心),则认为三角形不可见

这在大多数情况下都能很好地工作,但是如果缩小网格并且网格分辨率特别高,那么像素之间不可避免地会有重叠(因为它们被舍入为整数),因此一些三角形被认为是不可见的,而实际上它们不是。请参见下面的示例:


通过放大要绘制的位图的大小以及所有相应的三角形垂直位置,可以减少此问题,但这并不完美,因为此问题仍然可能发生,并且会对性能造成更大的影响。

一般做法是使用视图矩阵将所有顶点变换到屏幕空间,投影矩阵和视口矩阵。然后可以轻松搜索2D区域内的顶点。然后获取与内部顶点关联的所有三角形


当然,一旦更换相机,所有顶点都必须重新计算。

谢谢。我已经这样做了,每次操纵视图时,我都会计算每个顶点的2D位置。我的问题是根据三角形是否在另一个三角形后面来判断三角形是否可见。我这样做是通过在内存中的位图上绘制三角形,从最近到最远,然后检查每个后续三角形,看看如果三角形已经绘制到了哪里,它是否会被绘制到哪里。但这存在原始描述中所述的重叠像素问题。可能在2d投影后检查三角形缠绕方向?不幸的是,即使法线朝向远离视口,我仍然希望包括它。我的三角形前后可见,如果用户旋转视图使三角形朝向另一个方向,则仍然可以执行选择。