I have 3 points A, B, C. I want to find a vector that passes through B and is perpendicular to the vector AC. How would I go about doing this in Unity?
2 Answers
2Hello,
Before I try and answer the question, note that a Vector cannot pass through a point. A Vector is merely a direction and magnitude, not a line. Because of this, I assume you are tryign to solve the shortest distance from a line to a point problem.
OK, time for some maths using Unity functions:
Lets say we have the line that passes through the two points A, C and we want to find the vector from that line to B which has the closest distance. By simple logic we can assume that that vector must be perpendicular to the vector AC:
first lets get the equation of the line for A, C:
P = A + γ(C - A)
where:
P is any point on the line and
γ is any number value
Next lets write the formula for perpendicular vectors as well:
(B - P) dot (C - A) = 0
Now that we have two formulas lets solve simultaneously:
(1) (B - P) · (C - A) = 0
(2) P = A + γ(C - A)
(2) in (1)
(B - (A + γ(C - A))) · (C - A) = 0
(B - A - γ(C - A)) · (C - A)
Vector dot product:
(B.x - A.x - γ(C.x - A.x))(C.x - A.x) + (B.y - A.y - γ(C.y - A.y))(C.y - A.y) + (B.z - A.z - γ(C.z - A.z))(C.z - A.z) = 0
yes I know it’s a lot, just deal with it, so lets make some more variables:
D = C - A
O = B - A
Now lets solve for γ
(O.x - γD.x)*D.x + (O.y - γD.y)*D.y + (O.z - γD.z)*D.z = 0 | expand
O.x*D.x - γ*D.x^2 + O.y*D.y - γ*D.y^2 + O.z*D.z - γ*D.z^2 = 0 | bring γ to one side
γ*D.x^2 + γ*D.y^2 + γ*D.z^2 = O.x*D.x + O.y*D.y + O.z*D.z | simplify
γ(D · D) = O · D | Solve for γ
γ = (O · D)/(D · D)
Now that we have γ we can get both the closest point on the line, as well as the vector you are looking for:
P = A + γD | since we already know γ
and the vector you are looking for is simply:
V = P - B
I know it looks complicated, but I just went through the whole proof ![]()
the end formula is:
V = A + (O · D)/(D · D)*D - B
where D = C - A and O = B - A
I’ll leave the implementation to you
Hope this helps,
Benproductions1
PS: This is not tested, if it doesn’t work (or it’s wrong), please tell me ![]()
No, I did not look this up. I simply know my maths
EDIT: Fixed algebra when solving simultaneously thanks to @aldonaletto
@Benproductions1 thanks a lot for this great deduction. Not only it is very well explained, but I couldn’t find anything similar on Internet.
However, after implementing and plotting the results, I believe there is still a little error in the calculation of vector V (second last equation), which causes V having the opposite direction (wrong sign).
You wrote:
V = P - B
but it should be:
V = B - P
Consequently, the following (and last) equation becomes:
V = B - A - (O · D)/(D · D)*D
Please let me know if this sounds correct to you and, in that case, I agree with @aldonaletto in saying that your original answer deserves to be fixed, as it might be helpful for many others.
Thanks again!
Nice formatting!
– JChiltonman you brought me back to my first college year... :/
– vexeThank you, I'll try this as soon as I get a chance. I'm just starting Calc 2 so I haven't gotten into vectors too much yet.
– wolfadex@vexe lol, this stuff does become useful XD
– Benproductions1Should be something like: var V = A + Vector3.Project(B-A,C-A) - B; @Benproductions1: It looks like your final formula has a - instead of a + ;)
– Bunny83