BulletSharp 行为不端

问题描述 投票:0回答:0

好吧,我知道这个标题很糟糕,但我不知道怎么称呼它。

https://streamable.com/0inzvu

看到了吗?

那到底是什么?

所有物理相关代码:

        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,球体只是球体。

如视频所示,这很糟糕,我不知道发生了什么,我试图修复它但没有任何效果。

什么会导致这个?

到底发生了什么?

有什么解决办法吗?

编辑: 如果你看不到视频,一切都出了问题,有一个下落的立方体,让它与一个朝它的方向前进的物体发生碰撞就可以了,然后再做一次让它传送并有一个超乎想象的速度(它真的扔了一个例外因为速度太大)

c# game-physics bullet
© www.soinside.com 2019 - 2024. All rights reserved.