Расстояние от начала до плоскости (самое короткое) - PullRequest
1 голос
/ 17 декабря 2011

Итак, я читал кое-что на этой странице (http://gamedeveloperjourney.blogspot.com/2009/04/point-plane-collision-detection.html)

Автор упомянул

 d = - D3DXVec3Dot(&vP1, &vNormal);

, где vP1 - точка на плоскости, а vNormal - нормаль к плоскостиМне любопытно, как это дает вам расстояние от источника мира, так как результат всегда будет 0. Кроме того, просто для ясности (так как я все еще немного неясен с d-частью уравнения плоскости)., является ли d в уравнении плоскости расстоянием от прямой, проходящей через начало мира, до начала плоскости?

Ответы [ 3 ]

6 голосов
/ 17 декабря 2011

В общем случае расстояние между точкой p и плоскостью можно вычислить как

<p - p0, normal>

где <a, b> - операция с точечным произведением

<a, b> = ax*bx + ay*by + az*bz

и где p0 - точка на плоскости.

plane-point distance

Когда n имеет единичную длину, скалярное произведение между вектором и длиной (со знаком) проекции вектора на нормаль

Формула, о которой вы сообщаете, является особым случаем, когда точка p является источником. В этом случае

distance = <origin - p0, normal> = - <p0, normal>

Это равенство формально неверно, потому что скалярное произведение относится к векторам, а не к точкам ... но все еще выполняется численно. Записав явную формулу, вы получите

(0 - p0.x)*n.x + (0 - p0.y)*n.y + (0 - p0.z)*n.z

совпадает с

- (p0.x*n.x + p0.y*n.y + p0.z*n.z)

Действительно, хороший способ сохранить плоскость - это сохранить нормальное n и значение k = <p0, n>, где p0 - любая точка на плоскости (значение k не зависит от того, какую точку вы выберете самолета).

2 голосов
/ 19 декабря 2011

Результат не всегда равен нулю. Результат будет только нулевым, если плоскость пройдет начало координат. (Здесь давайте предположим, что самолет не проходит через начало координат.)

По сути, вам дается линия от начала координат до некоторой точки на плоскости. (Т.е. у вас есть вектор от начала координат до vP1). Проблема с этим вектором состоит в том, что, скорее всего, он наклонен и направляется в какое-то далекое место на плоскости, а не к ближайшей точке на плоскости. Итак, если вы просто взяли длину vP1, вы получите слишком большое расстояние.

Что вам нужно сделать, это получить проекцию vP1 на некоторый вектор, который, как вы знаете, перпендикулярен плоскости. Это, конечно, нормально. Итак, возьмите скалярное произведение vP1 и vNormal и разделите на длину vNormal, и вы получите ответ. (Если они достаточно любезны, чтобы дать вам нормальный, который уже является величиной один, тогда не нужно делить.)

1 голос
/ 17 декабря 2011

Вы можете решить это с помощью множителей Лагранжа:

Вы знаете, что ближайшая точка на плоскости должна иметь вид:

c = p + v

Где c - ближайшая точкаи v - вектор вдоль плоскости (который, таким образом, ортогональн к n, нормали).Вы пытаетесь найти c с наименьшей нормой (или нормой в квадрате).Таким образом, вы пытаетесь свести к минимуму dot(c,c), при этом v будет ортогональным к n (таким образом dot(v,n) = 0).

Таким образом, установите Lagrangian:

L = dot(c,c) + lambda * ( dot(v,n) )
L = dot(p+v,p+v) + lambda * ( dot(v,n) )
L = dot(p,p) + 2*dot(p,v) + dot(v,v) * lambda * ( dot(v,n) )

И возьмите производную по v (и установите в 0), чтобы получить:

2 * p + 2 * v + lambda * n = 0

Youможно вычислить лямбду в приведенном выше уравнении путем точечного произведения обеих сторон на n, чтобы получить

2 * dot(p,n) + 2 * dot(v,n) + lambda * dot(n,n) = 0
2 * dot(p,n) + lambda = 0
lambda = - 2 * dot(p,n)

Обратите внимание, что dot(n,n) = 1 и dot(v,n) = 0 (поскольку v находится в плоскости, а n ортогонально к нему).Затем замените lambda обратно, чтобы получить:

2 * p + 2 * v - 2 * dot(p,n) * n = 0

и решите для v, чтобы получить:

v = dot(p,n) * n - p

Затем вставьте это обратно в c = p + v, чтобы получить:

c = dot(p,n) * n

Длина этого вектора равна |dot(p,n)|, и знак указывает, находится ли точка в направлении вектора нормали от начала координат или в обратном направлении от начала координат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...