I originally stored an objects origin and orientation in 3D space using 3 vectors representing the objects origin, forward and up directions.
To apply to correct transformation to the modelview matrix stack I compose the affine transformation matrix using these three vectors.
Translation is trivial, however for rotation is applied by constructing the correct rotation matrix (depending on the angle and axis of rotation) and applying it to these 3 vectors.
I’m using this method for a very large number of objects and the rotation/ affine matrix composing is causing a performance bottleneck.
I’m wondering if there is a more sensible/efficient way to store the orientation?
Or in other words: You’re storing a 3×3 matrix. The matrices OpenGL use are just the same, though they’re 4×4, but the only difference to your is, that the element 4,4 is always 1, the elements 0…3,4 are all 0, and the first column 0,0…3 is the cross product of forward and up, usually called right.
This is actually the most concise and directly accessible way to represent an objects placement in 3D space. You can apply any kind of transformation, by performing a single matrix multiplication then.
Another method is using a quaternion together with an offset vector. But quaternions must be turned into a matrix if you want your objects to be translatable (or you could chain up a lot of translation/rotation pairings for a transformation hierachy, but using a matrix actually causes less overhead).