Математические и механические задачи в 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 За счёт чего тогда поворачивается камера?
|
|
| |
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, который надо добавить
Так работает нормально. Спасибо огроменнейшее, что помог! Без тебя я бы не разобрался). Я ещё загляну позже кое-что спросить
Добавлено (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 Спасибо. Кстати, догадывался о подобном способе (теорема пифагора), но что-то не решался попробовать
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
| Спасибо большое, если вдруг понадобится - попробую использовать это Добавлено (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) --------------------------------------------- И снова я пришёл за советом Нужно "переместить" игрока опкодом 083С. Ну, имеется ввиду, подбросить игрока так, чтобы он из одной точки полетел в другую. На рисунке ниже примерная схема движения.
Теперь о самом опкоде. Он немного странноват Странность заключается в следующем: если применить его, когда игрок на земле и стоит на месте (скорость почти нулевая), то происходит только вылет вверх. Если игрок на земле и, к примеру, бежит, то вылет по 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
|
|
| |