The main function included in this package is called FRAME.
FRAME builds an orientation matrix R representing the orientation of a right handed 3-D Cartesian reference frame, based on the position of at least 3 and at most 6 non-collinear points.
FRAME features an ARRAYLAB engine (see Matlab Central > File Exchange > Multiplying two N-D arrays of matrices, vectors or scalars"). This means that FRAME accepts as input block arrays of vectors. In this case, it returns a block array of orientation matrices (see below).
Several different reference frame orientations can be defined by the same set of points. For instance, the same three points can be used to define 72 different orientations for a right-handed 3-D Cartesian reference frame! Three non-collinear points define a triangle and a plane, which in turn define seven lines (six are parallel to the three sides and the three heights of the triangle, and the seventh is normal to the plane; fig. 1). Since for each line there are two opposite directions, any of the Cartesian axes can be assigned 14 different directions. And any of these 14 directions is normal to 4 or 12 of the other directions, all of which can be used to define the other axes.
FRAME is a versatile algorithm. It can be used to determine any of the above mentioned orientations. Its input arguments include three directed distances (d1, d2, and d3), obtained from the known point positions with vector subtractions. For instance, if pA and pB are the positions of two points A and B, pB-pA (or -pA+pB) is the directed distance from point A to point B.
Since d1 may coincide with d3, three points are enough to define the three distances. For instance, three position vectors (pA, pB, pC) might be used as follows:
R = FRAME(-pA+pB, -pB+pC, 'y', -pA+pB, 'z', DIM)
and six position vectors (pA, pB, pC, pD, pE, pF) might be used as follows:
R = FRAME(-pA+pB, -pC+pD, 'y', -pE+pF, 'z', DIM)
where DIM is the dimension along which the vectors are contained.
The direction of the first axis ('y' in the above examples) is defined by the vector product d1 × d2. The direction of the second axis ('z' in the above example) is defined by the rejection of d3 from the first axis, coinciding with the projection of d3 on the plane defined by d1 and d2. The third axis forms with the others a right handed orthogonal reference frame. A more detailed explanation of the function syntax and the rules used to build the output array R can be found on the FRAME help text.
If pA, pB, etc. are 3-by-1 matrices, DIM = 1 and R is a single 3-by-3 orientation matrix.
The arrays pA, pB, etc. can have any size, provided they contain 3-element position vectors along one of their dimensions (DIM). For instance, if they are Nf-by-3 matrices, containing Nf positions of a moving point, sampled with a stereophotogrammetric motion capture system, R is a Nf-by-3-by-3 array, containing Nf orientation matrices. See FRAME help for details about the format of the input and output arrays.
Any matrix or array of orientation matrices R obtained with FRAME can be used to perform transformations. Multiple vector transformations can be obtained by multiplying an array of orientation matrices by an array of vectors. This "multi-product" can be performed easily, in a single step and with no loops, by calling function MULTIPROD.
MULTIPROD is a powerful generalization for N-D arrays of the MATLAB function MTIMES and the matrix multiplication operator (*). Obviously, MULTIPROD has a broad field of potential applications. For instance, it can be used to perform vector algebra (see package "Matlab Central > File Exchange > Vector algebra for multidimensional arrays of vectors"). Thus, in my opinion it deserved a separate introduction and I published it in a separate package: "Matlab Central > File Exchange > Multiplying two N-D arrays of matrices, vectors or scalars".
A few sample functions are included in this package. They determine the orientation of anatomical reference frames for segments of the human body (thorax, scapula, upper arm, arm, forearm, hand, pelvis, thigh, shank, foot), according to the definitions given by Cappozzo et al. (1995; Clinical Biomechanics, 10, 171-178) and by van der Helm et al. (2005; Journal of Biomechanics, 38, 981-992).
The code (testFRAME) I used to test the function output is included as well.