I suggest using G4Transform3D, which is a typedef for CLHE::Tranforms3D.
source/externals/clhep/include/CLHEP/Geometry/Transform3D.h
CLHEP provides a consistent set of vectors, points, transforms, etc.
Thank you but I already use Transform3D to rotate in object’s frame of reference (see my snippet above), but the model is not in the object’s world center. So I still need to be able to translate first. Then apply the Transform3d.
Update: Allison’s advice was spot on.
Instead of relying on the G4Transform3D construct i.e. [(*RotMat, Translation)], I made my own composite transformation as shown below:
Translation #1, followed by rotation followed by another translation #2:
G4Transform3D t = G4Translate3D(shift_2) * G4Rotate3D(angle,axis) * G4Translate3D(shift_1)
new G4PVPlacement( t , ...... );