meshbuilder AddPolygon() 方法出现奇怪行为的原因是什么?
What is the reason for the strange behavior of meshbuilder AddPolygon() method?
对于像这样的逆时针排序的点列表:
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 坐标,我得到这个:
default list
这是不对的,d:(0, 8) 以某种方式连接到 a:(-2, -4)。背面 material(蓝色)显示在面部 material(红色)上方。
更改列表的顺序虽然解决了问题:ordered list
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))。为什么这会影响结果?
P.S。我认为它应该与到原点 (0,0,0) 的点距离有关,从离原点最近的点开始以某种方式完成这项工作。是错误还是我遗漏了什么?
P.S.#2 这个问题好像只出现在凹多边形的情况下,对凸多边形没有影响。
AddPolygon()
当位置数大于 4 时使用三角形扇形,所以你的最后一个三角形是:
-2, -4, 8
0, 8, 8
1, 3, 8
顺时针旋转,后面material就在镜头前了。这是预期的行为。
对于像这样的逆时针排序的点列表:
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 坐标,我得到这个: default list
这是不对的,d:(0, 8) 以某种方式连接到 a:(-2, -4)。背面 material(蓝色)显示在面部 material(红色)上方。
更改列表的顺序虽然解决了问题:ordered list
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))。为什么这会影响结果?
P.S。我认为它应该与到原点 (0,0,0) 的点距离有关,从离原点最近的点开始以某种方式完成这项工作。是错误还是我遗漏了什么?
P.S.#2 这个问题好像只出现在凹多边形的情况下,对凸多边形没有影响。
AddPolygon()
当位置数大于 4 时使用三角形扇形,所以你的最后一个三角形是:
-2, -4, 8
0, 8, 8
1, 3, 8
顺时针旋转,后面material就在镜头前了。这是预期的行为。