【问题标题】:Distance to a plane到飞机的距离
【发布时间】:2010-12-14 05:25:38
【问题描述】:

我写了一个简单的小助手方法,它计算点到平面的距离。但是,它似乎返回了荒谬的结果。因此,我用于创建飞机的代码是:

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

【问题讨论】:

  • Constants.TOLERANCE的值是多少?
  • 但是,容差不是问题。从我刚刚编辑的新示例数据中可以看出,距离比较大。

标签: c# debugging math geometry xna


【解决方案1】:

似乎您的Plane 已实现,因此D 不是您的一个点在平面法线上的投影,而是它的负值。您可以将其视为将一个向量从平面到原点投影到法线上。

无论如何,我相信改变

float value = dot - plane.D;

到

float value = dot + plane.D;

应该解决问题。 HTH。

【讨论】:

  • 天哪,一旦你说出来,那就太明显了!非常感谢。
【解决方案2】:

好的,我不完全确定我理解这里的数学,但我怀疑(基于来自 http://mathworld.wolfram.com/Point-PlaneDistance.html 等的公式)

float value = dot - plane.D;

应该是

float value = dot / plane.D;

编辑:好的,如下面的 cmets 所述,这不起作用。那么我最好的建议是查看链接或谷歌“点和平面之间的距离”并尝试以不同的方式实现公式。

【讨论】:

  • 我是从这个答案开始工作的,它用非常简单的术语表达出来:social.msdn.microsoft.com/Forums/en/xnaframework/thread/…
  • @Martin:好的,看起来您确实正确地遵循了该建议。但是,该公式与我看到的解释此计算的其他三个或四个站点中的任何一个都不匹配。你能试试我的想法,只是为了逗我开心?
  • 距离从 1.0 变为 1.03,变化不大,也没有改善 ;)
  • 不用担心,我也完全被难住了:/顺便说一句,你同意我发布的示例中的 D 是错误的吗?
  • 我不确定,尤其是因为我不知道应该如何计算 D。 3D 数学从来都不是我的强项。
猜你喜欢
  • 2020-06-23
  • 1970-01-01
  • 1970-01-01
  • 2018-11-28
  • 1970-01-01
  • 1970-01-01
  • 2017-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多