Как выровнять ENT по линии горизонта? РЕШЕНО.

Тема в разделе "Программирование / Скриптинг", создана пользователем tonline_kms65, 17 окт 2016.

Статус темы:
Закрыта.
  1. tonline_kms65

    tonline_kms65 Read Only

    Сообщения:
    77
    Симпатии:
    10
    Снова всем здравствуйте.
    Очередной вопрос - как можно выровнять ENT относительно "линии горизонта" без трассировок, как можно проще.
    Какие существуют методики? Я понимаю что можно выровнять и относительно "земли", но интересно именно по горизонту.
    Есть у кого какие идеи? Может быть к координатам центра карты можно как-то прицепиться?
     
  2. Reiko1231

    Reiko1231 AlexTheRegent

    Сообщения:
    238
    Симпатии:
    569
    Такие вопросы всегда стоит дополнять рисунком, иначе "линия горизонта" может трактоваться во многих смыслах. Линия горизонта - это линия, по которой небо кажется граничащим с поверхностью Земли.
    Исходя из этого, можно предположить, что вам надо расположить объект всегда перпендикулярно земле, независимо от угла наклона поверхности. Углы в игре задаются в связанной системе координат, что существенно упрощает эту задачу. Вам необходимо лишь обнулить одно из значений вектора угла. Какое именно, подсказать не смогу, но, думаю, перебрать три варианта не составит труда.
     
  3. tonline_kms65

    tonline_kms65 Read Only

    Сообщения:
    77
    Симпатии:
    10
    Спасибо конечно за ответ.
    Смотри. У нас не планета земля. Если не умничать и смотреть проще то
    небо сделано просто кубом (скайбоксом)
    Значит линия горизонта здесь простая - 4 грани скайбокса. И выравнивание простое либо по горизонту либо по небу или земле. Я хотел бы получить возможность привязки к нулевым координатам карты. Это был бы самый правильный вариант. Мне так кажется.
    Но возможно есть еще варианты.
     
  4. Reiko1231

    Reiko1231 AlexTheRegent

    Сообщения:
    238
    Симпатии:
    569
    Не могу себе представить, как линию горизонта можно описать с помощью четырех граней. Для меня линией горизонта можно назвать одну из двух граней - либо нижняя (ABCD), либо верхняя (A1B1C1D1), но никак не четыре сразу.
    [​IMG]
    Как я уже говорил об этом, для этого достаточно обнулить одну из координат угла. Тогда, каким бы не был угол наклона поверхности, объект будет расположен всегда параллельно одной прямой.
    20161017160500_1.jpg 20161017160512_1.jpg

    Прикладываю код этого плагина, который по команде sm_halign создаст предмет, параллельный плоскости ABCD.
    Если же это не то, что нужно, то опишите вашу задачу с помощью рисунков.
     

    Вложения:

  5. Grey83

    Grey83

    Сообщения:
    362
    Симпатии:
    104
    PHP:
    float ang[3];
    GetEntPropVector(entProp_Data"m_angRotation"ang);
    ang[0] = ang[2] = 0.0;
    SetEntPropVector(entProp_Send"m_angRotation"ang);
    Ось ang[1] - это поворот относительно вертикальной оси.
    Правда в игре используются Эйлеровы углы для поворота предметов.
     
  6. tonline_kms65

    tonline_kms65 Read Only

    Сообщения:
    77
    Симпатии:
    10
    @Reiko1231,
    Спасибо что отвечаешь так подробно.
    Грани куба я привел для примера, что бы было понятно о чем речь.
    По идее можно именно от этих граней сделать трассировку и выравнивать именно по брашам карты (планам). Я правда этот вариант не пробовал. Думаю он малопригоден. Ориентация будет жестко привязана. Насчет твоего примера - он подойдет для статичной модели. Раз создал и всё. У меня модель физическая - управляемая игроком. Это я всё про своего Дрона.
    Пример - в Дрона выстрелили - от выстрела Дрона разворачивает, в зависимости от силы и вектора попадания. Если зажать координату то дрон будет просто летающим статиком. Его, уже не сдвинешь с места. Все управление будет только от игрока.
    У меня проблема в потере управления Дроном, если Дрон например ударился о стену, или взрывной волной его задело, управление теряется напрочь, выровнять Дрона очень сложно. Я сделал как бы автопилот, но он работает медленно, и пока это не то что хотелось бы.
    Теперь о зажимании какого либо вектора. У нас их 3. Если зажать к примеру вертикаль, то модель потеряет управление от игрока по вертикали, ну и т.д. А потеря управления по оставшимся 2 векторам останется.
    Т.е. если мы зажали например ось Z, то модель все равно может произвольно вращаться по оси Х и оси У. При этом управление от игрока по оси Z утраченна т.к. эта ось зажата. Ну и т.д.
    Я сейчас в дороге. Приеду домой - покажу на примере.
    Вот пример, в самом конце видео Дрон кидает гранату и его задевает взрывной волной, управление теряется и Дрона начинает крутить.

    Если взять на примере кватерниона, я бы например все вектора модели запаял бы в матрицу и управлял бы уже матрицей (кватернионом) так как мне нужно, при этом возможность управлять моделью внутри матрицы, так же по 3 векторам остается.
    Не знаю понятно объяснил или нет. Ну как то так.
    Здесь такой вариант я думаю маловероятен. Это не DirectX. Вот поэтому и остается что то мудрить. Более менее вариант с векторами (трассировкой), я его при вызове Дрона использую, но этот вариант сложноват и наверняка добавит кучку лагов на сервак. Хотелось бы что нибудь попроще.

    Вся проблема у меня именно из за потери управления Дроном. И невозможности это управление сразу восстановить. Начинает его крутить-вертеть. Аж бесит иногда.
     
    Последнее редактирование: 18 окт 2016
  7. Grey83

    Grey83

    Сообщения:
    362
    Симпатии:
    104
    И вроде как можно назначать тип движения SetEntityMoveType(entity, MOVETYPE_FLYGRAVITY); как в плагинах джетпаков (или у тебя так и есть?).
    Т.е. разработчики дрона забыли о такой элементарной вещи, как центр тяжести и не поместили его насколько можно ближе к дну пепелаца?
    Или ты имеешь в виду вращение вокруг вертикальной оси?
    Попробуй добавить таймер, который будет проверять вертикальную ось пепелаца, если она недостаточно вертикальна, то таймер будет автоматически выравнивать наклон по n градусов в секунду, пока пепелац не станет ровно.
    При полёте вперед/назад/вбок, можно слегка наклонять тем же таймером пепелац в сторону движения (имитировать полёт вертолёта) в зависимости от того как долго игрок жмёт кнопку направления движения.
    А про кватернионы ты правильно: только так поборешь шарнирный замок.
     
  8. tonline_kms65

    tonline_kms65 Read Only

    Сообщения:
    77
    Симпатии:
    10
    Я кстати это не пробовал. Надо будет попробовать. Модель то физическая.
    Хотя в принципе ей движение задавать ни к чему. Она сейчас законам гравитации (движка) подчиняется. Но попробую.

    Вращение по произвольным осям, причем вместе взятым.

    Какой центр тяжести? Поподробнее если можно. Интересная мысль. Разработчик этого Дрона все-таки я. А так похоже на то, что у модели действительно нет веса. Хотя я вес самой модели задал
    phis.jpg
    mass 30 кг. Масса этого Дрона 30 кг. у меня задана. На скрине неправильно написал - не задаются а заданные свойства.
    root.jpg
    Для этой кости есть возможность сделать вес? Что то новенькое. По идее, если на неё добавить вес, то да - можно выровнять Дрона в полете.
    Только как это сделать.
    --- Добавлено позже ---
    Очень интересно. Смотри что получается. Я сгенерировал в .qc файл модели (для модели столкновений (физбокса)):
    Код:
    $collisionmodel "reference_phis.smd"
    {
        $concave
        $mass 30.0
        $inertia 5.30
        $damping 0.30
        $rotdamping 1.05
    }
    После компиляции модели получил очень интересный результат. При ударе о стены или об игрока модель уже не крутит как .... материться не будем. Крутит, но модель устойчивее процентов на 80. Управляемость Дрона не изменилась абсолютно.
    Спасибо за подсказку. Сейчас нужно поиграть с параметрами физбокса модели.
    Явно что это оно и есть - искомое.
    --- Добавлено позже ---
    Да.
    Это ОНО самое.
    @Grey83, спасибо за то что натолкнул на мысль. А то так и возился бы с этим sourcepawn'ом по беспонту. Зациклился на нем уже.
    Вывод такой - SourcePawn при работе с 3D моделями жестко связан с параметрами самой 3D модели. Уже какой раз убеждаюсь в этом.
    --- Добавлено позже ---
    Уже пора на этом форуме знающим людям начать писать уроки о создании 3D моделей и связи этих моделей с языками программирования.
    Или вернее так - зависимости языков программирования от свойств 3D модели. Особенно моделей обладающих физическими свойствами.
    Это примерно так - невозможно дать команду, например бабочке пощелкать клювом, у неё нет клюва.
     
    Последнее редактирование: 19 окт 2016
  9. Terminator-ws

    Terminator-ws

    Сообщения:
    55
    Симпатии:
    20
    Это просто - шедевр!

    Оффтоп
     
  10. Reg1oxeN

    Reg1oxeN

    Сообщения:
    87
    Симпатии:
    26
    несете какую-то ахинею. вы оба явно стоите друг друга.


    насчет изменения массы можно посмотреть здесь
    VPhysics - AlliedModders
    ф-я Phys_SetMass(entity, Float:mass);
     
    White Wolf и inklesspen нравится это.
  11. tonline_kms65

    tonline_kms65 Read Only

    Сообщения:
    77
    Симпатии:
    10
    Старый модуль, не работает уже.
     
    AlmazON нравится это.
Статус темы:
Закрыта.