Четверг, 28.03.2024, 17:14
Качественные скрипты, моды и дополнения для GTA без регистрации
Главная Регистрация Вход
Приветствую Вас, Гость · RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Форум » Игры серии ГТА » Скриптинг » Математические и механические задачи в GTA (Применение знаний математики и механики в моддинге)
Математические и механические задачи в GTA
BoPoHДата: Четверг, 19.04.2012, 00:15 | Сообщение # 91
Группа: Проверенные
Сообщений: 53
Статус: Offline
Den_spb, Я так и не понял, что нужно подставлять и какие вычисления проводить smile Не люблю теорию.
Quote (Den_spb)
Ymax = Vy * Vz / 4.9

Т.е. я должен вычислить расстояние от первой точки до второй, затем, к примеру, подставить конкретное число вместо Vz и вычислить Vy?


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

 
Den_spbДата: Четверг, 19.04.2012, 00:23 | Сообщение # 92
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
Quote (BoPoH)
Т.е. я должен вычислить расстояние от первой точки до второй, затем, к примеру, подставить конкретное число вместо Vz и вычислить Vy?

Да.
 
BoPoHДата: Четверг, 19.04.2012, 00:40 | Сообщение # 93
Группа: Проверенные
Сообщений: 53
Статус: Offline
Den_spb, Ymax - расстояние от начальной до конечной точки лишь в горизонтальной плоскости? Или же в трёхмерном пространстве? т.е. какой опкод использовать: 0509 или 050A?

Добавлено (19.04.2012, 00:40)
---------------------------------------------
Проверил. Игрок пролетает половину того, что должен пролететь.

Code

{$CLEO}
0000:

:1
wait 0
if
0AB0: 88
jf @1
04C4: store_coords_to 1@ 2@ 3@ from_actor $PLAYER_ACTOR with_offset 0.0 0.0 0.0  
04C4: store_coords_to 11@ 12@ 13@ from_actor $PLAYER_ACTOR with_offset 0.0 5.0 0.0
0509: 7@ = distance_between_XY 1@ 2@ and_XY 11@ 12@
10@ = 4.9
006B: 10@ *= 7@ // (float)  
10@ /= 6.0

04C4: store_coords_to 1@ 2@ 3@ from_actor $PLAYER_ACTOR with_offset 0.0 10@ 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
33@ = 0
while 33@ < 3000
wait 0
024F: create_corona_with_radius 0.2 type 1 lensflares 0 with_color 255 0 0 at 11@ 12@ 13@
end
jump @1


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

 
Den_spbДата: Четверг, 19.04.2012, 00:47 | Сообщение # 94
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
Значения высоты начала и конца прыжка сильно различаются? По идее выражение Ymax = Vy * Vz / 4.9 действует только в том случае, когда точки расположены приблизительно на одной высоте.
 
BoPoHДата: Четверг, 19.04.2012, 00:50 | Сообщение # 95
Группа: Проверенные
Сообщений: 53
Статус: Offline
Den_spb, Вот в том-то и дело, что точки не всегда расположены не на одной высоте. Это я и показал на рисунке...

Добавлено (19.04.2012, 00:50)
---------------------------------------------
Если делать не так: 10@ /= 6.0, а так: 10@ /= 3.0 и делать на одной высоте, то почти совпадает. Если разница между высотами небольшая - делает всё ещё достаточно точно. Если же разница больше 4-5 метров - уже не то.


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

 
Den_spbДата: Четверг, 19.04.2012, 00:57 | Сообщение # 96
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
Хорошо бы проверить этот способ в той ситуации, когда точки расположены на одной высоте. Если код будет работать правильно, то можно продвигать эту идею дальше. Если код по-прежнему не будет работать так, как нужно, то надо искать и устранять ошибку, или применять какой-то другой способ (например, перемещение игрока в цикле с помощью actor.putAt)
 
BoPoHДата: Четверг, 19.04.2012, 01:03 | Сообщение # 97
Группа: Проверенные
Сообщений: 53
Статус: Offline
Quote (Den_spb)
например, перемещение игрока в цикле с помощью actor.putAt

Не подходит. Уже пробовал. Игрок дёргается вверх-вниз (хотя у меня стоит скрипт-апдайт скриптового движка, который перемещает его выполнение после процесса камеры). Тогда можно было попробовать ставить collision_detection 0, однако этот способ тоже не подходит. Мне нужно, чтобы это дело было видно в сампе. А с collision_detection 0 синхронизация позиции прекращается. Т.е. игрок для других игроков просто зависает в начальной точке. То же самое происходит и с actor.LockInCurrentPosition.
Quote (Den_spb)
Хорошо бы проверить этот способ в той ситуации, когда точки расположены на одной высоте.

Я же и говорю, что проверил. Игрок пролетает только половину расстояния. Если же скорость по Y увеличить вдвое, то игрок призмляется достаточно точно (не проверял на больших расстояниях).


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

 
Den_spbДата: Четверг, 19.04.2012, 01:18 | Сообщение # 98
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
Quote (BoPoH)
Я же и говорю, что проверил.
Ты добавил сообщение пока я писал ответ.
Ну что ж, можно попробовать развить идею дальше. Если значения высоты начальной и конечной точек полёта различаются, то уравнение движения будет таким:
Zmax = Vz * tmax - 4.9 * tmax^2
Здесь Zmax - разница между высотами (меньше нуля, если конечная точка ниже, и больше нуля - если выше).
Zmax = Vz * (Ymax/Vy) - 4.9 * (Ymax/Vy)^2
Дальше действуем аналогично: Ymax и Zmax известны (Ymax отмеряется по горизонтали), один из компонентов скорости задаём, второй вычисляем.
 
BoPoHДата: Четверг, 19.04.2012, 01:24 | Сообщение # 99
Группа: Проверенные
Сообщений: 53
Статус: Offline
Quote (Den_spb)
Zmax = Vz * (Ymax/Vy) - 4.9 * (Ymax/Vy)^2

Т.е. если я хочу задать Vz, то опять же надо выразить отсюда Vy? Блин... пойду возьму тетрадку с ручкой... буду преобразовывать smile


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

 
Den_spbДата: Четверг, 19.04.2012, 01:26 | Сообщение # 100
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
Да, надо выразить Vy или Vz.
 
BoPoHДата: Четверг, 19.04.2012, 01:36 | Сообщение # 101
Группа: Проверенные
Сообщений: 53
Статус: Offline
Den_spb, гораздо легче выразить Vz, но Vy сложнее задать... и наоборот smile

Добавлено (19.04.2012, 01:36)
---------------------------------------------
Блин. Выразить Vy не получается. Видимо знаний математики не хватает smile
Дошёл сюда: Vy = Zmax / (Vz * Ymax - 4,9 * Ymax^2 / Vy)
Как убрать из правой части Vy? smile


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

 
DK22PacДата: Четверг, 19.04.2012, 01:57 | Сообщение # 102
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
ЕСЛИ НЕ ОШИБАЮСЬ, в гта3 перемещение игрока при прыжке производится кодом непосредственно. Щас посмотрю...
 
Den_spbДата: Четверг, 19.04.2012, 02:17 | Сообщение # 103
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
Можно воспользоваться формулой сокращённого умножения (квадрат разности).
Zmax = Vz * (Ymax/Vy) - 4.9 * (Ymax/Vy)^2
Обозначим Ymax/Vy = A, тогда:
Zmax = Vz * A - 4.9 * A^2
Теперь обозначим 4.9*A^2 = a^2, тогда A = a / SQRT(4.9) , a = A*SQRT(4.9)
Zmax = Vz * a / SQRT(4.9) - a^2
Обозначим b = Vz / (2*SQRT(4.9)) , тогда
Zmax = 2ab - a^2
-Zmax = a^2 - 2ab
Прибавим к обоим частям уравнения b^2:
b^2 - Zmax = a^2 - 2ab + b^2
Воспользуемся формулой квадрата разности:
b^2 - Zmax = (a - b)^2
Извлечём корень из обеих частей уравнения:
SQRT(b^2 - Zmax) = a - b
a = SQRT(b^2 - Zmax) + b
Остаётся подставить выражения в a и b. Можно было и другим способом пойти - решить квадратное уравнение (через дискриминант).

Quote (DK22Pac)
ЕСЛИ НЕ ОШИБАЮСЬ, в гта3 перемещение игрока при прыжке производится кодом непосредственно. Щас посмотрю...

Каким кодом? В SA опкод производит запись в CPhysical.velocity. Непосредственно опкод перемещать не может, т.к. перемещение осуществляется в течение некоторого количества циклов отрисовки, а опкод может работать только один раз (сразу).
 
BoPoHДата: Четверг, 19.04.2012, 11:56 | Сообщение # 104
Группа: Проверенные
Сообщений: 53
Статус: Offline
Den_spb, Предполагал, что нужна замена переменной. Только не имел представления, что заменять smile
Получается, если я захочу выразить Vy, то выйдет следующее:
Vy = (SQRT(4.9) * Ymax) / (SQRT((Vz / 2*SQRT(4.9))^2 - Zmax) + Vz / 2*SQRT(4.9))
Офигеть, выраженьице biggrin
Ща буду проверять...

Добавлено (19.04.2012, 11:56)
---------------------------------------------
Что-то не так. Разве выражения не должны быть под модулем, после того, как ты извлекаешь из обеих частей корень?
Если использовать это на плоскости, получается тот же результат - половина пути.
Если нужна высота - тут пока ещё не очень ясно, но ещё тут нужно кое-что учитывать. Выражение (Vz / 2*SQRT(4.9))^2 должно быть больше Zmax.


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



Сообщение отредактировал BoPoH - Четверг, 19.04.2012, 11:11
 
Den_spbДата: Четверг, 19.04.2012, 12:08 | Сообщение # 105
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
Quote (BoPoH)
Что-то не так. Разве выражения не должны быть под модулем, после того, как ты извлекаешь из обеих частей корень?
По идее должно быть 2 значения Vy, удовлетворяющих условию, т.к. у квадратного уравнения 2 корня. Одно значение скорее всего получится отрицательным, но по смыслу значения компонентов скорости не могут быть меньше нуля.

Quote (BoPoH)
Выражение (Vz / 2*SQRT(4.9))^2 должно быть больше Zmax.
Верно, для каждого значения Vz будет определена максимально допустимая Zmax. Это означает, что существует максимальная достижимая высота при прыжке с заданной скоростью.
 
Форум » Игры серии ГТА » Скриптинг » Математические и механические задачи в GTA (Применение знаний математики и механики в моддинге)
Поиск: