Вторник, 16.04.2024, 21:24
Качественные скрипты, моды и дополнения для GTA без регистрации
Главная Регистрация Вход
Приветствую Вас, Гость · RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Форум » Игры серии ГТА » Скриптинг » Математические и механические задачи в GTA (Применение знаний математики и механики в моддинге)
Математические и механические задачи в GTA
Den_spbДата: Суббота, 28.01.2012, 01:56 | Сообщение # 76
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
1)Проверь, чтобы в опкоде поворота матрицы значения углов были заданы в радианах.
2)Можно попробовать поменять местами исходные матрицы, т.е. A11_offset записать в B11_offset, а B11_offset а в A11_offset.
3)Куда записывается матрица-произведение?
 
BoPoHДата: Суббота, 28.01.2012, 02:00 | Сообщение # 77
Группа: Проверенные
Сообщений: 53
Статус: Offline
Quote (Den_spb)
1)Проверь, чтобы в опкоде поворота матрицы значения углов были заданы в радианах.

Использую опкод
Code
0D08: set_matrix 27@ rotation 0.0 0.0 0.0

который сделал DK22Pac
Quote (Den_spb)
2)Можно попробовать поменять местами исходные матрицы, т.е. A11_offset записать в B11_offset, а B11_offset а в A11_offset.

Не сработало.
Quote (Den_spb)
3)Куда записывается матрица-произведение?

Буфер в скрипте, как ты делал. hex..end


First-Person mode 85% done
Добро всегда побеждает зло. Кто победил, тот и добрый!



Сообщение отредактировал BoPoH - Суббота, 28.01.2012, 02:01
 
Den_spbДата: Суббота, 28.01.2012, 02:07 | Сообщение # 78
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
Quote (BoPoH)
Буфер в скрипте, как ты делал. hex..end

wacko
За счёт чего тогда поворачивается камера?
 
BoPoHДата: Суббота, 28.01.2012, 02:11 | Сообщение # 79
Группа: Проверенные
Сообщений: 53
Статус: Offline
Quote (Den_spb)
За счёт чего тогда поворачивается камера?

После этого я применяю спец. scm-функцию, которая ставит камере матрицу из того буфера.


First-Person mode 85% done
Добро всегда побеждает зло. Кто победил, тот и добрый!

 
Den_spbДата: Суббота, 28.01.2012, 02:12 | Сообщение # 80
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
А не проще писать матрицу сразу в камеру?
И по какому смещению камеры осуществляется запись?
 
BoPoHДата: Среда, 21.03.2012, 23:34 | Сообщение # 81
Группа: Проверенные
Сообщений: 53
Статус: Offline
Quote (Den_spb)
А не проще писать матрицу сразу в камеру?

Дело в том, что это невозможно. У матрицы камеры есть одна особенность - вектор Right инвертирован почему-то. Я не знаю в чём конкретно дело, но это я понял чисто экспериментально.
Quote (Den_spb)
И по какому смещению камеры осуществляется запись?

Матрица камеры находится по адресу 0xB6F99C

Добавлено (28.01.2012, 02:32)
---------------------------------------------
Ладно, пусть так, в принципе есть способ исправить это:
Code
10@ -= 90.0
11@ += 180.0
25@ = 180.0
0063:   25@ -= 10@            
0D08: set_matrix 27@ rotation 25@ 90.0 11@


10@ - это угол X, который надо добавить
11@ - угол Z, который надо добавить

Так работает нормально.
Спасибо огроменнейшее, что помог! Без тебя я бы не разобрался). Я ещё загляну позже кое-что спросить smile

Добавлено (21.03.2012, 23:34)
---------------------------------------------
Есть вопрос. У меня есть вектор, нужно вычислить его X и Z углы. Пробовал следующим образом:
Code
0604: get_Z_angle_for_point 11@ 12@ store_to 25@
0604: get_Z_angle_for_point 12@ 13@ store_to 26@

11@, 12@ и 13@ - вектор
Проблема заключается в том, что если угол Z составляет больше 90 или меньше 270 градусов, то угол X определяется неправильно.
Но это - побочная задача. Основная задача состоит в том, чтобы направить матрицу так, чтобы её вектор Top смотрел в нужную мне точку.
Т.е. чисто теоретически, тот вектор и есть вектор Top, но как из него образовать другие 2 вектора?

UPD. Вспомнил про код вычисления углов матрицы. Глянул на вычисление угла X.
Code
0604: get_angle_between_vectors_{a,b} $TopZ $Sqrt(TopX^2+TopY^2) and_{0,1}_store_to $Xangle

Вроде используется только вектор Top, сейчас попробую...

--------------

Сработало, только пришлось поменять местами $TopZ и $Sqrt(TopX^2+TopY^2).
Твой код снова меня спас, Den_spb biggrin Спасибо.
Кстати, догадывался о подобном способе (теорема пифагора), но что-то не решался попробовать smile


First-Person mode 85% done
Добро всегда побеждает зло. Кто победил, тот и добрый!



Сообщение отредактировал BoPoH - Среда, 21.03.2012, 23:50
 
Den_spbДата: Четверг, 22.03.2012, 02:35 | Сообщение # 82
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
Кстати есть и другой способ, более сложный.
Если посмотреть на вектора сверху (т.е. по отрицательному направлению оси Z), то можно заметить, что:
1.При $Xangle > 270.0 или $Xangle < 90.0 - Z-угол всегда на 90 градусов больше, чем угол между осью Y и вектором Right (см.рис.).
2.При $Xangle > 90.0 и $Xangle < 270.0 - Z-угол всегда на 90 градусов меньше, чем угол между осью Y и вектором Right.
3.При $Xangle == 90.0 или $Xangle == 270.0 - RightZ и AtZ всегда равны 0, остальные координаты Right и At не определены.



Определив угол между осью Y и вектором Right (назовём его ALPHA), можно вычислить координаты вектора Right. В данном случае (Y-угол всегда равен 0) они всегда будут равны:
RightX = -sin(ALPHA)
RightY = cos(ALPHA)
RightZ = 0

Остаётся вектор At - его проще найти с помощью векторного умножения Right и Top:



Здесь a - вектор Right, b - вектор Top, [a,b] - вектор At.
 
BoPoHДата: Воскресенье, 25.03.2012, 22:13 | Сообщение # 83
Группа: Проверенные
Сообщений: 53
Статус: Offline
Спасибо большое, если вдруг понадобится - попробую использовать это smile

Добавлено (25.03.2012, 22:13)
---------------------------------------------
Снова проблемка. Есть 2 матрицы. За определённое кол-во времени мне нужно плавно повернуть первую матрицу до положения второй. Основное условие - не использовать углы.


First-Person mode 85% done
Добро всегда побеждает зло. Кто победил, тот и добрый!

 
Den_spbДата: Воскресенье, 25.03.2012, 22:53 | Сообщение # 84
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
Я не представляю, как можно обойтись без углов. А чем углы не угодили?
 
BoPoHДата: Воскресенье, 25.03.2012, 23:15 | Сообщение # 85
Группа: Проверенные
Сообщений: 53
Статус: Offline
Quote (Den_spb)
А чем углы не угодили?

А тем, что они не дают точных результатов.


First-Person mode 85% done
Добро всегда побеждает зло. Кто победил, тот и добрый!

 
Den_spbДата: Воскресенье, 25.03.2012, 23:20 | Сообщение # 86
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
Если углы вычисляются правильно, то они дают абсолютно точные сведения о положении матрицы. Для исключения возможных неопределённостей дополнительно проверяется направление одного из векторов.
 
BoPoHДата: Воскресенье, 25.03.2012, 23:28 | Сообщение # 87
Группа: Проверенные
Сообщений: 53
Статус: Offline
Quote (Den_spb)
Для исключения возможных неопределённостей дополнительно проверяется направление одного из векторов.

Это как?
Мне кажется, что получить точные углы разворота матрицы невозможно, так как для любого положения матрицы существует по крайней мере 2 варианта углов. Разве нет?


First-Person mode 85% done
Добро всегда побеждает зло. Кто победил, тот и добрый!



Сообщение отредактировал BoPoH - Воскресенье, 25.03.2012, 23:35
 
Den_spbДата: Понедельник, 26.03.2012, 04:34 | Сообщение # 88
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
С помощью углов можно точно определить позицию матрицы - с этой задачей они справляются. Но определить, в какую сторону надо вращать матрицу*, чтобы достичь нужного положения, не сможет ни один алгоритм, хоть с углами, хоть без них. Например, если автомобиль перевёрнут вверх колёсами, то невозможно определить, был он перевёрнут через бок или через бампер.
Но это для той ситуации, когда меняются все 3 угла.

Если же Y-угол всегда равен нулю, и меняются только углы X и Z, то набор углов будет всегда один, а не два. В этом случае при вычислении Z-угла с помощью 0604: get_angle_between_vectors_{a,b} $TopX $TopY and_{0,1}_store_to $Zangle надо дополнительно проверить направление вектора At. Если AtZ < 0, то можно сделать вывод, что матрица перевёрнута вниз головой (X-угол больше 90.0 или меньше 270.0) - тогда к полученному значению Z-угла надо прибавить 180.0 градусов. А проще сначала посчитать X-угол, а потом прибавить к Z-углу 180.0, если X-угол больше 90.0 или меньше 270.0.

* - вообще правильнее говорить "вращается базис", т.к. система из трёх векторов называется базисом. А матрица - это просто таблица с числами.
 
BoPoHДата: Вторник, 17.04.2012, 22:35 | Сообщение # 89
Группа: Проверенные
Сообщений: 53
Статус: Offline
Den_spb, вот в том и проблема, что мне надо определять, в какую сторону вращать базис. Ладно, попробую с углами, в принципе, матрицы у меня не перевёрнуты.

Добавлено (17.04.2012, 22:35)
---------------------------------------------
И снова я пришёл за советом smile
Нужно "переместить" игрока опкодом 083С. Ну, имеется ввиду, подбросить игрока так, чтобы он из одной точки полетел в другую. На рисунке ниже примерная схема движения.


Теперь о самом опкоде. Он немного странноват smile Странность заключается в следующем: если применить его, когда игрок на земле и стоит на месте (скорость почти нулевая), то происходит только вылет вверх. Если игрок на земле и, к примеру, бежит, то вылет по X и Y отсчитывается относительно игрока. Т.е. если задать X=0.0 Y=5.0 Z=10.0, то игрок полетит вперёд. Если же игрок в воздухе, то вылет происходит относительно глобальной системы осчёта. Обычно я делаю вот как:
Code
04C4: store_coords_to 1@ 2@ 3@ from_actor $PLAYER_ACTOR with_offset 0.0 2.0 0.0    
actor.StorePos($PLAYER_ACTOR, 4@, 5@, 6@)
0063: 1@ -= 4@
0063: 2@ -= 5@
083C: set_actor $PLAYER_ACTOR velocity_in_direction_XYZ 0.0 0.0 10.0
wait 0
083C: set_actor $PLAYER_ACTOR velocity_in_direction_XYZ 1@ 2@ 6.0

Сперва вычисляю параметры X и Y, а затем придаю игроку скорость вверх на 1 кадр. За этот кадр он успевает приподняться в воздух и теперь срабатывает это правило:
Quote
Если же игрок в воздухе, то вылет происходит относительно глобальной системы осчёта.

Такая штука работает в любом случае, будь игрок в воздухе, на земле, будет ли он стоять или бежать.
Но вернёмся к основной проблеме. Мне нужно подбросить игрока так, чтобы он вылетел из одной точки и приземлился в другой. Предполагается, что координаты известны. Если использовать тот код, что указан выше, то мне нужно вычислить параметр Y для опкода 04С4 и параметр Z для опкода 083C (только Y и Z, т.к. предполагается, что точка приземления находится перед игроком, а не где-то сбоку). Вопрос в этом и заключается, как же вычислить эти самые параметры? Вероятно здесь могли бы применяться какие-то формулы из физики, но я не думаю, что в SA физика близка к реальности.
А надо это всё мне для создания "точного прыжка" на перилку или парапет. Уж координаты перилки я придумаю как вычислить, а вот теперь нужно правильно вылет рассчитать.


First-Person mode 85% done
Добро всегда побеждает зло. Кто победил, тот и добрый!



Сообщение отредактировал BoPoH - Среда, 18.04.2012, 11:37
 
Den_spbДата: Среда, 18.04.2012, 15:35 | Сообщение # 90
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
Команда 083C, судя по коду, всегда записывает переданные значения по адресам, соответствующим глобальной скорости объекта.

Для определения компонентов начальной скорости можно воспользоваться уравнениями движения тела:
Y(t) = Y0 + Vy * t + (Ay * t^2) / 2
Z(t) = Z0 + Vz * t + (Az * t^2) / 2
Если перед прыжком актёр имел координаты Y=0, Z=0, а в момент приземления tmax - Y=Ymax, Z=0, то уравнения приобретают вид:
Ymax = Vy * tmax
0 = Vz * tmax + (-9.8 * tmax^2) / 2
Преобразуем второе уравнение:
Vz = 4.9 * tmax
В итоге, если нигде не ошибся, получается такое соотношение начальных компонентов скорости Vy, Vz и длины прыжка Ymax:
Ymax = Vy * Vz / 4.9
 
Форум » Игры серии ГТА » Скриптинг » Математические и механические задачи в GTA (Применение знаний математики и механики в моддинге)
Поиск: