XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Желтая пресса: обучающие статьи
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

 
NCrashed

offline
Опыт: 13,553
Активность:
Исправлены указанные выше косяки и добавлен раздел "Добавляем физические явления (удар об землю, трение и т.п.)"
Старый 08.09.2009, 00:18
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
не путай с body.create() это разные функции
Для этого можно статический конструктор обозвать new, например )
А статья теперь весьма хорошая. Думаю, можно добавлять в базу.
Старый 08.09.2009, 01:48
NCrashed

offline
Опыт: 13,553
Активность:
Для этого можно статический конструктор обозвать new, например )
Van_Damm, хоть и пишу я на делфях, так и не привыкну к функции new
перегрузил бы метод и все норм было бы, а в vJass такого не нашел
А статья теперь весьма хорошая. Думаю, можно добавлять в базу.
Я ее закончил, если замечаний больше нет, добавляйте
Старый 08.09.2009, 07:38
adic3x

offline
Опыт: 108,439
Активность:
Например? Очень-очень не надо, ибо чрезмерная оптимизация здесь вредит пониманию материала
вопрос спорный, можно сначала изложить математику, а потом просто показать как ее применять
все описанное тут совершенно верно с точки зрения ооп, но например постоянная аллокация и удаление 3 векторов - время, трата которого ничем не обоснованна
Ну решил я не путать народ и начать с 1 ячейки.
этим ты как раз и путаешь народ
Старый 08.09.2009, 15:48
NCrashed

offline
Опыт: 13,553
Активность:
В этой статье я рассказывал про удобства, которые дает vJass, а за удобство нужно платить.
Не нужно разжигать древний спор "удобство vs скородействие и малый вес " =)
этим ты как раз и путаешь народ
не факт, так как иначе первому телу будет соответствовать sb[0], смещение на 1. + тогда надо будет в циклах идти до si - 1, лучше оставить нулевой элемент в покое.
Старый 08.09.2009, 18:00
Daemonik

offline
Опыт: 5,084
Активность:
ADOLF:
Ну решил я не путать народ и начать с 1 ячейки.
этим ты как раз и путаешь народ
Согласен с этим, тк статья для самых новичков не предназначена. А не новички могут запутаться.
Старый 08.09.2009, 18:02
NCrashed

offline
Опыт: 13,553
Активность:
Ладно сделаем с нулевым элементом, уж лучше не спорил =)
Старый 08.09.2009, 20:27
adic3x

offline
Опыт: 108,439
Активность:
всю жизнь во всех нормальных языках индексирование было с 0, опять же проверять на 0xffffffff при необходимости, а что, я всегда так делаю
Старый 08.09.2009, 20:38
NCrashed

offline
Опыт: 13,553
Активность:
Как ни странно я тоже так всегда делаю ^^, только здесь решил отойти от традиции. Исправлено и карта перезалита.
Старый 08.09.2009, 20:42
Sebra

offline
Опыт: 5,603
Активность:
NCrashed:
Если движок находит удалённое тело, то передвинутое для заполнения дырки пропустит квант времени.
Исправим вставкой строки "set i = i - 1"
Уж лучше бы set i=i+1 передвинул вверх за else.
Не отслеживается падение на землю, но это уже мелочь.
В карте-примере отслеживаются и границы карты
Падение отслеживаешь только по z<2.
Совершенно не учитывается ландшафт.
Добавил сухое трение - вышло отвратительно.
Подучи физику.
  1. Вектор силы не всегда вдоль земли.
  2. Сила трения вдоль поверхности против скорости пропорционально реакции опоры.
  3. Сила трения меньше максимума только если тело покоится.
Правь!
Старый 10.09.2009, 13:42
Gomorrah

offline
Опыт: 257
Активность:
жаль что прыгает не туда куда надо, а туда куда всегда
Старый 10.09.2009, 16:29
NCrashed

offline
Опыт: 13,553
Активность:
Уж лучше бы set i=i+1 передвинул вверх за else
Тогда на любом теле движок будет зацикливаться, уж лучше так.
Падение отслеживаешь только по z<2.
z[0,+беск] по опыту лучше отслеживать не z = 0, а z < 1-2
Совершенно не учитывается ландшафт.
Это обучающая статья, а обсчет силы реакции опоры требует больше теории. Эту функцию просто счас вставлю из fdl.
Добавил сухое трение - вышло отвратительно.
Подучи физику.
  1. Вектор силы не всегда вдоль земли.
  2. Сила трения вдоль поверхности против скорости пропорционально реакции опоры.
  3. Сила трения меньше максимума только если тело покоится.
А вот это не надо! В физико-математическом лицее учусь.
  1. Это, конечно, правильно, но если не заметил, то сила трения у меня направлена против вектора скорости.
  2. Я сделал упрощение, чтобы каждый раз не считать угол наклона плоскости и потом проектировать тангенсальную составляющую силы. То есть я считаю трение, пропорциональным нормальной реакции опоры, если бы тело лежало на не наклонной плоскости.
  3. Опять промазал ), если сила, действующая на тело меньше максимальной силы трения, то тело тормозит или покоится. Иначе складываем вектора силы трения и равнодействующей для тела.
Реализация трения тут соответствует теории (кроме этого упрощения, расчетов в 2 раза меньше, а разница не заметна)
жаль что прыгает не туда куда надо, а туда куда всегда
Этот кусочек статьи был вырезан, так как там уже сложные расчеты. Эх, сейчас вставлю...
Старый 10.09.2009, 17:39
Gomorrah

offline
Опыт: 257
Активность:
Код:
private function Engine takes nothing returns nothing
     ...
    local rect r = bj_mapInitialPlayableArea
     ...
                // Границы карты
                if GetUnitX(b.u) < GetRectMinX(bj_mapInitialPlayableArea) then
                    call SetUnitX(b.u,GetRectMinX(bj_mapInitialPlayableArea))
                elseif GetUnitX(b.u) > GetRectMaxX(bj_mapInitialPlayableArea) then
                    call SetUnitX(b.u,GetRectMaxX(bj_mapInitialPlayableArea))
                endif
                if GetUnitY(b.u) < GetRectMinY(bj_mapInitialPlayableArea) then
                    call SetUnitY(b.u,GetRectMinY(bj_mapInitialPlayableArea))
                elseif GetUnitY(b.u) > GetRectMaxY(bj_mapInitialPlayableArea) then
                    call SetUnitY(b.u,GetRectMaxY(bj_mapInitialPlayableArea))
                endif
      ...

зачем ты обьявлял локалку рект?
Старый 11.09.2009, 11:52
adic3x

offline
Опыт: 108,439
Активность:
зачем кстате вообще юзать сравнение, еще и не с реал константами, а каждый раз звать функцию?
Старый 11.09.2009, 15:56
ZeToX2007

offline
Опыт: 7,009
Активность:
Лично я не юзаю структуры для движение, для создание и уничтожение требуется определённое время... куда быстрей юзать - GetUnitUserData и несколько масивов. ии ещё...


Цитата:
Сообщение от NCrashed
if GetUnitX(b.u) < GetRectMinX(bj_mapInitialPlayableArea) then
call SetUnitX(b.u,GetRectMinX(bj_mapInitialPlayableArea))
elseif GetUnitX(b.u) > GetRectMaxX(bj_mapInitialPlayableArea) then
call SetUnitX(b.u,GetRectMaxX(bj_mapInitialPlayableArea))
endif
if GetUnitY(b.u) < GetRectMinY(bj_mapInitialPlayableArea) then
call SetUnitY(b.u,GetRectMinY(bj_mapInitialPlayableArea))
elseif GetUnitY(b.u) > GetRectMaxY(bj_mapInitialPlayableArea) then
call SetUnitY(b.u,GetRectMaxY(bj_mapInitialPlayableArea))
endif


Что я говорил про это ? заменяй на переменные, и функция GetUnitX взывается не один раз, поэтому будет выгодней её занести в переменную.
Старый 14.09.2009, 00:06
NCrashed

offline
Опыт: 13,553
Активность:
зачем ты обьявлял локалку рект?
зачем кстате вообще юзать сравнение, еще и не с реал константами, а каждый раз звать функцию?
Что я говорил про это ? заменяй на переменные, и функция GetUnitX взывается не один раз, поэтому будет выгодней её занести в переменную.
Огрехи рассеивания внимания, исправлено
Лично я не юзаю структуры для движение, для создание и уничтожение требуется определённое > время... куда быстрей юзать - GetUnitUserData и несколько масивов. ии ещё...
Юзер дата часто занята для других целей, структуры постоянно не уничтожаются и не создаются, это не понижает производительность. Тем более структуры помогают быстрее и легче делать системы.
Старый 14.09.2009, 00:25
ZeToX2007

offline
Опыт: 7,009
Активность:
Цитата:
Сообщение от NCrashed
Тем более структуры помогают быстрее и легче делать системы.

Не спорю, это удобная вещь, каждый делает как ему удобнее...) а так если, кое что подправить, статейка будет норм.
Старый 14.09.2009, 00:38
NCrashed

offline
Опыт: 13,553
Активность:
кое что подправить
Все предыдущие замечания исправлены, что еще подразумевается под "кое-что"?
Старый 14.09.2009, 23:51
Sebra

offline
Опыт: 5,603
Активность:
NCrashed:
Уж лучше бы set i=i+1 передвинул вверх за else
Тогда на любом теле движок будет зацикливаться, уж лучше так.
Подними set i=i+1 вверх, выше ближайшего else, убери set i=i-1 и ничего не зациклится.
Обработали одно тело - переходим к следующему.
Падение отслеживаешь только по z<2.
z[0,+беск] по опыту лучше отслеживать не z = 0, а z < 1-2
Совершенно не учитывается ландшафт.
Это обучающая статья, а обсчет силы реакции опоры требует больше теории. Эту функцию просто счас вставлю из fdl.
Он уже учитывается, или я ошибаюсь?
Добавил сухое трение - вышло отвратительно.
Подучи физику.
  1. Вектор силы не всегда вдоль земли.
  2. Сила трения вдоль поверхности против скорости пропорционально реакции опоры.
  3. Сила трения меньше максимума только если тело покоится.
А вот это не надо! В физико-математическом лицее учусь.
  1. Это, конечно, правильно, но если не заметил, то сила трения у меня направлена против вектора скорости.
  2. Я сделал упрощение, чтобы каждый раз не считать угол наклона плоскости и потом проектировать тангенсальную составляющую силы. То есть я считаю трение, пропорциональным нормальной реакции опоры, если бы тело лежало на не наклонной плоскости.
  3. Опять промазал ), если сила, действующая на тело меньше максимальной силы трения, то тело тормозит или покоится. Иначе складываем вектора силы трения и равнодействующей для тела.
Давай посмотрим, что тут у тебя :)
if SquareRoot(b.f.x*b.f.x + b.f.y*b.f.y) > mu*(b.m*g - b.f.z) then силы трения недостаточно, чтобы останавливать тело
тело не останется в покое
set b.f.x = b.f.x - b.f.x*mu*(b.m*g - b.f.z)/b.f.Module()
set b.f.y = b.f.y - b.f.y*mu*(b.m*g - b.f.z)/b.f.Module()
направляешь силу трения вдоль действующей силы не считая вертикали.
некорректные величина и направление
elseif SquareRoot(b.v.x*b.v.x + b.v.y*b.v.y) < RAbsBJ(mu*(b.m*g - b.f.z))/b.m then остановка тела
тело остановится под действием силы трения
некорректно - полностью игнорируем внешние силы
set b.v.x = 0
set b.v.y = 0
всё бы ничего, но...
else отнимаем от скорости
сюда попадают случаи, когда тело остановится, но не сейчас
if RAbsBJ(b.v.x) > 0 then
это что??? проверка на положительность модуля?
set b.v.x = b.v.x - b.v.x*mu*(b.m*g - b.f.z)/(b.v.Module()*b.m)
внешние силы игнорируем - они рассчитываются в другом месте
endif
if RAbsBJ(b.v.y) > 0 then
set b.v.y = b.v.y - b.v.y*mu*(b.m*g - b.f.z)/(b.v.Module()*b.m)
endif
endif
Чтобы нормально сделать сухое трение, его надо объединить с расчётом движения f>v>xyz.
Если с учётом внешних сил трение сможет остановить тело - остановить тело.
Иначе - считаем скорости и перемещение с учётом сил трения вдоль скорости.
Есть только два случая, а не три. Покой и движение.
Реализация трения тут соответствует теории (кроме этого упрощения, расчетов в 2 раза меньше, а разница не заметна)
Конечно, всего не учтёшь. Да и важна не правдивость, а правдоподобность.
Неужели в физико-математическом лицее тела движутся иначе, чем в провинциальной школе Советского Союза?
Старый 22.09.2009, 12:17
NCrashed

offline
Опыт: 13,553
Активность:
set b.f.x = b.f.x - b.f.x*mu*(b.m*g - b.f.z)/b.f.Module()
set b.f.y = b.f.y - b.f.y*mu*(b.m*g - b.f.z)/b.f.Module()
направляешь силу трения вдоль действующей силы не считая вертикали.
некорректные величина и направление
Логично, что сила терния покоя действует против результирующей силы всех остальных тел и что сила трения направлена параллельно поверхности трения (для упрощения взял эту плоскость всегда параллельной горизонту)
тело остановится под действием силы трения
некорректно - полностью игнорируем внешние силы
Случай, когда результирующая сила меньше силы трения, можно игнорить
На остальное отвечу позже
Старый 12.10.2009, 22:24

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 15:28.