thompson.alt Posted October 18, 2018 Share Posted October 18, 2018 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 Quote Link to comment Share on other sites More sharing options...
thompson.alt Posted October 19, 2018 Author Share Posted October 19, 2018 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. Quote Link to comment Share on other sites More sharing options...
anim Posted October 20, 2018 Share Posted October 20, 2018 not sure if you are taking this as a VEX exercise, but if not, you can use POP Look At to easily do this Quote Link to comment Share on other sites More sharing options...
thompson.alt Posted October 21, 2018 Author Share Posted October 21, 2018 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! Quote Link to comment Share on other sites More sharing options...
anim Posted October 21, 2018 Share Posted October 21, 2018 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 Quote Link to comment Share on other sites More sharing options...
Recommended Posts
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.