Mel

Introduction
Occasionally it is necessary to apply a series of rotations to a coordinate
system so that one of its axes points in a specific direction.
This tutorial explains how the yaxis of a coordinate system can
be aligned to a direction specified by a
vector.

Coordinate AxesFig 1 shows a vector with coordinates [2,2,1]. The pale red trace lines show the vector projected onto the xy plane, the xz plane and the yz plane. The easiest way of figuring out how to rotate the coordinate system so that the yaxis points in the direction of the vector is to think about the problem in reverse! How can the vector be aligned to the current yaxis. The vector in question is shown below in black  coordinates [2, 2, 1].

RotationsStep 1Figure 2 shows the vector forms the hypotenuse a right angled triangle. Step 2Figure 3 shows the triangle can be aligned to the yz plane by applying a suitable rotation around the zaxis. 


Step 3Fig 3 shows that a rotation around the xaxis will align the vector to the yaxis of the coordinate system (fig 4). 


AnglesFigure 6 shows two angles that must be calculated in order to perform steps 2 and 3. To find the blue angle we must first calculate the length of the red trace line, xyLength, on the xy plane ie.
xyLength = sqrt(x * x + y * y); xyLength = sqrt(2 * 2 + 2 * 2); xyLength = 2.83; After which the angle shown in blue can be found, zAngle = acos(y / xyLength);
zAngle = acos(2.0 / 2.83);
zAngle = 0.785; /* acos returns angle in radians */
To find the dark gray angle the length of the vector must be found, vecLength = sqrt(x * x + y * y + z * z); vecLength = sqrt(2 * 2 + 2 * 2 + 1 * 1); vecLength = 3.0; As with the blue angle the angle in dark gray is found from the cosine. I am referring to this angle as the xAngle because, as shown in Fig 4, this angle will be used to define the rotation around the xaxis. xAngle = acos(xyLength / vecLength); xAngle = acos(2.83 / 3.0); xAngle = 0.338;
Expressed in degrees the zAngle is 45.0 and the xAngle is
19.4. Therefore, the rotations needed to orientate the yaxis in the
direction of the vector requires,
A mel procedure that implements this technique is given in listing 1. 
Listing 1

Checking the ScriptThe following script uses the aimY() procedure to point a cone along a vector. Fig 7 shows that the apex of the cone does extend along the vector  the coordinates of which are indicated by the gray box.
vector $v = <<2,2,1>>; float $a[] = aimY($v); // begin with an empty scene select all; delete; // insert a cone aligned to the yaxis cone r 0.2 hr 17 ax 0 1 0; // apply the rotations to the x // and z axes of the cone rotate r $a[0] 0 0; rotate r 0 0 $a[1]; // draw a box to indicate the coordinates of the vector polyCube w 2 h 2 d 1; move r 1 1 0.5; 
© 2002 Malcolm Kesson. All rights reserved.