Jump to content
thompson.alt

How to Calculate @w to Aim RBD Object

Recommended Posts

As I'm just starting to understand quaternions and orientation in Houdini, I'm not sure how complicated this is to achieve. I could be completely over thinking it.

Ultimately I would like to create a force in dops to rotate the packed object to its current direction of motion, or it's velocity. Modifying @w seems to be the best way to do that.

For a first step, I'm trying to make a setup that takes a rbd packed object and rotate it back to it's original orientation. While it technically does that, it doesn't do it logically. It flips around its axis in bizarre ways. As I understand, it's behaving erratically because it's trying to rotate around all of its axes at the same time.

This is the code I'm using in a pop wrangle node:

vector  qToE(vector4 q_value){
    float   q_0 = q_value.w ; 
    float   q_1 = q_value.x ; 
    float   q_2 = q_value.y ; 
    float   q_3 = q_value.z ; 
    vector  out = {0,0,0} ; 
            out.x = atan2(2*(q_0*q_1+q_2*q_3), (1-2*(q_1*q_1+q_2*q_2))) ; 
            out.y = asin(2*(q_0*q_2-q_3*q_1)) ;
            out.z = atan2(2*(q_0*q_3+q_1*q_2), (1-2*(q_2*q_2+q_3*q_3))) ;
    return out ; 
}


v@euler = qToE(@orient);
@w = -v@euler*1*{1,1,1};

This is where I got the quaternion to euler function:

I've attached my houdini file to this post. If anyone has any tips, I'd be very happy to hear them!

 

Thanks!

orient_rotate_v01.hip

Share this post


Link to post
Share on other sites

I've made some progress since yesterday. Here is the code I'm using now:

vector4 first_orient = @orient;
vector4 second_orient = {0,0,0,1};

matrix3 transform = lookat(@v, 0, {0,1,0});
//second_orient = quaternion(transform);

// Get the difference between the two quaternions
// https://stackoverflow.com/questions/1755631/difference-between-two-quaternions
vector4 transition = qmultiply(second_orient, qinvert(first_orient));

// Convert to Angle-Axis
// http://www.tokeru.com/cgwiki/index.php?title=JoyOfVex17#Convert_back_to_matrix
vector angle_axis = qconvert(transition);

//@orient = transition;
//@N = angle_axis;

@w = angle_axis*chf("strength");

For now they're trying to orient themselves with their velocity. This is working quite a bit better, but I think there's still some funny flipping going on.

Share this post


Link to post
Share on other sites

not sure if you are taking this as a VEX exercise, but if not, you can use POP Look At to easily do this

 

Share this post


Link to post
Share on other sites
18 hours ago, anim said:

not sure if you are taking this as a VEX exercise, but if not, you can use POP Look At to easily do this

 

Thanks Tomas! I had actually tried that earlier, but it wasn't working for packed rbd objects. It seems the problem was that they don't respond to @torque like particles do.

The solution I found was to convert @torque to @w after the fact. Does anyone know if there is a rotational force like @torque that work on rbd objects?

Now I can dig into how POP Look At and see how the math works too.

 

Thanks again!

Share this post


Link to post
Share on other sites

packed rbds indeed work with v@torque, try upping the Torque Scale multiplier if you are not seeing any results

also make sure sleeping is off if this is the only force acting on them 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×