【问题标题】:When to Normalize a Vector?何时规范化向量?
【发布时间】:2010-06-21 00:38:29
【问题描述】:

我正在学习 XNA 以及 http://creators.xna.com/en-US/ 上的几乎所有教育工具包。我总是在向量上看到对 Normalize() 的调用。我知道规范化基本上将向量转换为单位长度,所以它给出的只是方向。

现在我的问题是何时进行规范化以及它究竟对我有什么帮助。我正在做 2D 编程,所以请用 2D 概念而不是 3D 来解释。

编辑:这是 XNA 套件中的代码,那么为什么要调用 Normalize?

if (currentKeyboardState.IsKeyDown(Keys.Left) ||
            currentGamePadState.DPad.Left == ButtonState.Pressed)
        {
            catMovement.X -= 1.0f;
        }
        if (currentKeyboardState.IsKeyDown(Keys.Right) ||
            currentGamePadState.DPad.Right == ButtonState.Pressed)
        {
            catMovement.X += 1.0f;
        }
        if (currentKeyboardState.IsKeyDown(Keys.Up) ||
            currentGamePadState.DPad.Up == ButtonState.Pressed)
        {
            catMovement.Y -= 1.0f;
        }
        if (currentKeyboardState.IsKeyDown(Keys.Down) ||
            currentGamePadState.DPad.Down == ButtonState.Pressed)
        {
            catMovement.Y += 1.0f;
        }


        float smoothStop = 1;


        if (catMovement != Vector2.Zero)
        {
            catMovement.Normalize();
        }

        catPosition += catMovement * 10* smoothStop;

}

【问题讨论】:

    标签: c# xna


    【解决方案1】:

    在您的示例中,键盘按下可让您在 X 或 Y 方向上移动,或两者兼而有之。在 X 和 Y 的情况下,当您同时按下右和下时,您的移动是对角线的。但是,仅在 X 或 Y 中的运动会给你一个长度为 1 的向量,对角线向量比 1 长。也就是说,大约是 1.4(2 的平方根)。

    如果不对运动矢量进行归一化,那么对角线运动将比 X 或 Y 运动更快。归一化后,所有 8 个方向的速度都相同,我想这就是游戏所要求的。

    【讨论】:

      【解决方案2】:

      当您需要将某物在一个方向上移动多个单位时,向量归一化的一个常见用例。例如,如果您有一个游戏,其中实体 A 以 5 个单位/秒的速度向实体 B 移动,您将获得从 A 到 B 的向量(即B - A),您将对其进行归一化您只保持从 A 的角度朝向实体 B 的方向,然后将其乘以 5 个单位/秒。得到的向量将是 A 的速度,然后您可以简单地将其乘以经过的时间,以获得您可以移动对象的位移。

      【讨论】:

        【解决方案3】:

        这取决于你使用向量的目的,但如果你只是使用向量来给出方向,那么如果你的向量是单位长度的,那么许多算法和公式就会更简单。

        例如,角度:两个单位向量uv 之间的角度theta 由公式cos(theta) = u.v 给出(其中. 是点积)。对于非单位向量,您必须计算并划分长度:cos(theta) = (u.v) / (|u| |v|)

        一个稍微复杂一点的例子:将一个向量投影到另一个向量上。如果v是单位向量,则uv的正交投影由(u.v) v给出,而如果v是非单位向量,则公式为(u.v / v.v) v

        换句话说:如果你知道你所需要的只是方向并且你不确定向量是否已经是一个单位向量,则归一化。它对您有帮助,因为您可能最终会一直将方向向量除以它们的长度,因此您最好在创建向量并完成它时只做一次。

        编辑:我认为在您的示例中调用 Normalize 的原因是可以将速度方向与速度区分开来。在代码的最后一行,10 * smoothStop 是对象的速度,很容易知道。而要从速度中恢复速度,您需要乘以一个单位方向向量。

        【讨论】:

          【解决方案4】:

          您可以通过将每个分量除以向量的大小来归一化任何向量,向量的大小由分量平方和的平方根给出。然后每个分量的大小在 [-1, 1] 之间变化,并且大小等于 1。这是单位向量的定义。

          【讨论】:

            猜你喜欢
            • 2011-06-08
            • 2015-01-10
            • 2014-07-13
            • 2019-12-19
            • 2012-04-18
            • 2018-01-09
            • 2013-01-15
            • 2013-06-07
            • 1970-01-01
            相关资源
            最近更新 更多