/* * Rotate this transform around the vector specified by [x], [y], [z]. * If [local] is true, perform in local space, otherwise perform in world space. If * world space is used, it takes into account the aggregated transform of the scene * object's ancestors. */ void SceneObjectTransform::Rotate(Real x, Real y, Real z, Real a, Bool local) { if (!local) { Matrix4x4 rotMat; rotMat.PreRotate(x, y, z, a); Transform worldTrans; worldTrans.SetTo(rotMat); Transform localTrans; GetLocalTransformationFromWorldTransformation(worldTrans, localTrans); this->TransformBy(localTrans); } else { Transform::Rotate(x, y, z, a, true); } }
/* * Rotate around a specific point and orientation vector. * * The point is specified by [px], [py], and [pz]. * * The orientation vector is specified by [ax], [ay], and [az]. * * The parameter [local] determines whether local or world space is used. * If world space is used, it takes into account the aggregated transform * of the scene object's ancestors. */ void SceneObjectTransform::RotateAround(Real px, Real py, Real pz, Real ax, Real ay, Real az, Real angle, Bool local) { if (!local) { Matrix4x4 worldTransMat; worldTransMat.PreTranslate(-px, -py, -pz); worldTransMat.PreRotate(ax, ay, az, angle); worldTransMat.PreTranslate(px, py, pz); Transform worldTrans; worldTrans.SetTo(worldTransMat); Transform localTrans; GetLocalTransformationFromWorldTransformation(worldTrans, localTrans); this->TransformBy(localTrans); } else { Transform::RotateAround(px, py, pz, ax, ay, az, angle, true); } }