【问题标题】:Finding the last Vector of a right angled triangle - Unity找到直角三角形的最后一个向量 - Unity
【发布时间】:2018-11-10 03:20:41
【问题描述】:

对于上下文:我已经完成了在 Unity 中制作墙壁运行系统的 90%,我需要帮助找到 2 个可用于检查并为玩家增加速度以让他们移动的 Vector3正确的方向。

更具体地说,我在与墙的接触点的右侧和左侧获取两个 Vector3,然后获取右侧点与玩家先前位置之间的距离,以及左侧点与玩家先前位置之间的距离位置。无论哪个点离玩家更远,就是我们行进的方向,如果你取那个点和 - 接触点并对其进行归一化,函数会返回 Vector3 以用于向玩家添加速度。

目前我正在使用此功能为我执行此操作(其中 hit 是玩家与墙壁之间的接触点):

Vector3 CalculateWallRunDirection(Vector3 hit, Transform wall)
{

    Vector3 rightPos = hit + wall.forward;
    Vector3 leftPos = hit + (wall.forward * -1);

    float rightDis = Vector3.Distance(rightPos, prevPlayerPos);
    float leftDis = Vector3.Distance(leftPos, prevPlayerPos);

    if (rightDis < leftDis)
    {
        return Vector3.Normalize(leftPos - hit);
    }
    else
    {
        return Vector3.Normalize(rightPos - hit);
    }

}

当它工作时效果很好......但问题是,因为我正在使用墙壁的 Transform.forward 来确定这些点在哪里,如果你尝试在墙壁的正面或背面运行物体,它会扔到墙上而不是沿着它,玩家会被卡住。

TL;DR:我需要另一种方法来确定两个 Vector3,而不是使用 transform.forward + 原始 Vector3。从上往下看,问题可能显示为this。 A是玩家,B是与墙壁的接触点。找到 C 和 D:

请解释一下你的答案,我数学不太好。

【问题讨论】:

  • 参考上下文中的 A 和 B 是什么?此外,使用玩家的方向来确定“你正在行驶的方向”会更容易,因为你不能向后跑。您也可以从刚体中获取玩家的速度并将其归一化以获得玩家移动的方向
  • A 是球员位置,B 是与墙壁的接触点。我实际上确实希望玩家能够向后跑,这听起来很奇怪。如果你玩过的话,想想类似于守望先锋中的卢西奥。尽管如此,我仍然需要将向量添加到玩家的速度中
  • 那么我是否正确地假设您想要一个与玩家行进方向上的接触面平行的新向量?
  • 是的,完全正确。这是最终目标。

标签: c# unity3d vector geometry


【解决方案1】:

您实际上是在尝试重新创建 Vector3.ProjectOnPlane()。您可能想改用它。

例如

Vector3 A = Vector3.ProjectOnPlane(B, C);
// A is the new velocity vector parallel to the wall
// B is the old velocity of the player at the point of impact
// C is the normal of the plane of impact

你可以在OnCollisionEnter事件中轻松找到C,只需获取联系人的正常。

注意B不需要归一化,但如果是,A也将是一个归一化的Vector3。

【讨论】:

  • 等一下,我应该用那个替换我的整个函数吗?
  • 别在意这个问题。非常感谢,现在可以正常使用了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-26
相关资源
最近更新 更多