Jump to content

reconstruct matrix with absolute scale


agelosc

Recommended Posts

Hi,

I needed to scale down the objects of my RBD sim and the way to do this is well covered in an entagma turorial. In short, a geometry wrangle node connected in the pre-solve input of the solver, gets then modifies and then sets the transform matrix of the packed primitives using the primintrinsic functions. I need to control the scale with an animated value but to do so I need to set the absolute value of the scale. The way it is now the transformation is relative. For example if the input value is a constant 0.5, applying this scale to the input matrix modifies the modified matrix and is quickly solved to a scale of 0. What I want is to keep the scale constant at 0.5. 

I was under the impression that a 3x3 (as well as 4x4) matrix has its scale values diagonal at row 0 column 0, row 1 column 1 and row 2 column 2. If that was the case I could just set these values. However when the object is rotated by the solver it looks like the rotation is solved as a skew/scale combination. Modifiing the values above gives a different result from the expected.

Is there a way to extract the rotation from the matrix and then create a new matrix with my absolute scale and appy the rotation only to it? Or is there any other way I can achieve this?

I've attached an example scene.

 

absoluteScale.hipnc

Link to comment
Share on other sites

I`m not sure what do you exactly need, but may be this will help

 

matr_dec.png

 

By the way you can always create you own matrix by basis ( 3 ortogonal vectors ) and point position. You can use polyFrame node to create those vectors, then just put them one by one in 3x3 matrix to each row and use translate node (in Point VOP ) to add position in each frame, then you will get 4x4 matrix. If you will apply this matrix to static object (1st frame geo) it will start to move and finally you can manipulate each step to achive result that you need.

Edited by Sega
  • Like 1
Link to comment
Share on other sites

Extracting the rotation this way worked great. Thank you. Here's the vex code in case someone is looking to something similar, note that the intrinsic attribute is a 3x3 matrix with only the rotation and scale, just ignore the last row and column from the examples above.

matrix3 m = primintrinsic(0, "transform", @ptnum);

// extract scale
float s[];
for(int i=0; i<3; i++)
{
    vector r = set( getcomp(m, 0, i), getcomp(m, 1, i), getcomp(m, 2, i) );
    s[i] = length( r );
}

// extract rotation
for(int row=0; row<3; row++)
    for(int col=0; col<3; col++)
    {
        float val = getcomp(m, row, col);
        setcomp(m, val/s[col], row, col);
    }

float scale = 0.5;
matrix3 mm = ident();
scale(mm, set(scale, scale, scale));

mm*=m;
setprimintrinsic(0, "transform", @ptnum, mm, "set");

 

Edited by agelosc
  • Like 4
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...