2016-01-28 2 views
-2

У меня есть 2 вектора 3D. (объекты с значениями поплавка X, Y и Z)Определить расстояние от вектора 3 вдоль другого вектора 3

На моей диаграмме ниже я хотел бы определить длину зеленой линии. Это расстояние вдоль вектора 1, которое Вектор 2 есть. Или, расстояние от начала до конца строки на вектор 1, который находится на 90' в Вектор 1 и проходит тщательный точку в конце вектора 2.

enter image description here

Я делаю это в Unity3D, поэтому у меня есть доступ к довольно многим вспомогательным методам, которые позволяют мне легко получить длину Vector3 и так далее.

+0

Просто ПОСМОТРЕТЬ ДОКУМЕНТАЦИЮ для Vector3. http://docs.unity3d.com/ScriptReference/Vector3.html Вы быстро увидите, что он включает в себя такие функции, как «Проект» (и подобные функции), один из которых именно то, что вы хотите. – Fattie

+0

Purely FTR обратите внимание, что абсолютно невозможно узнать, где ваша диаграмма указывает на 3D-пространство :) – Fattie

+0

Большое спасибо!Это так полезно, я думал, что знаком с Vector3, но, я думаю, я всегда пропустил это (нет необходимости быть грубым, хотя: /) Также ваш второй комментарий вполне правильный, но и это не имеет значения, ответ, который я ищу, должен работать для любой компоновки важно только, чтобы черная линия была перпендикулярна красной. –

ответ

1

Длина очевидно

norm(v2)*cos(angle(v1,v2)) 

и так как

cos(angle(v1,v2))=abs(dot(v1,v2))/norm(v1)/norm(v2) 

конечная формула

abs(dot(v1,v2))/norm(v1) 

Можно было бы также сказать, что

e1 = v1/norm(v1) 

единичный вектор в направлении v1, и что зеленый вектор

dot(e1,v2)*e1 

в результате одной и той же длины формулы.

+0

Hi LutzL. Это математически замечательно, но обратите внимание, что, поскольку это находится в игровом движке (Unity3D), решение мгновенно доступно. вопрос о типе 'Vector3' в Unity. OP нужно только проверить doco для 'Vector3' и сразу найти решение. – Fattie

+0

Итак, это будет '(Vector3.Project (v2, v1)). Величина'. Однако 'abs (Vector3.Dot (v1, v2))/v1.magnitude' имеет меньше операций, так как не существует промежуточного временного экземпляра' Vector3'. – LutzL

1

Это проекция Vector2 на направлении Vector1. Самый простой способ (я думаю) найти его - используя скалярный продукт

D = | V2 | * DotProduct (V2, V1)/(| V2 | * | V1 |) = DotProduct (V2, V1)/| V1 |

где | V1 | длина V1 вектор

Смежные вопросы