/// \param angles The orientation (unit) vector that you want to reflect /// \return Euler angles that are reflected about the slope of the plane. EulerAngles Plane::reflectOrientation(const EulerAngles& angles) const { EulerAngles out; Vector3 look, up, right; RotationMatrix rotMat; // get look and up vector from euler angles rotMat.setup(angles); look = rotMat.objectToInertial(Vector3(0.0f,0.0f,1.0f)); up = rotMat.objectToInertial(Vector3(0.0f,1.0f,0.0f)); // reflect the look and up vectors over the plane look = reflectOrientation(look); up = -reflectOrientation(up); // calculate right vector right = Vector3::crossProduct( up, look); right.normalize(); // create a rotation matrix from right, up, and look rotMat.m11 = right.x; rotMat.m12 = right.y; rotMat.m13 = right.z; rotMat.m21 = up.x; rotMat.m22 = up.y; rotMat.m23 = up.z; rotMat.m31 = look.x; rotMat.m32 = look.y; rotMat.m33 = look.z; // calculate new euler angles from the matrix out.fromRotationMatrix(rotMat); return out; }