Take the 2-minute tour ×
Game Development Stack Exchange is a question and answer site for professional and independent game developers. It's 100% free, no registration required.

I have the following three vectors:

  • posA: (1,2,3)
  • normal: (0,1,0)
  • offset: (2,3,1)

I want to get the vector representing the position which is offset in the direction of the normal from posA.

I know how to do this by cheating (not using matrix operations):

Vector3 result = new Vector3(posA.x + normal.x*offset.x
                             posA.y + normal.y*offset.y,
                             posA.z + normal.z*offset.z);

I know how to do this mathematically Note: [] indicates a column vector, {} indicates a row vector

result = [1,2,3] + {2,3,1}*{[0,0,0],[0,1,0],[0,0,0]}

What I don't know is which is better to use and if it's the latter how do I do this in unity? I only know of 4x4 matrices in unity. I don't like the first option because you are instantiating a new vector instead of just modifying the original. Suggestions?

Note: by asking which is better, I am asking for a quantifiable reason, not just a preference.

share|improve this question
    
I'd say that doing it only with a Vector3 in this case is better, as it will be faster than transforming it by a matrix. –  Nic Foster Apr 13 '12 at 18:08
add comment

1 Answer 1

up vote 3 down vote accepted

Hate answering my own questions, but here is what I did to solve this:

Unity has Vector3.scale. I assumed this was just scalar multiplication, but instead it's component-wise multiplication of vectors which is what I was doing with the matrices. The Vector3 class already has the + operator for component-wise addition, so this got really easy.

Vector3 result = posA + Vector3.Scale(normal,offset);

Haven't tested it, but it looks right

Though, I'm assuming the scale method is implemented using the exact code from my first example, at least it's cleaner now. I may write a method that uses references to modify the passed parameter so I'm not creating new instances just for this.

share|improve this answer
    
Don't hate your own answers. SE sites are good because others come later and say "hey, he solved my problem, +1" –  ashes999 Apr 13 '12 at 19:46
    
You can use Matrix4.TRS if you want to operate directly on the Matrix4. unity3d.com/support/documentation/ScriptReference/… –  Rubber Mallet Apr 13 '12 at 20:50
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.