The author used the following data structure for the convenience of representing a frame of reference (on Page 168 of the book)
Code :class GLFrame{ protected: float vLocation[3]; float vUp[3]; float vForward[3]; public: ... }
Then he provided a function that calculates a matrix which is unclear to me (on Page 168 of the book):
Code :void GetMatrix(M3DMatrix44f matrix, bool bRotationOnly = false) { // Calculate the right side (x) vector, drop it right into the matrix M3DVector3f vXAxis; m3dCrossProduct3(vXAxis, vUp, vForward); // Set matrix column does not fill in the fourth value... m3dSetMatrixColumn44(matrix, vXAxis, 0); matrix[3] = 0.0f; // Y Column m3dSetMatrixColumn44(matrix, vUp, 1); matrix[7] = 0.0f; // Z Column m3dSetMatrixColumn44(matrix, vForward, 2); matrix[11] = 0.0f; // Translation (already done) if(bRotationOnly == true) { matrix[12] = 0.0f; matrix[13] = 0.0f; matrix[14] = 0.0f; } else m3dSetMatrixColumn44(matrix, vOrigin, 3); matrix[15] = 1.0f; }
He used the matrix on Page 174 through
Here, spheres[i] is an object of the GLFrame class.Code :modelViewMatrix.MultMatrix(spheres[i]); //it equals to multiply the matrix got from spheres[i].GetMatrix()
I think the author actually wanted to multiply the object's model transform matrix, but he misused the GetMatrix() function.
Could anyone help me verify my assumption?
Sorry for my rough description.



