3D тригонометрия: нахождение точки в пространстве вдоль поверхности сферы - PullRequest
3 голосов
/ 07 декабря 2011

У меня есть две точки в трехмерном пространстве, скажем, (0, 0, 0) и (5, 5, 0)

, и у меня есть камера с (0,0,5)

Учитывая это, первая точка (0,0,0) ближе к камере, чем вторая.Я хотел бы, чтобы вторая точка была ограничена по расстоянию от точки камеры, чтобы она (или любая гипотетическая точка) не могла быть дальше от точки камеры, чем расстояние от моей контрольной точки (0,0,0).

Какой математический аппарат я могу использовать для вычисления точки в пространстве, которая является тем же вектором от камеры, но не так далеко?

Надеюсь, это имеет смысл.... и я бы хотел, чтобы у меня были математические курсы выше, чем базовая алгебра.

Ответы [ 4 ]

5 голосов
/ 07 декабря 2011

Если я правильно понимаю.У вас есть точка P1 (x1, y1, z1) и расстояние D и другая точка P2 (x2, y2, z2), и вам нужна еще одна точка P3, так что она находится в том же направлении, что и P2, нотолько расстояние D от P1.если это так.

Направление V1 от P1 к P2 равно (P2 - P1), т. е. (x2 - x1, y2 - y1, z2 - z1)

Единичный вектор от V1 будет U1

U1 = V1 / distance between ( P1 , P2)

Формула для расстояния между двумя точками

И, наконец, P3 будет на расстоянии D вдоль этого единичного вектора

P3 = P1 +  U1 * D
1 голос
/ 07 декабря 2011

Это то, что вы хотите? Переменные заглавной буквы - трехмерные векторы, а строчные буквы - скаляры.

  1. Начальная точка P1 = { 0, 0, 0 }
  2. Camera Point C = { 0, 0, 5 }
  3. Расстояние r = DIST(C, P1)
  4. Вторая точка P2 = { 5, 5, 0 }
  5. Вектор направления E=UNIT(P2-C)
  6. Вторая точка P2 = C + r*E

Используйте эти операторы

DOT(P,Q) = P[0]*Q[0]+P[1]*Q[1]+P[2]*Q[2];
UNIT(P) = P/sqrt(DOT(P,P);
DIST(P,Q) = sqrt(DOT(P-Q,P-Q));
t*P =  { t*P[0], t*P[1], t*P[2] };
P/d =  { P[0]/d, P[1]/d, P[2]/d };
1 голос
/ 07 декабря 2011

Вы можете использовать дополнительный параметр, чтобы изменить длину вектора.Если исходная точка - (5, 5, 0), тогда вы можете использовать (5t, 5t, 0t) и найти значение t, в результате чего вектор будет иметь правильную длину.Измененный вектор будет в том же направлении, что и исходный, только короче.

Для расчета длины вектора используйте length = sqrt(x^2, y^2, z^2).

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

Сначала возьмем вектор с камеры (0,0,5), назовем его C, до точки (5, 5, 0), назовем его P:

V = P - C

Затем адаптируйте длину этого вектора к целевой длине (в данном случае 5), назовем его L:

V' = V * (L / |V|)

И затем просто добавим это снова к C, чтобы получитьконечная точка P':

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