Unity Mathf не на 100% заменяет его дружественный к взрыву Unity.Mathematics . Также Unity.Mathematics постоянно развивается. К настоящему моменту, когда вы читаете это, что-то могло измениться.

Quaternion доступен для использования в рабочих местах

quaternion введите его маленькими q вот так. Это в Unity.Mathematics

Отличие LookRotation

Это результат того же ввода:

Quaternion.LookRotation (с Vector3)

Look (-1.6, 61.3, 162.4) Up (0.5, -0.9, 0.0) QuatWXYZ -0.2552253 0.04192121 0.1746541 0.9500519

Unity печатает Vector3 вот так, но на самом деле число находится в позиции с плавающей запятой и содержит больше цифр.

quaternion.LookRotation (с float3)

Look float3(-1.648314f, 61.3083f, 162.3523f) Up float3(0.4771588f, -0.8788171f, 0f) QuatWXYZ -0.2451455 0.04013683 0.172545 0.9387675

Разница :

Mathf -0.2552253 0.04192121 0.1746541 0.9500519
math. -0.2451455 0.04013683 0.1725450 0.93876750

На самом деле это потому, что математики ожидают нормализованного вектора! (Никакой документации или чего-либо вообще!)

quaternion.AxisAngle ожидает радиан

Не будь глупым, как я, и думай, что «угол» = градус.

Где InverseLerp?

Здесь он называется unlerp. Но! Реализовано без проверки зажима и деления на 0.

Mathf работает так

public static float inverseLerp(float a, float b, float value)
        {
            if (a != b)
                return math.clamp((value - a) / (b - a), 0, 1);
            else
                return 0.0f;
        }

Unity.Mathematics работает так

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static float unlerp(float a, float b, float x) { return (x - a) / (b - a); }

Поэтому, если вы используете a = b, он взорвется, если вы используете x за пределами диапазона 0 ~ 1, он линейно интерполируется за пределами a и b.

Отличие SmoothStep

Меня раньше обманывали, определение последнего аргумента не то же самое. То есть он не подлежит 100% замене.

  • Unity.Mathematics: сначала интерполируется перед зажимом, ожидается, что значение x будет между значениями края a~b, а не 0~1.
  • Mathf : он фиксируется первым, ожидается, что значение t будет между 0~1, а затем плавно сопоставляется с from~to.

Smoothstep языка шейдеров работает так же, как версия Unity.Mathematics.

К вашему сведению, вход 0~1 — это то, как функция Lerp / lerp универсально работает с языком шейдеров или нет. SmoothStep в старом Unity похож на лерпа (а не на школьных идолов). Новый smoothstep больше соответствует общему определению.

math.select(a, b, bool)

Как вы думаете, какой из них вы получите, если логическое значение истинно? Раньше я думал, как bool ? a : b, но в обратном порядке. Это не правильно. Не уподобляйтесь мне и тратьте 2 часа на поиск багов из-за этого.

На самом деле, если логическое значение ложно, вы получаете первое. Хороший способ рассуждать об этом состоит в том, что он «выбирает» с помощью битового сравнения. 0 предшествует 1, а false равно нулю, поэтому вы получаете первый. Думайте об а и b не как об истинном и ложном, а как о первом и втором.

Как получить только один bool из оператора ==?

Я сравнивал int2 с int2 и думал, что он вернет один bool, но нет, это сравнение по компонентам, и независимо от того, что я делаю, он возвращает bool2

Чтобы получить только bool, вам нужно использовать Equals

(int2 равно IEquatable<int2>, но это не обязательно означает, что == будет использовать метод Equals, определенный здесь)