Ejemplo n.º 1
0
        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));
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }