What is the easiest way to align the Z axis with a

2019-06-25 08:46发布

问题:

Given a point such as (0, 0, 0) and a vector like (x, y, z). What is the easiest way to align the negative Z-axis centered at (0, 0, 0) to point in the direction of this vector? Examples using OpenGL would be welcome, but not neccessary.

回答1:

There's lots of different ways to rotate a coordinate-frame to point in a given direction; they'll all leave the z-axis pointed in the direction you want, but with variations in how the x- and y-axes are oriented.

The following gets you the shortest rotation, which may or may not be what you want.

vec3 target_dir = normalise( vector );
float rot_angle = acos( dot_product(target_dir,z_axis) );
if( fabs(rot_angle) > a_very_small_number )
{
    vec3 rot_axis = normalise( cross_product(target_dir,z_axis) );
    glRotatef( rot_angle, rot_axis.x, rot_axis.y, rot_axis.z );
}


回答2:

You probably want to have a look at Diana Gruber's article



回答3:

To answer my own question, the best answer I've come up with is this:

Divide the vector up into "components". The x component is the displacement along the x axis. If we turn to trigonometry, we have that cos(alpha) = x / vector_magnitude. If we compute the RHS then we can derive alpha, which is the amount by which we'd have to rotate around the y axis.

Then the coordinate system can be aligned to the vector by a series of calls to glRotatef()



回答4:

There are lots of resources out there about rotating your coordinates (or rotating objects, which amounts to the same thing). I learnt a lot from this site, both about how to program in multiple dimensions and especially how to manipulate vectors



回答5:

The page here has a section "Transformations for moving a vector to the z-axis" that seems to be what you want, or perhaps the inverse of it.