Нам часто нужно из точек сделать меш, чтобы потом отрисовать его.

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

Суть означает то, чтобы на выходе получить треугольники (как следует из названия) из точек. А для создания мешков нам нужны вертексы (те самые точки) и индексы (поскольку именно эти точки определяют треугольники).

Читать далее  

Это приведение к единичному размеру, при этом направление сохраняется. Обычно мы используем для этого v.normalized или v.Normalize(). Второй вариант будет немного быстрее первого, т.к. мы не создаем копию вектора, а изменяем существующий.

Но как оно работает внутри? Как нетрудно догадаться из определения нормализации, чтобы привести вектор к единичному - нам нужна его длина, а длина вектора - это корень по теореме Пифагора. Поэтому если вы по какой-то причине уже получили длину вектора, то просто поделите (ну поделите, ага https://t.me/unsafecsharp/150):

var inv_length = 1f / length;
v.x *= inv_length;
v.y *= inv_length;

И получите нормализованный вектор.

А то я часто встречаю примерно такой код в хот частях:

var length = v.magnitude;
var n = v.normalized;

Хотя на деле проще было бы просто получить длину один раз и использовать ее дважды (ну или сделать свой метод для этого).

Читать далее  

Давайте сначала разберемся, что такое Лерп. Это линейная функция, которая задается двумя точками B и C (см изображение), третье значение t — это как значение между 0 и 1, где 0 — это B, а 1 — это C.

Таким образом получается, что перемещение по линии - это и есть lerp или интерполяция. А вот LerpUnclamped - это экстраполяция, т.е. когда мы не обрезаем значение t до 0..1.

 б + (с - б) * зажим01(т);

Т.е. по сути мы сначала меняем набор координат на ноль (c - b), а потом умножаем получившийся вектор на t, а после постепенно набираемый вектор назад.

С разжатым зажимом мы просто не делаем операцию, тем самым мы можем дать результат выезду за границу Британской Колумбии.

Читать далее  

Надеюсь, вы все в курсе, что операция делегирования является гораздо более медленной операцией умножения. Если нет, то имейте ввиду.

Я часто встречаю вот такой код:

 а += б/2ф;

И мне все время такое хочется, напиши такой код:

 а += б * 0,5f;

Также можно заменить любые другие константы по тому же принципу. Но что делать, если у нас разделение не на константу, а на x? Да все просто, делаем y = 1f / x и используем уже y.

Читать далее  

Довольно простой вопрос, который решается банальной проверкой (v2.sqrMagnitude <= radius * radius). Мы такой вопрос часто задаем на собесах, но не только для того, чтобы выяснить считает ли человек через квадрат радиуса, а скорее для того, чтобы задать второй вопрос: "а в эллипс?". И вот на этом вопросе люди начинают сами себя закапывать. Кто-то придумывает несуществующие правила и теоремы, кто-то говорит, что мол "да я это не помню, там высшая математика, кому это вообще надо", ну а кто-то предлагает решение.

А самое интересное, что решение довольно простое, которое не требует никаких знаний и формул:

Изменяем Y проверяемой точки на фактор соотношения Rx к Ry, а дальше проверяем на попадание в радиус Rx. То есть мы вытягиваем эллипс таким образом, чтобы он стал кругом и считаем уже относительно круга.

Читать далее  

Catmull rom — это такая кривая, для построения которой нужно знать 4 точки. Особенность заключается в том, что кривая будет проходить через все 4 точки.

На примере мы такое часто используем, т.к. Для строительства, например, Безье требуются тангенты, расчет которых иногда затруднен.

Читать далее  

Cross Product (векторное произведение) - по сути это способ нахождения нормали. Если у нас есть 2 вектора, то эти два вектора так или иначе образуют плоскость. Так вот Cross дает нам нормаль этой плоскости. Направление этой нормали (она же может смотреть как вверх, так и вниз) зависит от порядка этих векторов, т.е. если Cross(a, b), то нормаль смотрит вверх (как на картинке). Если же Cross(b, a), то нормаль будет смотреть вниз. Можно запомнить по так называемому правилу "правой руки":

Есть еще несколько свойств, которые мы получаем, подробнее можно почитать, например, в википедии или https://en.wikipedia.org/wiki/Cross_product.

Dot Product (скалярное произведение) - по сути способ определить угол между векторами. Формула довольно простая: x1*x2 + y1*y2 + z1*z2. То есть мы складываем произведения по каждой из осей. Окей, что нам это дает? Можно запомнить, что по сути это дает нам косинус угла между векторами, если они нормализованы (т.е. длина вектора единица), т.е. acos(dot(a, b)) дает нам угол.
Подробнее тут или https://en.wikipedia.org/wiki/Dot_product.

Да, это далеко не полный перечень того, что можно получить, но я же пытаюсь объяснить "простыми словами" :)

Читать далее  

Довольно часто мы пишем в коде подобные штуки: direction * deltaTime * 2f 

Фактически мы умножаем Vector direction на float и на какой-нибудь мультипликатор, например, 2. На самом деле лучше писать вот так:

direction * (deltaTime * 2f) 

Т.к. в таком случае операций умножения для вектора будет одна вместо двух.

Читать далее  

Я часто встречаю в различных проектах первый вариант при поиске ближайшей цели, например. Уж не знаю, почему так получается, но, наверное, люди не особо вникают в то, как это работает.

sqrMagnitude внутри: x*x + y*y + z*z

Вектор3.Расстояние внутри: sqrt(x*x + y*y + z*z)

В sqrMagnitude по результатам Пифагора мы вычисляем расстояние между точками, тут все просто.

Но когда мы можем использовать sqrMagnitude? Самое банальное: проверка расстояния, когда точка высчитывает расстояние одинаково. Получается, что корень считает, что у нас нет никаких потребностей, если нам нужно найти ближайший объект или, например, определить, находится ли юнит в радиусе для выстрела.

Читать далее  

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


Читать далее  

КЭШ - это Oriented Bounding Box, это такой Rect с поворотом, но в 3D

Читать далее