Я написал простой маленький вспомогательный метод, который вычисляет расстояние от точки до плоскости.Тем не менее, похоже, что он возвращает бессмысленные результаты.Код для создания плоскости, который у меня есть, выглядит следующим образом:
Plane = new Plane(vertices.First().Position, vertices.Skip(1).First().Position, vertices.Skip(2).First().Position);
Довольно просто, я надеюсь, вы согласитесь.Он создает структуру плоскости XNA, используя три точки.
Теперь сразу после этого я делаю:
foreach (var v in vertices)
{
float d = Math.Abs(v.ComputeDistance(Plane));
if (d > Constants.TOLERANCE)
throw new ArgumentException("all points in a polygon must share a common plane");
}
Используя тот же набор вершин, который я использовал для построения плоскости, я получаю это исключениебросили!Математически это невозможно, поскольку эти три точки должны лежать на плоскости.
Мой метод ComputeDistance:
public static float ComputeDistance(this Vector3 point, Plane plane)
{
float dot = Vector3.Dot(plane.Normal, point);
float value = dot - plane.D;
return value;
}
Насколько я понимаю, это правильно.Так что я могу делать не так?Или я могу столкнуться с ошибкой в реализации XNA?
Некоторые примеры данных:
Points:
{X:0 Y:-0.5000001 Z:0.8660254}
{X:0.75 Y:-0.5000001 Z:-0.4330128}
{X:-0.75 Y:-0.5000001 Z:-0.4330126}
Plane created:
{Normal:{X:0 Y:0.9999999 Z:0} D:0.5} //I believe D should equal -0.5?
Distance from point 1 to plane:
1.0