Jump to content
  • Advertisement
Sign in to follow this  
markww

matrix multiplication check

This topic is 3934 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hi, I'm looking at some code to do 4x4 matrix multiplication. Using the two matrices: 20.0 0.0 0.0 0.0 0.0 40.0 0.0 0.0 0.0 0.0 20.0 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 5.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 I keep getting: 20.0 0.0 0.0 5.0 0.0 40.0 0.0 0.0 0.0 0.0 20.0 0.0 0.0 0.0 0.0 1.0 but double checking myself again online 4x4 calculators I keep getting a value of 100 in the top right element [3][0]. Is that correct?: http://www.bluebit.gr/matrix-calculator/multiply.aspx http://www.jimmysie.com/maths/matrix.php#a=res&opname=multiply&r1=4&c1=4&r2=4&c2=4&a11=20&a12=0&a13=0&a14=0&a21=0&a22=40&a23=0&a24=0&a31=0&a32=0&a33=20&a34=0&a41=0&a42=0&a43=0&a44=1&b11=1&b12=0&b13=0&b14=5&b21=0&b22=1&b23=0&b24=0&b31=0&b32=0&b33=1&b34=0&b41=0&b42=0&b43=0&b44=1 etc..... Thanks

Share this post


Link to post
Share on other sites
Advertisement
You're both correct [smile] Your code is doing the bottom matrix times the top matrix, while those websites are doing the top matrix times the bottom matrix. Since matrix multiplication isn't commutative, the results are different. I'm sure if you switch the multiplication order around for one of them you'll get consistent results.

Share this post


Link to post
Share on other sites
Hmm ok I ask because in my case I want to apply a scale transform, then a translation transform.

My scale:
20 0 0 0
0 40 0 0
0 0 20 0
0 0 0 1

my translate:
1 0 0 5
0 1 0 0
0 0 1 0
0 0 0 1

and I am multiplying like:

scale * translate

so shouldn't we always get:

20 0 0 5
0 40 0 0
0 0 20 0
0 0 0 1

when multiplied in that specific order?

Thanks

Share this post


Link to post
Share on other sites
Well, no. The definition of matrix multiplication demands that your 'scale * translate' has a value of 100 in the corner. But I suspect the confusion truly lies with pre- versus post-multiplication. Can you tell us how you apply the transformation to the vector?

If you store row-vectors, "transformed_vector = untransformed_vector * transformation_matrix" - you are premultiplying, and so the overall transformation should be 'scale * translate'.

On the other hand column-vectors transform according to "transformed_vector = transformation_matrix * untranformed_vector" and so 'translate * scale' is the required transformation.

This is easy to understand if you write the transformation equation in full. By parenthesising according to the associativity law, you can see that transformations are applied in order of their proximity to the source vector in the equation. In each case:

result = source * trans_1 * trans_2 * ...
result = ... * trans_2 * trans_1 * source

Admiral

Share this post


Link to post
Share on other sites
Quote:
Original post by markww
My scale:
20 0  0  0
0 40 0 0
0 0 20 0
0 0 0 1
my translate:
1 0 0 5
0 1 0 0
0 0 1 0
0 0 0 1
and I am multiplying like:
    scale * translate
so shouldn't we always get:
20 0  0  5
0 40 0 0
0 0 20 0
0 0 0 1
when multiplied in that specific order?


No. When multiplying, you dot rows in the first matrix with columns in the second matrix. To get the value of the 1st row 4 column, you dot the 1st row of the first matrix with the 4th column of the second matrix:
    [20 0  0  0] dot [5 0 0 1] = 100

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!