Transfer Scale from one Matrix to another
-
On 06/12/2013 at 02:03, xxxxxxxx wrote:
User Information:
Cinema 4D Version: R13-R14
Platform: Windows ;
Language(s) : XPRESSO ;---------
I am not sure how to do this.
For the position, is is easy:Matrix matrix_A; Matrix matrix_B; matrix_B.off = matrix_A.off;
What is the corresponding way for the scaling?
-
On 06/12/2013 at 04:39, xxxxxxxx wrote:
In order to get the scales (vector) out of a matrix, you need to get the length of each axis basis:
Vector scale = Vector(Len(matrix_A.v1), Len(matrix_A.v2), Len(matrix_A.v3); matrix_B.v1 = !matrix_B.v1 * scale.x; matrix_B.v2 = !matrix_B.v2 * scale.y; matrix_B.v3 = !matrix_B.v3 * scale.z;
This information is in the SDK documentation.
-
On 06/12/2013 at 05:11, xxxxxxxx wrote:
Ok, thanks, tat is indeed a lot, just to keep the scaling.
I often do some calculations on Quaternions, and the unwanted side effects is that scaling is influenced too, even if it is the rotation only, that I am interested in.Quaternion q_A; q_A.SetMatrix(inputMatrix); Quaternion q_B = QMul(q_A, 1.5); Matrix resultMatrix = q_B.GetMatrix();
I get the resulting rotation I am after, but I get the scale multiplied by 1.5 too.
So I have to write the code you submitted, OK. No simpler way.. -
On 06/12/2013 at 06:14, xxxxxxxx wrote:
You could simply get the normalized matrix. That is, it will only contain the rotations and turn any scaling into unity (1s).
Matrix resultMatrix = q_b.GetMatrix(); resultMatrix.Normalize();
-
On 06/12/2013 at 06:38, xxxxxxxx wrote:
I will have a look at Normalize(), maybe it will do what I want. But in case the original scale is _<__>_ 1, I will need to use the first code you provided.