Vector3.magnitude和vector3.normalized解释

时间:2018-05-07 10:24:54

标签: c# unity3d

我正在查看此代码并且不知道这个magnitudenormalized正在做什么以及这个人如何使用它们。在文档中只有很少的东西,但它没有解释太多。

我正在看的代码是:

public float minDistance = 1.0f;
public float maxDistance = 4.0f;
public float smooth = 10.0f;
Vector3 dollyDir;
public Vector3 dollyDirAdjusted;
public float distance;

void Awake()
{
    dollyDir = transform.localPosition.normalized;
    //What has he got with this? Documentation says Returns this vector with
    //a magnitude of 1 so if i get it it return's it's length as 1. So what is the point?

    distance = transform.localPosition.magnitude;
    //Have no idea what he got with this
}
void Update()
{
    Vector3 desiredPos = transform.parent.TransformPoint(dollyDir * maxDistance);
    //I know what TransfromPoint does but what is he getting with this dollyDir * maxDistance

    //Some other code which i understand
}

我在这里,如果有人能解释我Mathf.Clamp

clamp的文档非常清楚,我得到的是我给出了顶部和底部值1 and 5,如果我设置value = 3,它将返回3,但是如果我设置了值> 5它将返回5并且如果我设置值< 1它将返回1?

感谢。

2 个答案:

答案 0 :(得分:5)

Vector3.magnitude返回一个浮点数,它是表示向量长度的单维值(因此它会丢失方向信息)

Vector3.normalized是一个相反的操作 - 它返回向量方向,保证结果向量的幅度为1(它保留方向信息但丢失幅度信息)。

当你想要分离这两种看向量的方式时,这两种方法通常很有用,例如,如果你需要在两个物体之间产生影响,其影响与它们之间的距离成反比,你可以做

float mag=(targetpos-mypos).magnitude;
if (mag<maxRange)
{
Vector3 dir=(targetpos-mypos).normalized;
Vector3 newVector=dir*(maxRange-mag);
}

对我来说这是最典型的用例,我不确定原始代码的作者是什么意思,因为它看起来似乎只能使用向量差异而不使用两个额外的调用

Mathf.Clamp返回值的值介于最小值和最大值之间,如果值较低则返回min,最大值if则更大。

Vector3的另一个有趣特性是sqrMagnitude,它返回^ 2 + b ^ 2 + c ^ c而不计算平方根。虽然它增加了代码的复杂性(你需要将它与平方距离进行比较),但它节省了相对昂贵的根计算;略微优化但稍微难以阅读的版本看起来像这样

Vectior3 delta=targetpos-mypos;
if (delta.sqrMagnitude<maxRange*maxRange)
 {
  Vector3 dir=delta.normalized;
  Vector3 newVector=dir*(maxRange-delta.magnitude);
}

答案 1 :(得分:1)

矢量可以被认为是方向和距离(尽管它通常表示为每个轴中的量;例如, x 上的+3和 y上的-4 < / em>的幅度为5)。归一化向量的大小为1,因此只是方向(对于+ 3,-4示例,+ 0.6,-0.8);幅度告诉你原始距离部分。然后,您可以将标准化矢量(方向)乘以任何幅度,以表示 方向&#34; 。在这种情况下,它们似乎在与原始向量相同的方向上移动4个单位(maxDistance)。