internal virtual void Rotate(double angle, Vector3D direction) { Vector3D d = direction.Unit(); double x = d.X; double y = d.Y; double z = d.Z; TransformationMatrix m = new TransformationMatrix(); double c = Math.Cos(angle); double s = Math.Sin(angle); m[0,0] = (x*x) * (1-c)+c; m[1,0] = x*y * (1-c)-z*s; m[2,0] = x*z * (1-c)+y*s; m[0,1] = y*x * (1-c)+z*s; m[1,1] = (y*y) * (1-c)+c; m[2,1] = y*z * (1-c)-x*s; m[0,2] = x*z * (1-c)-y*s; m[1,2] = y*z * (1-c)+x*s; m[2,2] = (z*z) * (1-c)+c; UpdateLocation(m); m = m.Invert().Transpose(); foreach (Vector3D v in m_Mesh.Normals) { double x0 = m[0, 0] * v.X + m[0, 1] * v.Y + m[0, 2] * v.Z + m[0, 3]; double y0 = m[1, 0] * v.X + m[1, 1] * v.Y + m[1, 2] * v.Z + m[1, 3]; double z0 = m[2, 0] * v.X + m[2, 1] * v.Y + m[2, 2] * v.Z + m[2, 3]; v.X = x0; v.Y = y0; v.Z = z0; } }