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.


Log in to reply