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]); } }
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); }
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); }
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); }
private static extern void Internal_create(PhysicsMesh managedInstance, MeshData meshData, PhysicsMeshType type);
public BoxMesher() { m_cubeMesh = CreateCubeMesh(); m_cubeRenderingMesh = CreateCubeRenderingMesh(); }
/// <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; }
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); }