Beispiel #1
0
        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;
            }
        }