我正在查看此代码并且不知道这个magnitude
和normalized
正在做什么以及这个人如何使用它们。在文档中只有很少的东西,但它没有解释太多。
我正在看的代码是:
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?
感谢。
答案 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
)。