public static Vector3[] CreateScaledBvhTriangleMeshShape(ScaledBvhTriangleMeshShape shape, out uint[] indices) { Vector3[] vert = CreateShape(shape.ChildShape, out indices); var scale = shape.LocalScaling; return(ScaleShape(vert, ref scale)); }
private RigidBody BuildRigidBodyFromTriangleMeshShape(BvhTriangleMeshShape triangleMeshShape, int mass, TGCVector3 position, TGCVector3 scale) { var transformationMatrix = TGCMatrix.RotationYawPitchRoll(0, 0, 0); transformationMatrix.Origin = position; DefaultMotionState motionState = new DefaultMotionState(transformationMatrix.ToBsMatrix); var bulletShape = new ScaledBvhTriangleMeshShape(triangleMeshShape, scale.ToBulletVector3()); var boxLocalInertia = bulletShape.CalculateLocalInertia(0); var bodyInfo = new RigidBodyConstructionInfo(mass, motionState, bulletShape, boxLocalInertia); var rigidBody = new RigidBody(bodyInfo); rigidBody.Friction = 0.4f; rigidBody.RollingFriction = 1; rigidBody.Restitution = 1f; return(rigidBody); }
private void CreateTrimeshGround() { const float scale = 20.0f; //create a triangle-mesh ground const int NumVertsX = 20; const int NumVertsY = 20; const int totalVerts = NumVertsX * NumVertsY; const int totalTriangles = 2 * (NumVertsX - 1) * (NumVertsY - 1); _groundVertexArray = new TriangleIndexVertexArray(); _groundMesh = new IndexedMesh(); _groundMesh.Allocate(totalTriangles, totalVerts); _groundMesh.NumTriangles = totalTriangles; _groundMesh.NumVertices = totalVerts; _groundMesh.TriangleIndexStride = 3 * sizeof(int); _groundMesh.VertexStride = Vector3.SizeInBytes; using (var indicesStream = _groundMesh.GetTriangleStream()) { var indices = new BinaryWriter(indicesStream); for (int i = 0; i < NumVertsX - 1; i++) { for (int j = 0; j < NumVertsY - 1; j++) { indices.Write(j * NumVertsX + i); indices.Write(j * NumVertsX + i + 1); indices.Write((j + 1) * NumVertsX + i + 1); indices.Write(j * NumVertsX + i); indices.Write((j + 1) * NumVertsX + i + 1); indices.Write((j + 1) * NumVertsX + i); } } indices.Dispose(); } using (var vertexStream = _groundMesh.GetVertexStream()) { var vertices = new BinaryWriter(vertexStream); for (int i = 0; i < NumVertsX; i++) { for (int j = 0; j < NumVertsY; j++) { const float waveLength = .2f; float height = (float)(Math.Sin(i * waveLength) * Math.Cos(j * waveLength)); vertices.Write(i - NumVertsX * 0.5f); vertices.Write(height); vertices.Write(j - NumVertsY * 0.5f); } } vertices.Dispose(); } _groundVertexArray.AddIndexedMesh(_groundMesh); var groundShape = new BvhTriangleMeshShape(_groundVertexArray, true); var groundScaled = new ScaledBvhTriangleMeshShape(groundShape, new Vector3(scale)); RigidBody ground = PhysicsHelper.CreateStaticBody(Matrix.Identity, groundScaled, World); ground.UserObject = "Ground"; Matrix vehicleTransform = Matrix.Translation(0, -2, 0); CreateVehicle(vehicleTransform); }