做平滑碰撞的最佳,最简单的方法?

时间:2013-12-02 21:40:13

标签: c# 3d xna collision

所以现在我试图让我的游戏有些顺畅,易于制作,碰撞。我想要做的是让游戏一次添加一个向量的每个维度,所以如果只有X值可以改变,那么它只会改变X值。示例代码如下。

代码说明:

  • 使用添加了XNA库的C#。
  • IsCollision方法查看输入的两个模型是否在彼此内部。
  • 玩家模型只是一个盒子,地板只是一个楼层。
  • X,Y和Z是摄像机位置,lookAt Vector是摄像机所在的位置。
  • 将标准向量添加到X,Y,Z和lookAt以创建移动。
  • 游戏是3D游戏。

代码:

//Forward movement
if (key.IsKeyDown(Keys.W) || pad1.ThumbSticks.Left.Y >= 0.2)
        {
            //Check X axis
            playerCollisionMatrix = Matrix.CreateTranslation(new Vector3(X - 10, Y - 10, Z - 10) + (norm + new Vector3(Vector3.Normalize(lookAt).X, 0, 0) / 10));
            if (!IsCollision(playerModel, playerCollisionMatrix, floor, floorMatrix)) norm += new Vector3(Vector3.Normalize(lookAt).X, 0, 0) / 10;
            //Check Y axis
            playerCollisionMatrix = Matrix.CreateTranslation(new Vector3(X - 10, Y - 10, Z - 10) + (norm + new Vector3(0, Vector3.Normalize(lookAt).Y, 0) / 10));
            if (!IsCollision(playerModel, playerCollisionMatrix, floor, floorMatrix)) norm += new Vector3(0, Vector3.Normalize(lookAt).Y, 0) / 10;
            //Check Z axis
            playerCollisionMatrix = Matrix.CreateTranslation(new Vector3(X - 10, Y - 10, Z - 10) + (norm + new Vector3(0, 0,Vector3.Normalize(lookAt).Z) / 10));
            if (!IsCollision(playerModel, playerCollisionMatrix, floor, floorMatrix)) norm += new Vector3(0, 0, Vector3.Normalize(lookAt).Z) / 10;
        }

显然不止一个,每个方向一个。但我想知道的是,如果这是最好的方法,或者还有另一种更好的方法吗?

可根据要求提供更多代码和信息。

1 个答案:

答案 0 :(得分:0)

好的,我不确定是否有其他方法可以做到这一点,这可以根据需要运行。我认为唯一需要添加的是一种上坡的方法,但除此之外,这种方法非常有效!如果有人带着另一个更好的方式来做,发布和回答!否则,这就是这样做的方法!