问题描述
对于像这样的逆时针排序的点列表:
var points = new[]
{
new Point3D(-2,-4,8),//a
new Point3D(6,-1,//b
new Point3D(6,5,//c
new Point3D(0,8,//d
new Point3D(1,3,//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坐标,并得到它们: default list
这是不对的,所以d:(0,8)正在连接到a:(-2,-4)。并且背面材质(蓝色)显示在面部材质(红色)的顶部。
更改列表顺序虽然可以解决以下问题:ordered list
var points = new[]
{
new Point3D(1,//e
new Point3D(-2,//a
new Point3D(6,//b
new Point3D(6,//c
new Point3D(0,//d
}.ToList();
第二个列表仍然是逆时针排序的,唯一的区别是起点(现在为e:(1,3))。有什么原因会影响结果?
P.S。我认为这应该与到原点的距离(0,0)有关,从最接近原点的点开始以某种方式完成这项工作。是一个错误还是我在这里缺少什么?
P.S.#2这个问题似乎仅在凹面多边形的情况下才会发生,而对凸面多边形没有影响。
解决方法
AddPolygon()
在位置数大于4时使用三角形风扇,因此最后一个三角形是:
-2,-4,8
0,8,8
1,3,8
它沿顺时针方向旋转,然后背面的材料在相机的前面。这是预期的行为。