public Physics() { // collision configuration contains default setup for memory, collision setup collisionConf = new DefaultCollisionConfiguration(); Dispatcher = new CollisionDispatcher(collisionConf); Broadphase = new DbvtBroadphase(); World = new DiscreteDynamicsWorld(Dispatcher, Broadphase, null, collisionConf); World.Gravity = new Vector3(0, -10, 0); CollisionShapes = new AlignedCollisionShapeArray(); // create the ground CollisionShape groundShape = new BoxShape(50, 1, 50); CollisionShapes.Add(groundShape); CollisionObject ground = LocalCreateRigidBody(0, Matrix.Identity, groundShape); ground.UserObject = "Ground"; // create a few dynamic rigidbodies float mass = 1.0f; CollisionShape colShape = new BoxShape(1); CollisionShapes.Add(colShape); Vector3 localInertia = colShape.CalculateLocalInertia(mass); float start_x = StartPosX - ArraySizeX / 2; float start_y = StartPosY; float start_z = StartPosZ - ArraySizeZ / 2; int k, i, j; for (k = 0; k < ArraySizeY; k++) { for (i = 0; i < ArraySizeX; i++) { for (j = 0; j < ArraySizeZ; j++) { Matrix startTransform = Matrix.CreateTranslation( new Vector3( 2*i + start_x, 2*k + start_y, 2*j + start_z ) ); // using motionstate is recommended, it provides interpolation capabilities // and only synchronizes 'active' objects DefaultMotionState myMotionState = new DefaultMotionState(startTransform); RigidBodyConstructionInfo rbInfo = new RigidBodyConstructionInfo(mass, myMotionState, colShape, localInertia); RigidBody body = new RigidBody(rbInfo); // make it drop from a height body.Translate(new Vector3(0, 20, 0)); World.AddRigidBody(body); } } } }
/// <summary> /// 剛体を作る /// </summary> /// <param name="collisionShape">剛体の形</param> /// <param name="world">剛体のワールド変換行列</param> /// <param name="rigidProperty">剛体の物性</param> /// <param name="superProperty">物理演算を超越した特性</param> /// <returns></returns> public RigidBody CreateRigidBody(CollisionShape collisionShape, Matrix world, RigidProperty rigidProperty, SuperProperty superProperty) { var mass = superProperty.kinematic ? 0 : rigidProperty.mass; collisionShapes.Add(collisionShape); Vector3 localInertia = new Vector3(0, 0, 0); if (mass != 0) { collisionShape.CalculateLocalInertia(mass, out localInertia); } DefaultMotionState motionState = new DefaultMotionState(world); RigidBodyConstructionInfo rbInfo = new RigidBodyConstructionInfo(mass, motionState, collisionShape, localInertia); RigidBody body = new RigidBody(rbInfo); body.Restitution = rigidProperty.restitution; body.Friction = rigidProperty.friction; body.SetDamping(rigidProperty.linear_damp, rigidProperty.angular_damp); float linearDamp = body.LinearDamping; float angularDamp = body.AngularDamping; if (superProperty.kinematic) { body.CollisionFlags = body.CollisionFlags | CollisionFlags.KinematicObject; } body.ActivationState = ActivationState.DisableDeactivation; dynamicsWorld.AddRigidBody(body, superProperty.group, superProperty.mask); return(body); }
public RigidBody AddStaticGeometry(ColladaGeometry geometry, Matrix4 transform, object UserData) { TriangleMesh mesh = new TriangleMesh(); foreach (Triangle tri in geometry.triangles) { mesh.AddTriangle(tri.vertices[0], tri.vertices[1], tri.vertices[2] ); } CollisionShape shape = new BvhTriangleMeshShape(mesh, true); shape.UserObject = UserData; collisionShapes.Add(shape); RigidBody body = CreateRigidBody(0, transform, shape); //Zero mass for static body return(body); }
public RigidBody LocalCreateRigidBody(float mass, Matrix startTransform, CollisionShape shape) { collisionShapes.Add(shape); bool isDynamic = (mass != 0.0f); Vector3 localInertia = Vector3.Zero; if (isDynamic) { shape.CalculateLocalInertia(mass, out localInertia); } DefaultMotionState myMotionState = new DefaultMotionState(startTransform); RigidBodyConstructionInfo rbInfo = new RigidBodyConstructionInfo(mass, myMotionState, shape, localInertia); RigidBody body = new RigidBody(rbInfo); World.AddRigidBody(body); return(body); }
public override void ConvexDecompResult(ConvexResult result) { TriangleMesh trimesh = new TriangleMesh(); demo.trimeshes.Add(trimesh); Vector3 localScaling = new Vector3(6.0f, 6.0f, 6.0f); if (output == null) { return; } output.WriteLine("## Hull Piece {0} with {1} vertices and {2} triangles.", mHullCount, result.mHullVertices.Length, result.mHullIndices.Length / 3); output.WriteLine("usemtl Material{0}", mBaseCount); output.WriteLine("o Object{0}", mBaseCount); foreach (Vector3 p in result.mHullVertices) { output.WriteLine(string.Format(floatFormat, "v {0:F9} {1:F9} {2:F9}", p.X, p.Y, p.Z)); } //calc centroid, to shift vertices around center of mass demo.centroid = Vector3.Zero; AlignedVector3Array vertices = new AlignedVector3Array(); if (true) { foreach (Vector3 vertex in result.mHullVertices) { demo.centroid += vertex * localScaling; } } demo.centroid /= (float)result.mHullVertices.Length; if (true) { foreach (Vector3 vertex in result.mHullVertices) { vertices.Add(vertex * localScaling - demo.centroid); } } if (true) { int[] src = result.mHullIndices; for (int i = 0; i < src.Length; i += 3) { int index0 = src[i]; int index1 = src[i + 1]; int index2 = src[i + 2]; Vector3 vertex0 = result.mHullVertices[index0] * localScaling - demo.centroid; Vector3 vertex1 = result.mHullVertices[index1] * localScaling - demo.centroid; Vector3 vertex2 = result.mHullVertices[index2] * localScaling - demo.centroid; trimesh.AddTriangle(vertex0, vertex1, vertex2); index0 += mBaseCount; index1 += mBaseCount; index2 += mBaseCount; output.WriteLine("f {0} {1} {2}", index0 + 1, index1 + 1, index2 + 1); } } //this is a tools issue: due to collision margin, convex objects overlap, compensate for it here: //#define SHRINK_OBJECT_INWARDS 1 #if SHRINK_OBJECT_INWARDS float collisionMargin = 0.01f; btAlignedObjectArray <btVector3> planeEquations; btGeometryUtil::getPlaneEquationsFromVertices(vertices, planeEquations); btAlignedObjectArray <btVector3> shiftedPlaneEquations; for (int p = 0; p < planeEquations.size(); p++) { btVector3 plane = planeEquations[p]; plane[3] += collisionMargin; shiftedPlaneEquations.push_back(plane); } btAlignedObjectArray <btVector3> shiftedVertices; btGeometryUtil::getVerticesFromPlaneEquations(shiftedPlaneEquations, shiftedVertices); btConvexHullShape *convexShape = new btConvexHullShape(&(shiftedVertices[0].getX()), shiftedVertices.size()); #else //SHRINK_OBJECT_INWARDS ConvexHullShape convexShape = new ConvexHullShape(vertices); #endif if (demo.sEnableSAT) { convexShape.InitializePolyhedralFeatures(); } convexShape.Margin = 0.01f; convexShapes.Add(convexShape); convexCentroids.Add(demo.centroid); demo.CollisionShapes.Add(convexShape); mBaseCount += result.mHullVertices.Length; // advance the 'base index' counter. }
public Physics() { // collision configuration contains default setup for memory, collision setup collisionConf = new DefaultCollisionConfiguration(); dispatcher = new CollisionDispatcher(collisionConf); broadphase = new DbvtBroadphase(); World = new DiscreteDynamicsWorld(dispatcher, broadphase, null, collisionConf); World.Gravity = new Vector3(0, -10, 0); // create the ground CollisionShape groundShape = new BoxShape(50, 50, 50); collisionShapes.Add(groundShape); CollisionObject ground = LocalCreateRigidBody(0, Matrix4.CreateTranslation(0, -50, 0), groundShape); ground.UserObject = "Ground"; // create a few dynamic rigidbodies const float mass = 1.0f; CollisionShape colShape = new BoxShape(1); collisionShapes.Add(colShape); Vector3 localInertia = colShape.CalculateLocalInertia(mass); const float start_x = StartPosX - ArraySizeX / 2; const float start_y = StartPosY; const float start_z = StartPosZ - ArraySizeZ / 2; int k, i, j; for (k = 0; k < ArraySizeY; k++) { for (i = 0; i < ArraySizeX; i++) { for (j = 0; j < ArraySizeZ; j++) { Matrix4 startTransform = Matrix4.CreateTranslation( new Vector3( 2 * i + start_x, 2 * k + start_y, 2 * j + start_z ) ); // using motionstate is recommended, it provides interpolation capabilities // and only synchronizes 'active' objects DefaultMotionState myMotionState = new DefaultMotionState(startTransform); RigidBodyConstructionInfo rbInfo = new RigidBodyConstructionInfo(mass, myMotionState, colShape, localInertia); RigidBody body = new RigidBody(rbInfo); // make it drop from a height body.Translate(new Vector3(0, 20, 0)); World.AddRigidBody(body); } } } }
public Physics(SceneManager sceneMgr) { // collision configuration contains default setup for memory, collision setup collisionConf = new DefaultCollisionConfiguration(); Dispatcher = new CollisionDispatcher(collisionConf); Broadphase = new DbvtBroadphase(); World = new DiscreteDynamicsWorld(Dispatcher, Broadphase, null, collisionConf); World.Gravity = new Vector3(0, -10, 0); // create the ground CollisionShape groundShape = new BoxShape(50, 1, 50); CollisionShapes.Add(groundShape); CollisionObject ground = LocalCreateRigidBody(0, Matrix4.IDENTITY, groundShape); ground.UserObject = "Ground"; // create a few dynamic rigidbodies float mass = 1.0f; CollisionShape colShape = new BoxShape(1); CollisionShapes.Add(colShape); Vector3 localInertia = colShape.CalculateLocalInertia(mass); float start_x = StartPosX - ArraySizeX / 2; float start_y = StartPosY; float start_z = StartPosZ - ArraySizeZ / 2; int k, i, j; for (k = 0; k < ArraySizeY; k++) { for (i = 0; i < ArraySizeX; i++) { for (j = 0; j < ArraySizeZ; j++) { Matrix4 startTransform = new Matrix4(); startTransform.MakeTrans( new Vector3( 2 * i + start_x, 2 * k + start_y, 2 * j + start_z ) ); // using motionstate is recommended, it provides interpolation capabilities // and only synchronizes 'active' objects int index = (k * ArraySizeX + i) * ArraySizeZ + j; Entity box = sceneMgr.CreateEntity("Box" + index.ToString(), "box.mesh"); box.SetMaterialName("BoxMaterial/Active"); SceneNode boxNode = sceneMgr.RootSceneNode.CreateChildSceneNode("BoxNode" + index.ToString()); boxNode.AttachObject(box); boxNode.Scale(new Vector3(2, 2, 2)); MogreMotionState myMotionState = new MogreMotionState(box, boxNode, startTransform); RigidBodyConstructionInfo rbInfo = new RigidBodyConstructionInfo(mass, myMotionState, colShape, localInertia); RigidBody body = new RigidBody(rbInfo); myMotionState.Body = body; // make it drop from a height body.Translate(new Vector3(0, 20, 0)); World.AddRigidBody(body); } } } }