对于这样的逆时针顺序点列表:
var points = new[]
{
new Point3D(-2, -4, 8), //a
new Point3D(6, -1, 8), //b
new Point3D(6, 5, 8), //c
new Point3D(0, 8, 8), //d
new Point3D(1, 3, 8), //e
}.ToList();
我想在HelixViewPort3D视图中添加一个多边形:
var meshBuilder = new MeshBuilder(false, false, false);
meshBuilder.AddPolygon(points);
var geometryModel = new GeometryModel3D
{
Material = Materials.Red,
BackMaterial = Materials.Blue,
Geometry = meshBuilder.ToMesh()
};
var modelVisual = new ModelVisual3D { Content = geometryModel };
view.Children.Add(modelVisual);
int index = 0;
foreach (var point in points)
{
view.Children.Add(new BillboardTextVisual3D
{
DepthOffset = 1e-3,
Position = point,
Text = string.Format("[{0}] : {1}, {2}", index++, point.X, point.Y)
});
}
view.ZoomExtents();
使用BillboardTextVisual3D显示每个点的x和y坐标,我得到了:默认列表
这是不对的,不知何故,d:(0,8(被连接到a:(-2,-4(。背面材料(蓝色(显示在表面材料(红色(的顶部。
更改列表的顺序解决了问题:有序列表
var points = new[]
{
new Point3D(1, 3, 8), //e
new Point3D(-2, -4, 8), //a
new Point3D(6, -1, 8), //b
new Point3D(6, 5, 8), //c
new Point3D(0, 8, 8), //d
}.ToList();
第二个列表仍然是逆时针排序的,唯一的区别是起点(现在是e:(1,3((。有什么理由会影响结果吗?
附言:我认为这应该与点到原点的距离有关(0,0,0(,从离原点最近的点开始,以某种方式完成任务。是虫子还是我遗漏了什么?
p.S.#2这个问题似乎只发生在凹多边形的情况下,对凸多边形没有影响。
AddPolygon()
在位置计数大于4时使用三角形扇形,因此最后一个三角形为:
-2, -4, 8
0, 8, 8
1, 3, 8
它按顺时针方向转动,背面的材料就在相机的前面。这是预期的行为。