//----------------------------------------------------------------------------------------------------------------

        //protected override void renderSceneAll(GameTime gameTime)
        //{
        //    IndexedVector3 halfExtents = new IndexedVector3(wheelWidth, wheelRadius, wheelRadius);
        //    CylinderShapeX wheelShape = new CylinderShapeX(ref halfExtents);
        //    IndexedVector3 wheelColor = new IndexedVector3(1, 0, 0);


        //    IndexedVector3 worldBoundsMin = IndexedVector3.Zero, worldBoundsMax = IndexedVector3.Zero;
        //    getDynamicsWorld().getBroadphase().getBroadphaseAabb(ref worldBoundsMin, ref worldBoundsMax);

        //    for (int i = 0; i < m_vehicle.getNumWheels(); i++)
        //    {
        //        //synchronize the wheels with the (interpolated) chassis worldtransform
        //        m_vehicle.updateWheelTransform(i, true);
        //        //draw wheels (cylinders)
        //        IndexedMatrix m = m_vehicle.getWheelInfo(i).m_worldTransform;
        //        m_shapeDrawer.drawXNA(ref m, m_wheelShape, ref wheelColor, getDebugMode(), ref worldBoundsMin, ref worldBoundsMax, ref m_lookAt, ref m_perspective);
        //    }
        //    base.renderSceneAll(gameTime);
        //}

        //----------------------------------------------------------------------------------------------------------------

        public override void UpdateCamera()
        {
            if (m_useDefaultCamera)
            {
                base.UpdateCamera();
                return;
            }

            IndexedMatrix chassisWorldTrans;

            //look at the vehicle
            m_carChassis.GetMotionState().GetWorldTransform(out chassisWorldTrans);
            m_cameraTargetPosition = chassisWorldTrans._origin;

            m_cameraPosition.Y = (15.0f * m_cameraPosition.Y + m_cameraTargetPosition.Y + m_cameraHeight) / 16.0f;

            IndexedVector3 camToObject = m_cameraTargetPosition - m_cameraPosition;

            //keep distance between min and max distance
            float cameraDistance   = camToObject.Length();
            float correctionFactor = 0.0f;

            if (cameraDistance < m_minCameraDistance)
            {
                correctionFactor = 0.15f * (m_minCameraDistance - cameraDistance) / cameraDistance;
            }
            if (cameraDistance > m_maxCameraDistance)
            {
                correctionFactor = 0.15f * (m_maxCameraDistance - cameraDistance) / cameraDistance;
            }
            m_cameraPosition -= correctionFactor * camToObject;


            m_lookAt = IndexedMatrix.CreateLookAt(m_cameraPosition, m_cameraTargetPosition, m_cameraUp);
        }
Esempio n. 2
0
        public static void runTests()
        {
            String       filename     = @"e:\users\man\bullet\xna-math-debug-output.txt";
            FileStream   filestream   = File.Open(filename, FileMode.Create, FileAccess.Write, FileShare.None);
            StreamWriter streamWriter = new StreamWriter(filestream);

            streamWriter.WriteLine("Identity");
            IndexedMatrix m = IndexedMatrix.Identity;

            MathUtil.PrintMatrix(streamWriter, m);
            streamWriter.WriteLine("setEuler 2,0,0");
            m._basis.SetEulerZYX(2, 0, 0);
            MathUtil.PrintMatrix(streamWriter, m);
            streamWriter.WriteLine("setEuler 0,2,0");
            m = IndexedMatrix.Identity;
            m._basis.SetEulerZYX(0, 2, 0);
            MathUtil.PrintMatrix(streamWriter, m);
            streamWriter.WriteLine("setEuler 0,0,2");
            m = IndexedMatrix.Identity;
            m._basis.SetEulerZYX(0, 0, 2);
            MathUtil.PrintMatrix(streamWriter, m);
            streamWriter.WriteLine("setEuler 2,2,0");
            m = IndexedMatrix.Identity;
            m._basis.SetEulerZYX(2, 2, 0);
            MathUtil.PrintMatrix(streamWriter, m);
            streamWriter.WriteLine("setEuler 2,0,2");
            m = IndexedMatrix.Identity;
            m._basis.SetEulerZYX(2, 0, 2);
            MathUtil.PrintMatrix(streamWriter, m);
            streamWriter.WriteLine("setEuler 2,2,2");
            m = IndexedMatrix.Identity;
            m._basis.SetEulerZYX(2, 2, 2);
            MathUtil.PrintMatrix(streamWriter, m);

            streamWriter.WriteLine("setEuler 0.5*PI,0,0 Trans 100,100,100 MULTIPLIED BY setEuler 0,0,0.5*PI Trans -10,10,0");
            m = IndexedMatrix.Identity;
            m._basis.SetEulerZYX(MathUtil.SIMD_HALF_PI, 0, 0);
            m._origin = new IndexedVector3(100, 100, 100);

            IndexedMatrix m2 = IndexedMatrix.Identity;

            m2._basis.SetEulerZYX(0, 0, MathUtil.SIMD_HALF_PI);
            m2._origin = new IndexedVector3(-10, 10, 0);

            IndexedMatrix m3 = m * m2;

            MathUtil.PrintMatrix(streamWriter, m3);

            //streamWriter.WriteLine("Broken axis comparison");
            //m = IndexedMatrix.Identity;
            //m.Right = new IndexedVector3(1, 0, 0);
            //m.Up = new IndexedVector3(0, 1, 0);
            //m.Backward = new IndexedVector3(0, 0, 1);
            //m._origin = new IndexedVector3(0, 20, 0);

            //m2 = IndexedMatrix.Identity;
            //m2.Right = new IndexedVector3(0, -1, 0);
            //m2.Up = new IndexedVector3(1, 0, 0);
            //m2.Backward = new IndexedVector3(0, 0, 1);
            //m2._origin = new IndexedVector3(1, -1, -1);

            //m3 = m *  m2;
            //MathUtil.PrintMatrix(streamWriter, m3);


            //streamWriter.WriteLine("setEuler 0.5*PI,0,0 Trans 0,0,0 MULTIPLIED BY setEuler 0,0,0.5*PI Trans -10,10,0");
            //m = IndexedMatrix.Identity;
            //m._basis.SetEulerZYX(MathUtil.SIMD_HALF_PI, 0, 0);
            //m._origin = new IndexedVector3(0, 0, 0);

            //m2 = IndexedMatrix.Identity;
            //m2._basis.SetEulerZYX(0, 0, MathUtil.SIMD_HALF_PI);
            //m2._origin = new IndexedVector3(-10, 10, 0);

            //m3 = m * m2;
            //MathUtil.PrintMatrix(streamWriter, m3);

            //streamWriter.WriteLine("setEuler 0.25*PI,0,0 Trans 33,0,0 MULTIPLIED BY setEuler 0,0,0.5*PI Trans 0,0,0");
            //m = IndexedMatrix.Identity;
            //m._basis.SetEulerZYX(MathUtil.SIMD_QUARTER_PI, 0, 0);
            //m._origin = new IndexedVector3(33, 0, 0);

            //m2 = IndexedMatrix.Identity;
            //m2._basis.SetEulerZYX(0, 0, MathUtil.SIMD_HALF_PI);
            //m2._origin = new IndexedVector3(0, 0, 0);

            //m3 = m *m2;
            //MathUtil.PrintMatrix(streamWriter, m3);



            streamWriter.WriteLine("transposeTimes");
            m = IndexedMatrix.Identity;
            m._basis.SetEulerZYX(2, 1, 2);
            m._origin = new IndexedVector3(3, 3, 3);
            streamWriter.WriteLine("");
            //MathUtil.PrintMatrix(streamWriter, m);

            m2 = IndexedMatrix.Identity;
            m2._basis.SetEulerZYX(1, 2, -2);
            m2._origin = new IndexedVector3(5, 2, 13);
            //MathUtil.PrintMatrix(streamWriter, m2);

            IndexedBasisMatrix im3 = m._basis.TransposeTimes(m2._basis);

            MathUtil.PrintMatrix(streamWriter, im3);

            streamWriter.WriteLine("inverseTransform.");
            m = IndexedMatrix.Identity;
            m._basis.SetEulerZYX(1, -2, -1);
            m._origin = new IndexedVector3(-1, 2, -3);
            IndexedVector3 v      = new IndexedVector3(20, 25, 30);
            IndexedVector3 result = MathUtil.InverseTransform(ref m, ref v);

            MathUtil.PrintVector3(streamWriter, result);
            streamWriter.WriteLine("");

            streamWriter.WriteLine("inverseTimes.");
            m = IndexedMatrix.Identity;
            m._basis.SetEulerZYX(1, -2, -1);
            m._origin = new IndexedVector3(-1, 2, -3);

            m2 = IndexedMatrix.Identity;
            m2._basis.SetEulerZYX(0.3f, 0.8f, 2.3f);
            m2._origin = new IndexedVector3(20, 25, 30);
            m3         = m.InverseTimes(ref m2);
            MathUtil.PrintMatrix(streamWriter, m3);


            streamWriter.WriteLine("Transform.");
            m = IndexedMatrix.Identity;
            m._basis.SetEulerZYX(1, -2, -1);
            m._origin = new IndexedVector3(-1, 2, -3);
            v         = new IndexedVector3(20, 25, 30);
            result    = m * v;
            MathUtil.PrintVector3(streamWriter, result);
            streamWriter.WriteLine("");

            streamWriter.WriteLine("TransformNormal.");
            m = IndexedMatrix.Identity;
            m._basis.SetEulerZYX(1, -2, -1);
            m._origin = new IndexedVector3(-1, 2, -3);
            v         = new IndexedVector3(20, 25, 30);

            //IndexedMatrix tm = IndexedMatrix.Transpose(m);
            //result = IndexedVector3.TransformNormal(v,tm);
            result = m._basis * v;

            MathUtil.PrintVector3(streamWriter, result);
            streamWriter.WriteLine("");

            streamWriter.WriteLine("quatAngle");
            Quaternion q       = Quaternion.CreateFromYawPitchRoll(0.3f, 0.2f, 0.7f);
            float      fresult = MathUtil.QuatAngle(ref q);

            streamWriter.WriteLine(String.Format("{0:0.00000000}", fresult));

            streamWriter.WriteLine("quatRotate");
            v      = new IndexedVector3(20, -25, 30);
            result = MathUtil.QuatRotate(q, v);
            MathUtil.PrintVector3(streamWriter, result);
            streamWriter.WriteLine("");

            streamWriter.WriteLine("shortestArcQuat");
            v = new IndexedVector3(2f, -1f, 3f);
            IndexedVector3 v2 = new IndexedVector3(0.5f, 0.1f, 0.7f);

            q = MathUtil.ShortestArcQuat(v, v2);
            MathUtil.PrintQuaternion(streamWriter, q);

            streamWriter.WriteLine("");

            streamWriter.WriteLine("quaternionMultiply");
            q = Quaternion.CreateFromYawPitchRoll(0.3f, 0.2f, 0.7f);
            Quaternion q2 = Quaternion.CreateFromYawPitchRoll(-0.71f, 0.8f, 0.3f);

            q = MathUtil.QuaternionMultiply(q, q2);
            MathUtil.PrintQuaternion(streamWriter, q);
            streamWriter.WriteLine("");

            //streamWriter.WriteLine("matrixToEulerXYZ");
            //m = IndexedMatrix.Identity;
            //m._basis..SetEulerZYX(1, -2, -1);
            //m._origin = new IndexedVector3(-1, 2, -3);
            //MathUtil.MatrixToEulerXYZ(ref m, out result);
            //MathUtil.PrintVector3(streamWriter, result);
            //streamWriter.WriteLine("");


            streamWriter.WriteLine("getSkewSymmetrixMatrix");
            v = new IndexedVector3(0.2f, 0.7f, -0.3f);
            IndexedVector3 v3;
            IndexedVector3 v4;;

            MathUtil.GetSkewSymmetricMatrix(ref v, out v2, out v3, out v4);
            MathUtil.PrintVector3(streamWriter, v2);
            streamWriter.WriteLine("");
            MathUtil.PrintVector3(streamWriter, v3);
            streamWriter.WriteLine("");
            MathUtil.PrintVector3(streamWriter, v4);
            streamWriter.WriteLine("");


            streamWriter.WriteLine("quaternion create");
            m = IndexedMatrix.Identity;
            m._basis.SetEulerZYX(0, 0, MathUtil.SIMD_HALF_PI);
            m._origin = new IndexedVector3(0.0f, 0.30f, 0.0f);
            m2        = IndexedMatrix.Identity;
            m2._basis.SetEulerZYX(0, 0, MathUtil.SIMD_HALF_PI);
            m2._origin = new IndexedVector3(0.0f, -0.14f, 0.0f);

            q  = m.GetRotation();
            q2 = m2.GetRotation();
            MathUtil.PrintQuaternion(streamWriter, q);
            streamWriter.WriteLine("");
            MathUtil.PrintQuaternion(streamWriter, q2);
            streamWriter.WriteLine("");



            streamWriter.WriteLine("row and column");
            m = IndexedMatrix.Identity;
            m._basis.SetEulerZYX(0.3f, 0.7f, 0.5f);
            m._origin = new IndexedVector3(11, 22, 33);
            MathUtil.PrintVector3(streamWriter, "col0", m._basis.GetColumn(0));
            MathUtil.PrintVector3(streamWriter, "col1", m._basis.GetColumn(1));
            MathUtil.PrintVector3(streamWriter, "col2", m._basis.GetColumn(2));
            //MathUtil.PrintVector3(streamWriter, "col3", MathUtil.MatrixColumn(m, 0));

            MathUtil.PrintVector3(streamWriter, "row0", m._basis.GetRow(0));
            MathUtil.PrintVector3(streamWriter, "row1", m._basis.GetRow(1));
            MathUtil.PrintVector3(streamWriter, "row2", m._basis.GetRow(2));
            //MathUtil.PrintVector3(streamWriter, "row3", MathUtil.MatrixRow(ref m, 3));


            Matrix        lookat1 = Matrix.CreateLookAt(new Vector3(5, 5, 5), new Vector3(10, 10, 10), new Vector3(0, 1, 0));
            IndexedMatrix lookat2 = IndexedMatrix.CreateLookAt(new IndexedVector3(5, 5, 5), new IndexedVector3(10, 10, 10), new IndexedVector3(0, 1, 0));
            Matrix        compare = lookat2.ToMatrix();

            MathUtil.PrintMatrix(streamWriter, "lookat1", lookat1);
            MathUtil.PrintMatrix(streamWriter, "lookat2", lookat2);
            MathUtil.PrintMatrix(streamWriter, "lookat compare", compare);


            float aspect = (float)(800.0f / 600.0f);
            float fov    = MathHelper.ToRadians(40.0f);
            float near   = 1f;
            float far    = 500f;

            Matrix        pov  = Matrix.CreatePerspectiveFieldOfView(fov, aspect, near, far);
            IndexedMatrix pov2 = IndexedMatrix.CreatePerspectiveFieldOfView(fov, aspect, near, far);
            Matrix        pov3 = pov2.ToMatrix();

            MathUtil.PrintMatrix(streamWriter, "pov1", pov);
            MathUtil.PrintMatrix(streamWriter, "pov2", pov2);
            MathUtil.PrintMatrix(streamWriter, "pov compare", pov3);


            streamWriter.WriteLine("Complete.");
            streamWriter.Flush();
            filestream.Close();
        }