Vector3.magnitude и vector3.normalized объяснение - PullRequest
0 голосов
/ 07 мая 2018

Я смотрю на этот код и не знаю, что делают 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? </p>

Спасибо.

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Vector3.magnitude возвращает число с плавающей запятой, его одномерное значение выражает длину вектора (поэтому он теряет информацию о направлении)

Vector3.normalized - это немного противоположная операция - она ​​возвращает направление вектора, гарантируя, что величина результирующего вектора равна единице (она сохраняет информацию о направлении, но теряет информацию о величине).

Эти два часто полезны, когда вы хотите разделить эти два способа взглянуть на вектор, например, если вам нужно иметь влияние между двумя телами, где влияние обратно пропорционально расстоянию между ними, вы можете сделать

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

это наиболее типичный вариант использования для меня, я не уверен, что автор оригинального кода имел в виду под его, так как кажется, что он мог просто использовать разность векторов, не используя два дополнительных вызова

Mathf.Clamp возвращает значение value, лежащее между min и max, возвращает min, если его меньше, и max, если больше.

Другая интересная особенность 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);
}
0 голосов
/ 07 мая 2018

Вектор можно рассматривать как направление и расстояние (хотя обычно он выражается в виде суммы по каждой оси; например, +3 на x и -4 на y будет иметь величину 5). Нормализованный вектор имеет величину 1, поэтому он просто направление (+ 0,6, -0,8 для примера + 3, -4); Величина говорит вам оригинальную часть расстояния. Затем вы можете умножить нормализованный вектор (направление) на любую величину, чтобы выразить "идти это далеко в это направление". В этом случае они кажутся движущимися на 4 единицы (maxDistance) в том же направлении, что и исходный вектор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...