Математические и механические задачи в GTA
|
|
BoPoH | Дата: Четверг, 19.04.2012, 00:15 | Сообщение # 91 |
Группа: Проверенные
Сообщений: 53
Статус: Offline
| Den_spb, Я так и не понял, что нужно подставлять и какие вычисления проводить Не люблю теорию. 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? Блин... пойду возьму тетрадку с ручкой... буду преобразовывать
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 сложнее задать... и наоборот Добавлено (19.04.2012, 01:36) --------------------------------------------- Блин. Выразить Vy не получается. Видимо знаний математики не хватает Дошёл сюда: Vy = Zmax / (Vz * Ymax - 4,9 * Ymax^2 / Vy) Как убрать из правой части Vy?
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, Предполагал, что нужна замена переменной. Только не имел представления, что заменять Получается, если я захочу выразить Vy, то выйдет следующее: Vy = (SQRT(4.9) * Ymax) / (SQRT((Vz / 2*SQRT(4.9))^2 - Zmax) + Vz / 2*SQRT(4.9)) Офигеть, выраженьице Ща буду проверять...Добавлено (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. Это означает, что существует максимальная достижимая высота при прыжке с заданной скоростью.
|
|
| |