Following the notes and your advice on triangles I have tried many ways to create a concave sphere composed of triangles but none of them have been successful.
Code: Select all
        public ConcaveSphere(Game1 game, float radius)
        {
            this.game = game;
            CustomModel model = game.Models["Sphere"];
            int numTriangles = model.ModelData.Triangles.Length;
            float scale = 2f * radius;
            Matrix scaleTransform = new Matrix();
            scaleTransform.M11 = scale;
            scaleTransform.M12 = scale;
            scaleTransform.M13 = scale;
            scaleTransform.M21 = scale;
            scaleTransform.M22 = scale;
            scaleTransform.M23 = scale;
            scaleTransform.M31 = scale;
            scaleTransform.M32 = scale;
            scaleTransform.M33 = scale;
            scaleTransform.M44 = 1f;
            List<DynamicCompoundEntry> triangles = new List<DynamicCompoundEntry>(numTriangles);
            for (int i = 0; i < numTriangles; ++i)
            {
                // [Non Recentered Triangle]
                TriangleShape tri = new TriangleShape();
                tri.VertexA = model.ModelData.Triangles[i].A;
                tri.VertexB = model.ModelData.Triangles[i].B;
                tri.VertexC = model.ModelData.Triangles[i].C;
                // [Scaled Non Recentered Triangle]
                //tri.VertexA = Vector3.Transform(model.ModelData.Triangles[i].A, scaleTransform);
                //tri.VertexB = Vector3.Transform(model.ModelData.Triangles[i].B, scaleTransform);
                //tri.VertexC = Vector3.Transform(model.ModelData.Triangles[i].C, scaleTransform);
                // [Recentered Triangle]
                //Vector3 centre;
                //TriangleShape tri = new TriangleShape(
                //    model.ModelData.Triangles[i].A,
                //    model.ModelData.Triangles[i].B,
                //    model.ModelData.Triangles[i].C,
                //    out centre
                //    );
                //TriangleShape tri = new TriangleShape(
                //    Vector3.Transform(model.ModelData.Triangles[i].A, scaleTransform),
                //    Vector3.Transform(model.ModelData.Triangles[i].B, scaleTransform),
                //    Vector3.Transform(model.ModelData.Triangles[i].C, scaleTransform)
                //    );
                tri.Sidedness = TriangleSidedness.Counterclockwise;
                triangles.Add(
                    new DynamicCompoundEntry(
                        tri,
                        100f
                    )
                );
            }
            body = new CompoundBody(triangles);
            game.Space.Add(body);
        }
The non recentered triangle can't be scaled without causing NaN errors in the space:
The recentered triangle will draw incorrectly but I am unsure as to how to reposition the triangle with the 'out center' parameter.Function does not accept floating point Not-a-Number values.
I am drawing the compound shape like so
Code: Select all
        public void Draw()
        {
            int numShapes = compoundbody.Shapes.Count;
            for (int i = 0; i < numShapes; ++i)
            {
                TriangleShape t = body.Shapes[i].Shape as TriangleShape;
                Vector3 v0 = Vector3.Transform(t.VertexA, compoundbody.WorldTransform);
                Vector3 v1 = Vector3.Transform(t.VertexB, compoundbody.WorldTransform);
                Vector3 v2 = Vector3.Transform(t.VertexC, compoundbody.WorldTransform);
                game.WireShapeDrawer.DrawWireTriangle(v0, v1, v2, Color.White);
            }
        }
