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
, определенный здесь)