【问题标题】:Best, easiest way to do smooth collision?进行平滑碰撞的最佳、最简单的方法?
【发布时间】:2013-12-18 18:11:39
【问题描述】:

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

代码注释:

  • 使用 C# 和添加的 XNA 库。
  • 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;
        }

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

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

【问题讨论】:

    标签: c# 3d xna collision


    【解决方案1】:

    好的,我不确定是否有任何其他方法可以做到这一点,这可以根据需要进行。我觉得唯一需要补充的是一种上坡的方法,但除此之外,这种方法效果很好!如果有人提出另一种更好的方法,请发布并回答!否则,这就是这样做的方法!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-29
      • 1970-01-01
      • 2011-08-30
      • 2014-01-04
      • 1970-01-01
      • 2023-03-21
      相关资源
      最近更新 更多