Esempio n. 1
0
        public void calculateObjectCenterOfMass(ref PhysicsMesh physMesh)
        {
            Vector3 COM = new Vector3();

            for (int i = 0; i < physMesh.polygonArray.Length; i++)
            {
                COM += physMesh.polygonArray[i].centerOfMass*physMesh.polygonArray[i].mass;
            }

            COM = COM / physMesh.totalMass;
            physMesh.centerOfMass = COM;

            Console.WriteLine("COM " + COM);

            //COM i origo
            for (int i = 0; i < physMesh.polygonArray.Length; i++)
            {
                physMesh.polygonArray[i].vertices[0] = physMesh.polygonArray[i].vertices[0] - COM;
                physMesh.polygonArray[i].vertices[1] = physMesh.polygonArray[i].vertices[1] - COM;
                physMesh.polygonArray[i].vertices[2] = physMesh.polygonArray[i].vertices[2] - COM;
            }

            for (int i = 0; i < physMesh.numberOfPolygons; i++)
            {
                calculateCentroid(ref physMesh.polygonArray[i]);

            }
        }
Esempio n. 2
0
        public void calculateObjectMass(ref PhysicsMesh physMesh)
        {
            float totalMass = 0.0f;

            for (int i = 0; i < physMesh.polygonArray.Length; i++)
            {
                totalMass += physMesh.polygonArray[i].mass;
            }
            physMesh.totalMass = totalMass;

            Console.WriteLine("total mass: " + totalMass);
        }
 public void SetPhysicsMesh(PhysicsMesh mesh)
 {
     if (mesh == _physicsMesh)
     {
         return;
     }
     _physicsMesh = mesh;
     if (_physicsMesh == null)
     {
         return;
     }
     CreateBuffers();
 }
        /// <summary>
        /// Creates GUI elements for fields specific to the mesh collider.
        /// </summary>
        protected void BuildGUI(MeshCollider collider)
        {
            meshField.OnChanged += x =>
            {
                PhysicsMesh mesh = Resources.Load <PhysicsMesh>(x.UUID);
                collider.Mesh = mesh;

                MarkAsModified();
                ConfirmModify();
            };

            Layout.AddElement(meshField);

            base.BuildGUI(collider);
        }
        private static void DrawMeshCollider(MeshCollider collider)
        {
            PhysicsMesh mesh = collider.Mesh.Value;

            if (mesh == null)
            {
                return;
            }

            SceneObject so = collider.SceneObject;

            Gizmos.Color     = Color.Green;
            Gizmos.Transform = so.WorldTransform;

            MeshData meshData = mesh.MeshData;

            Gizmos.DrawWireMesh(meshData);
        }
Esempio n. 6
0
        public void calculateInertiaTensorInverse(ref PhysicsMesh physMesh)
        {
            Matrix Ibody = new Matrix();

            for (int i = 0; i < physMesh.polygonArray.Length; i++)
            {
                //Console.WriteLine("i: " + physMesh.polygonArray[i].mass);
                Ibody.M11 += physMesh.polygonArray[i].mass * ((float)Math.Pow(physMesh.polygonArray[i].centerOfMass.Y, 2.0) + (float)Math.Pow(physMesh.polygonArray[i].centerOfMass.Z, 2.0));
                Ibody.M12 += physMesh.polygonArray[i].mass * -1 * ((physMesh.polygonArray[i].centerOfMass.X) * (physMesh.polygonArray[i].centerOfMass.Y));
                Ibody.M13 += physMesh.polygonArray[i].mass * -1 * ((physMesh.polygonArray[i].centerOfMass.X) * (physMesh.polygonArray[i].centerOfMass.Z));

                Ibody.M21 += physMesh.polygonArray[i].mass * -1 * ((physMesh.polygonArray[i].centerOfMass.X) * (physMesh.polygonArray[i].centerOfMass.Y));
                Ibody.M22 += physMesh.polygonArray[i].mass * ((float)Math.Pow(physMesh.polygonArray[i].centerOfMass.X, 2.0) + (float)Math.Pow(physMesh.polygonArray[i].centerOfMass.Z, 2.0));
                Ibody.M23 += physMesh.polygonArray[i].mass * -1 * ((physMesh.polygonArray[i].centerOfMass.Y) * (physMesh.polygonArray[i].centerOfMass.Z));

                Ibody.M31 += physMesh.polygonArray[i].mass * -1 * ((physMesh.polygonArray[i].centerOfMass.X) * (physMesh.polygonArray[i].centerOfMass.Z));
                Ibody.M32 += physMesh.polygonArray[i].mass * -1 * ((physMesh.polygonArray[i].centerOfMass.Y) * (physMesh.polygonArray[i].centerOfMass.Y));
                Ibody.M33 += physMesh.polygonArray[i].mass * ((float)Math.Pow(physMesh.polygonArray[i].centerOfMass.X, 2.0) + (float)Math.Pow(physMesh.polygonArray[i].centerOfMass.Y, 2.0));
            }

            physMesh.inertiaTensorInverse = Matrix.Invert(Ibody);
        }
Esempio n. 7
0
        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);

            device = graphics.GraphicsDevice;

            effect = Content.Load<Effect>("effects");

            triangle = new Polygon();
            physMesh = new PhysicsMesh();
            physMesh.polygonArray = new Polygon[1];

            triangle.vertices[0] = new Vector3(0f, 1f, 0f);
            triangle.vertices[1] = new Vector3(1f, 1f, 0f);
            triangle.vertices[2] = new Vector3(1f, 0f, 0f);

            physMesh.polygonArray[0] = triangle;
            physMesh.numberOfPolygons = 1;

            physicsEngine = new Physics();

            //physicsEngine.initPhysics(ref physMesh);
        }
Esempio n. 8
0
 private static extern void Internal_create(PhysicsMesh managedInstance, MeshData meshData, PhysicsMeshType type);
Esempio n. 9
0
 public BoxMesher()
 {
     m_cubeMesh = CreateCubeMesh();
     m_cubeRenderingMesh = CreateCubeRenderingMesh();
 }
Esempio n. 10
0
        /// <summary>
        /// Generate a simple cube mesh
        /// </summary>
        /// <returns>A BasicMesh object containing vertices and indices for a
        /// cube</returns>
        private static PhysicsMesh CreateCubeMesh()
        {
            // Set up the 8 corners of the cube
            PhysicsMesh cube = new PhysicsMesh();
            cube.Vertices = new Vector3[]
            {
                new Vector3(left, bottom, front), // 0
                new Vector3(right, bottom, front), // 1
                new Vector3(left, top, front), // 2
                new Vector3(right, top, front), // 3
                new Vector3(left, bottom, back), // 4
                new Vector3(right, bottom, back), // 5
                new Vector3(left, top, back), // 6
                new Vector3(right, top, back), // 7
            };

            // Set up the index information for the 12 faces
            cube.Indices = new ushort[]
            {
                // Left faces
                lefttopfront,     lefttopback,      leftbottomback,   // 0
                leftbottomback,   leftbottomfront,  lefttopfront,     // 1

                // Front faces
                lefttopfront,     leftbottomfront,  rightbottomfront, // 2
                rightbottomfront, righttopfront,    lefttopfront,     // 3

                // Right faces
                righttopback,     righttopfront,    rightbottomfront, // 4
                rightbottomfront, rightbottomback,  righttopback,     // 5

                // Back faces
                leftbottomback,   lefttopback,      righttopback,     // 6
                righttopback,     rightbottomback,  leftbottomback,   // 7

                // Top faces
                righttopfront,    righttopback,     lefttopback,      // 8
                lefttopback,      lefttopfront,     righttopfront,    // 9

                // Bottom faces
                leftbottomfront,  leftbottomback,   rightbottomback,  // 10
                rightbottomback,  rightbottomfront, leftbottomfront   // 11
            };

            return cube;
        }
Esempio n. 11
0
        public void initPhysics(ref PhysicsMesh physMesh)
        {
            // Ett pappers densitet i kg/m^3
            physMesh.density = 1000;

            for (int i = 0; i < physMesh.numberOfPolygons; i++)
            {
                calculateCentroid(ref physMesh.polygonArray[i]);
                calculatePolygonMass(ref physMesh.polygonArray[i], physMesh.density);
            }

            calculateObjectMass(ref physMesh);
            //calculateObjectCenterOfMass(ref physMesh);
            //calculateInertiaTensorInverse(ref physMesh);
        }