ang_for_axis(ANGLE* vAng, VECTOR* vAxis, var angle)

LC Converts a rotation about an arbitary axis to an Euler angle. Can be used to rotate entities about arbitrary axes.

Parameters:

vAng Pointer to an Euler angle vector.
vAxis Pointer to a direction vector that serves as rotation axis.
angle Rotation about vAxis in 0..360 degrees counterclockwise.

Speed:

Medium

Example (lite-C):

// calculate rotation for aligning an axis to a normal vector
function ang_align(ANGLE* ang, VECTOR* to, VECTOR* axis) 
{
vec_normalize(axis,1);
vec_normalize(to,1); // calculate a rotation axis perpendicular to both vectors
VECTOR rot;
vec_cross(rot,axis,to);
// rotate by the angle difference between both vectors
ang_for_axis(ang,rot,acosv(vec_dot(to,axis)));
}
... // align an entity to the floor normal c_trace(my.x,vector(my.x,my.y,my.z-1000),IGNORE_ME); // set floor normal hit.nx ang_align(my.pan,hit.nx,vector(0,0,1)); // align vertical axis to the floor normal ang_rotate(my.pan,vector(angle,0,0)); // rotate the entities' pan angle ...

See also:

pan, tilt, roll, vec_to_angle, vec_rotate, ang_rotate, ang_diff, ang_for_matrix

► latest version online