Je développe un moteur de jeu en C# et j'utilise BulletSharp pour la physique. Cela fonctionne bien, sauf avec des cubes:Bullet Physics Coques convexes avec des cubes
http://i.stack.imgur.com/EPfrw.png
(La boîte englobante Axis-Alignés est le rouge transparent, le modèle est le blanc)
Au repos, la position sur leurs bords. Comme je charge des modèles Collada, je crée un ConvexHullShape()
et j'ajoute les données sous forme de nuage vectoriel. Tout en utilisant BoxShape()
serait plus efficace (et fonctionnerait correctement), je ne peux pas car il n'est pas garanti que tous les modèles sont des cubes. Je ne peux pas comprendre pourquoi ils reposent sur les sommets et non sur les bords plats. Mon implémentation de ConvexHullShape
est-elle incorrecte ou dois-je utiliser un autre type de forme (pour que la physique fonctionne correctement)?
public RigidBody AddDynamicGeometry(ColladaGeometry geometry, Matrix4 transform)
{
List<Vector3> points = new List<Vector3>();
foreach (Triangle tri in geometry.triangles)
{
points.Add(tri.vertices[0]);
points.Add(tri.vertices[1]);
points.Add(tri.vertices[2]);
}
CollisionShape shape = new ConvexHullShape(points);
shape.UserObject = geometry;
collisionShapes.Add(shape);
RigidBody body = CreateRigidBody(geometry.triangles.Count * 10, transform, shape);
return body;
}
public RigidBody CreateRigidBody(float mass, Matrix4 startTransform, CollisionShape 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);
physics_world.AddRigidBody(body);
return body;
}