Я написал простой метод вспомогательного помощника, который вычисляет расстояние от точки до плоскости. Однако, похоже, это приводит к бессмысленным результатам. Таким образом, код i для создания плоскости:Расстояние до плоскости
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");
}
Используя тот же набор вершин, которые я использовал, чтобы построить самолет, я получаю это исключение брошено! Математически это невозможно, так как эти три точки должны лежать на плоскости.
метод My 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
Какова ценность 'Constants.TOLERANCE'? – DGH
TOLERANCE = 1e-5f – Martin
Однако терпимость не является проблемой. Как видно из нового примера, данные, которые я только что редактировал на расстоянии, относительно обширны. – Martin