setting @orient with degrees

4004   4   2
Member
339 posts
Joined: 12月 2014
Offline
I'm wondering what the best way to go about using degrees to set @orient, here's what I have:

vector4 x_rot = quaternion({1,0,0}*ch('x_rot'));
vector4 y_rot = quaternion({0,1,0}*ch('y_rot'));
vector4 z_rot = quaternion({0,0,1}*ch('z_rot'));

@orient = qmultiply(@orient, x_rot);
@orient = qmultiply(@orient, y_rot);
@orient = qmultiply(@orient, z_rot);

Which works fine, but setting quaternion values with sliders isn't very intuitive
Member
12 posts
Joined: 5月 2017
Offline
The function you want is eulertoquaternion [www.sidefx.com]
With that you can do the following assuming you've got your rotations in degrees in a vector parameter:
```vector r = chv("rot");
```
Member
339 posts
Joined: 12月 2014
Offline
That's the ticket, thanks!
Member
339 posts
Joined: 12月 2014
Offline
In case this is useful for anyone else, these vex expressions allow me to rotate @orient by degrees, but also set a randomized min and max value for those rotations base on the point number. Min and max sliders should go from -1 to 1 and the rot slider 0-360

float randx = fit01(rand(@ptnum),ch('min_x'),ch('max_x'));
float randy = fit01(rand(@ptnum),ch('min_y'),ch('max_y'));
float randz = fit01(rand(@ptnum),ch('min_z'),ch('max_z'));

float rotx = ch('rot_x')*randx;
float roty = ch('rot_y')*randy;
float rotz = ch('rot_z')*randz;

vector r = set(rotx,roty,rotz);

Member
9 posts
Joined: 7月 2014
Offline
what I usually do is:

```matrix m = qconvert(p@orient);
vector zaxis = set(m.zx, m.zy, m.zz);
vector yaxis = set(m.yx, m.yy, m.yz);
vector xaxis = set(m.xx, m.xy, m.xz);
float amount = radians(degrees);
rotate(matrix, amount , xaxis //chose any axis );
p@orient = quaternion(m);
```

to create a new orient with euler angles just start with an identity matrix
Edited by Sergen Eren - 2019年3月13日 10:10:26