好吧,我知道这个标题很糟糕,但我不知道怎么称呼它。
看到了吗?
那到底是什么?
所有物理相关代码:
internal static DynamicsWorld world;
static CollisionConfiguration conf = new DefaultCollisionConfiguration();
static ConstraintSolver solver = new SequentialImpulseConstraintSolver();
static Dispatcher dispatcher = new CollisionDispatcher(conf);
static BroadphaseInterface broadphase = new DbvtBroadphase();
static Stopwatch simTime = new Stopwatch();
static float time, timeStep;
internal static bool pause;
internal static DynamicsWorld DW
{
get
{
return world;
}
}
internal static bool running
{
get
{
return world != null;
}
}
internal static void init()
{
simTime.Start();
time = 0f;
timeStep = 0f;
world = new DiscreteDynamicsWorld(dispatcher, broadphase, solver, conf);
world.Gravity = new System.Numerics.Vector3(0f, -9.81f, 0f);
world.DebugDrawer = new SDebugDraw();
world.DebugDrawer.DebugMode = DebugDrawModes.All;
}
internal static GameObject raycast(System.Numerics.Vector3 pos, System.Numerics.Vector3 dir, float distance)
{
if (world == null) return null;
System.Numerics.Vector3 to = pos + dir * distance;
ClosestRayResultCallback closestResults = new(ref pos, ref to);
world.RayTest(pos, to, closestResults);
if (closestResults.HasHit)
if (Game.ActiveScene.GameObjects.Where(x => x.body.Native == closestResults.CollisionObject.Native).Any())
return Game.ActiveScene.GameObjects.Where(x => x.body.Native == closestResults.CollisionObject.Native).First();
return null;
}
static bool stepping = false;
internal static void step()
{
if (pause) return;
if (world == null) return;
stepping = true;
if ((float)simTime.Elapsed.TotalSeconds < time)
{
time = 0;
timeStep = 0;
}
timeStep = (float)simTime.Elapsed.TotalSeconds - time;
time = (float)simTime.Elapsed.TotalSeconds;
world.StepSimulation(timeStep);
stepping = false;
}
internal static void addToScene(GameObject go)
{
while(stepping) { }
if (world == null) return;
CollisionShape shape = GetObjShape(go);
go.renderer.World = Matrix.Identity;
RigidBody body = new RigidBody(
new RigidBodyConstructionInfo(
go.Weight,
new SMotionState(go),
shape, shape.CalculateLocalInertia(go.Weight)));
body.ForceActivationState(ActivationState.ActiveTag);
if (body.IsStaticObject)
{
body.Restitution = go.Restitution;
body.Friction = go.Friction;
}
go.body = body;
world.AddRigidBody(body);
body.Gravity = new System.Numerics.Vector3(0f, go.HasGravity ? -9.81f : 0f, 0f);
body.ForceActivationState(ActivationState.ActiveTag);
}
internal static void drop()
{
world.Dispose();
conf.Dispose();
broadphase.Dispose();
solver.Dispose();
dispatcher.Dispose();
simTime.Stop();
}
现在有了它,中间的绿色物体的比例为 10,1,10,球体只是球体。
如视频所示,这很糟糕,我不知道发生了什么,我试图修复它但没有任何效果。
什么会导致这个?
到底发生了什么?
有什么解决办法吗?
编辑: 如果你看不到视频,一切都出了问题,有一个下落的立方体,让它与一个朝它的方向前进的物体发生碰撞就可以了,然后再做一次让它传送并有一个超乎想象的速度(它真的扔了一个例外因为速度太大)