27

» Unity / Класс с математикой

Hellfim, если код который я привел выше рабочий то лучше оставить его.
Потому что нормализация вектора это скрытый sqrt, магнитуда и т д. А тупо сделать три деления побыстрее. Я вот чем руководствуюсь.
В общем то проверим

Из первого поста Hellfim смекнулось, добавил пару формул вычисления детерминанта для плоскости и пространства
В общем вот такие функции вышли
    public static float Determinant2x2(float a, float b, float c, float d)
    {
        return a * d - b * c;
    }

    public static float Determinant2x2(float[,] i2xj2)
    {
        var m = i2xj2;
        return Determinant2x2(
            m[0, 0], m[0, 1],
            m[1, 0], m[1, 1]);
    }

    public static float Determinant3x3(float a11, float a12, float a13, float a21, float a22, float a23, float a31,
        float a32, float a33)
    {
        return a11*Determinant2x2(a22, a23, a32, a33)
             - a12*Determinant2x2(a21, a23, a31, a33)
             + a13*Determinant2x2(a21, a22, a31, a32);
    }

    public static float Determinant3x3(float[,] i3xj3)
    {
        var m = i3xj3;
        return Determinant3x3(
            m[0, 0], m[0, 1], m[0, 2],
            m[1, 0], m[1, 1], m[1, 2],
            m[2, 0], m[2, 1], m[2, 2]);
    }
27

» Unity / Класс с математикой

GeneralElConsul,
эт понятно, я уже вписал ее. Вот так же выходит, верно?
public static bool Straight(Vector3 a1, Vector3 a2, Vector3 b1, Vector3 b2)
{
    var a = (a2 - a1);
    var b = (b2 - b1);
    var c = new Vector3(a.x/b.x, a.y/b.y, a.z/b.z);
    return c.x.EqualsApprox(c.y) && c.y.EqualsApprox(c.z);
}
EqualsApprox - эт типа "приблизительно равно"
27

» Unity / Класс с математикой

двойное скалярное и двойное векторное произведение, а не тройное
а почему не тройное то? разницы нет никакой. Открываем гугл и узнаем что эти понятия эквиваленты. А на английском он называется Triple Product, что как бы намекает.
GeneralElConsul, сверить то можно, а вот как сделать так, чтобы узнать в какой точке это произошло? Формула выше как бы учитывает это тоже, там out параметрами возврат точки идет
27

» Unity / Класс с математикой

Развернутый вариант функции, проверяющей пересечения прямых в пространстве. В коде в самом ресурсе там тупо xyz перебираются циклом от 0 до 2.
public static bool Straight(Vector3 a1, Vector3 a2, Vector3 b1, Vector3 b2, out Vector3 result, out float t)
{
    var L1StartPoint = a1;
    var L2StartPoint = b1;
    var L1Direction = (a2 - a1).normalized;
    var L2Direction = (b2 - b1).normalized;
        
    result = new Vector3();
    t = -1;
        
    float A11 = L1Direction.x;
    float A12 = -L2Direction.x;
    float A21 = L1Direction.y;
    float A22 = -L2Direction.y;
    float B1 = L2StartPoint.x - L1StartPoint.x;
    float B2 = L2StartPoint.y - L1StartPoint.y;
    float t1, t2;
    float det = A11 * A22 - A12 * A21;
    if (Mathf.Abs(det) >= Mathf.Epsilon) // if det != 0
    {
        float d1 = B1 * A22 - A12 * B2;
        float d2 = A11 * B2 - A21 * B1;
        t1 = d1 / det;
        t2 = d2 / det;
        float temp1 = L1StartPoint.z + L1Direction.z * t1;
        float temp2 = L2StartPoint.z + L2Direction.z * t2;
        if (Mathf.Abs(temp1 - temp2) < Mathf.Epsilon)
        {
            result = new Vector3
            {
                x = L1StartPoint.x + L1Direction.x * t1,
                y = L1StartPoint.y + L1Direction.y * t1,
                z = L1StartPoint.z + L1Direction.z * t1
            };
            t = t1;
            return true; // if temp1 = temp2
        }
        return false;
    }
    A21 = L1Direction.z;
    A22 = -L2Direction.z;
    B2 = L2StartPoint.z - L1StartPoint.z;
    det = A11 * A22 - A12 * A21;
    if (Mathf.Abs(det) >= Mathf.Epsilon)
    {
        float d1 = B1 * A22 - A12 * B2;
        float d2 = A11 * B2 - A21 * B1;
        t1 = d1 / det;
        t2 = d2 / det;
        float temp1 = L1StartPoint.y + L1Direction.y * t1;
        float temp2 = L2StartPoint.y + L2Direction.y * t2;
        if (Mathf.Abs(temp1 - temp2) < Mathf.Epsilon)
        {
            result = new Vector3
            {
                x = L1StartPoint.x + L1Direction.x * t1,
                y = L1StartPoint.y + L1Direction.y * t1,
                z = L1StartPoint.z + L1Direction.z * t1
            };
            t = t1;
            return true; // if temp1 = temp2
        }
        return false;
    }
    A11 = L1Direction.y;
    A12 = -L2Direction.y;
    B1 = L2StartPoint.y - L1StartPoint.y;
    det = A11 * A22 - A12 * A21;
    if (Mathf.Abs(det) >= Mathf.Epsilon)
    {
        float d1 = B1 * A22 - A12 * B2;
        float d2 = A11 * B2 - A21 * B1;
        t1 = d1 / det;
        t2 = d2 / det;
        float temp1 = L1StartPoint.x + L1Direction.x * t1;
        float temp2 = L2StartPoint.x + L2Direction.x * t2;
        if (Mathf.Abs(temp1 - temp2) < Mathf.Epsilon)
        {
            result = new Vector3
            {
                x = L1StartPoint.x + L1Direction.x * t1,
                y = L1StartPoint.y + L1Direction.y * t1,
                z = L1StartPoint.z + L1Direction.z * t1
            };
            t = t1;
            return true; // if temp1 = temp2
        }
        return false;
    }
    return false;
}
Очень бы хотелось упростить эту функцию, знаю, такой способ наверняка есть. Точнее использовать более быстрый вариант нахождения такого пересечения.
27

» Программирование / Организация Undo/Redo

lentinant, так как бы снапшоты тоже укладываются в такое.
Скажем объект-действие "очистки" имеет:
  • инфу о том, что он очистил (снапшот)
  • метод undo (восстановление данных из снапшота)
  • метод do (сама процедура очистки)
27

» Программирование / Подменить DLL

Ну, это такое, пока что в принципе так и сделаю наверное. Если мне не дадут совет как-таки удалить.
27

» Game Dev / нужно вакансии

nvc123, а вот так
То есть в обычных форумах
Гораздо удобнее, имхо. Описание читают только если интересна вакансия. И ок.
27

» Game Dev / нужно вакансии

nvc123, а, эт не адекватный. Когда на пол экрана лого ресурсов вместо онли заголовков - уже не норм.
27

» Game Dev / нужно вакансии

nvc123, что? отменить премодерацию через метки? Кинь скрин плиз, как это делается, если такое реально есть, то это всё меняет :О
насколько я со всем этим знаком - премодерация распространяется на весь проект (точнее на группы юзеров). Либо ставится, либо снимается. В этом собственно и проблема.
27

» Game Dev / Запекание ячеек в поиске пути

Kozinaka, да есть + сами юниты динамичные, меняют проходимость.
В общем то приценился на дальнейшими действия. Сейчас попробуем-с, по надобности обновим сабж. Решил-таки попробовать еще раз в эвристику.
А в целом наверное так и выходит, что запекание в глубину как раз даст то самое "(N*Log(N)) количество данных" или близкое к этому, на этом пока что и закончим
27

» Cinos WIP блог / Привет, армия

Андреич:
кто-то уходит раньше, кто-то позже... все мы там окажемся...
Не надо мне угрожать :D Успешно там не появляюсь.
Cinos, удачи там, хз как еще написать. Но зря ты туда собрался
27

» Game Dev / нужно вакансии

ScorpioT1000, есть два формата в текущем виде
1 - зафигачить в add (так уже пробовали, спасибо). Минус уйма. Начиная с обязательной премодерации подобного, заполнением каких-то лого и отсутствием нормального адекватного способа посмотреть объем новых вакансий
2 - зафигачить комментами (как сейчас). Минусов опять уйма. Нельзя редактировать многим после, нельзя адекватно посмотреть объем новых вакансий.
Оба способа отвратительны. Я просто сделал тот способ, который не будет тормозиться онлайном менеджеров/модераторов. Так что ждем, пока что-то изменится, а пока пользуемся этим.
27

» Game Dev / Запекание ячеек в поиске пути

Kozinaka, ты построил навмеш в плоскости, грубо говоря. Основное правило навмеша - обеспечение 100% проходимости в рамках определенной области. Ну и области на пересечениях "стыкуются". Хотя тут у тебя есть хитрость, получается несколько уровней под просчет путей.
Но у меня тут немного другая история. Я пробовал генерировать навмеш под свои нужды, но он выходит весьма накладным в плане производительности.
Затем я думал заюзать эвристический алгоритм. Но как ты можешь увидеть на скрине ниже - у меня многоуровневый ланд, потому хорошего способа юзать эвристику не нашел.
Вот и подумал что не лучше бы в запекание. Места "стыков" у поверхностей часто не однозначны (особенно там, где стыки поверхностей выражены несколькими точками).
Потому и надумал - запекать всю карту неразрывно.
Большую карту опять же сделать не могу - в этом случае препятствия, существующие диагонально будут иметь очень кривую проходимость. А мне нужно не мир подстроить под алгоритм, а наоборот, алгоритм под мир.
Или я неправильно понял, что ты имел ввиду
В общем и не знаю что и делать. В идеале хотел конечно поиск по рукавам юзнуть, и будь что будет. Но есть много разных вариантов, которые я не смог проработать на многоуровневом поиске, в частности как детектить правильные препятствия и как быстро находить переход на другой этаж.
Загруженные файлы
27

» Game Dev / Запекание ячеек в поиске пути

alexprey, я гипотетически привел в пример поле 100 на 100, чтобы показать масштабы, в которых происходит запекание. Вот будет поле скажем 1000 х 1000 - 1000000 ячеек сохранено. А я тут даже ошибся чутка. Ведь сама экспоненция уже будет 1000000*1000000 - чисто ради запекания. Это несоизмеримо много. Ну не ок же. Потому и спрашиваю, мб есть какие-то фишки/трюки, чтобы сделать как бы почти тоже самое, но хранить меньше данных.
27

» Game Dev / Запекание ячеек в поиске пути

alexprey, конкретно моя задача - статичное запекание, которое делается не в игре, а еще в редакторе. То есть где позволительно тратить неприлично большие силы на просчет чего-либо.
Вопрос лишь в том, чтобы хранить меньше данных при хотя бы чуток схожем КПД (О(1))
27

» Game Dev / Запекание ячеек в поиске пути

PhysCraft, принято запекать чтобы не обсчитывать пути постоянно на локациях с большим количеством юнитов и высокой частотой расчетов. Таким образом скорость нахождения пути равна О(1), а не О(N)
27

» [Gameвoom] Иная Новогодняя Сказка / Отчёт №2

Marauder:
сразу проспоришь) а с чего ты взял?
Брат левша, почерк очень похож. Так и вижу как эти буковки пишутся левой рукой. Есть у левшей какая-то "своя" неуклюжесть в почерке
27

» Unity - Triggers Editor / 99%

ScorpioT1000, ну, у меня выйдет все-таки попроще, ибо пока что лень сильно заморачиваться. Просто сделаю перенос если длина выше определенной.
27

» Unity - Triggers Editor / 99%

ScorpioT1000, просто такие линейки, они в остальной интерфейс легче вклиниваются.
Могу сделать две версии переключателем каскад/линия. Пойдет?
27

» Unity - Triggers Editor / 99%

ScorpioT1000, Меня тоже много что там смущает. В частности что сейчас не всегда понятно что откуда. Есть конкретные предложения по улучшению?
27

» Unity - Triggers Editor / 99%

alexprey:
так а как они показываться то будут? Меня вот это интересует
Приблизительно так. В попапе первую строку только поправлю
Загруженные файлы
27

» Unity - Triggers Editor / 99%

забыл скриншот :(
я ниже текстом написал, говорю ж, не могу пока вывести ) Вечером накину скриншот.