Перейти к содержанию

[GTA III] Увеличение скорости транспорта.


Рекомендуемые сообщения

Доброго времени суток! Увлекаюсь изучением игр изнутри довольно давно, но до сих пор не смог понять одной простой вещи - это то, где или как в 3D играх формируется скорость.

Поясню ситуацию, имеется игрушка GTA III, там есть машинки, которыми мы можем управлять, то есть мы сели и поехали. Особого труда не составит найти координаты хотя бы X и Y (Z не учитываем), также через поиск по структуре можно запросто найти адреса памяти в которых хранится смещение на координатной плоскости (то, что прибавляется к значению в адрес с координатами). К примеру, мы двигаемся на машине на север с постоянной скоростью => по оси Y у нас идёт смещение, например, +3.0. то есть по оси Y было 0.0, потом 3.0, 6.0 и так далее.

Всё бы ничего да только эти значения не являются скоростью автотранспорта => по моему разумению, нужно найти тот участок памяти (адрес), в котором записана текущая скорость, которую набрал транспорт, с этим как раз и проблема.

Хочу заметить что я в курсе, что тут возможно есть работа с векторами скорости, так как копаясь в одной функции для Cheat Device, что в свою очередь был для GTA Vice City Stories (но то не важно), мною была обнаружен такой комментарий и код: 

// velocity = velocity + forward vector * thrust

   boost = 0.5;
   thrust = boost * 0.00333;

   setfloat(pcar + 0x0140,   getfloat(pcar + 0x0140) + getfloat(pcar + 0x0010) * thrust);
   setfloat(pcar + 0x0144,   getfloat(pcar + 0x0144) + getfloat(pcar + 0x0014) * thrust); 
   setfloat(pcar + 0x0148,   getfloat(pcar + 0x0148) + getfloat(pcar + 0x0018) * thrust);

Это C подобный синтаксис, поэтому поясню сам: 1) boost - ускорение 2) thrust - толчок 3) pcar - начало структуры машины, в которой мы сидим

По моему разумению, pcar + 0x0140 - это адрес, который как раз таки и хранит смещение по координатам, которые прибавляются к осям X, Y, Z. 

Тогда исходя из формулы: // velocity = velocity + forward vector * thrust ===> скорость = смещение по координатам + вектор * толчок. Если я всё правильно понимаю конечно же)) Но вопрос, что же такое forward vector? Это угол разворота машины или же что-то иное?

 

Изменено пользователем Sergey1953
Куски кода для удобства чтения нужно оборачивать специальным тегом.
Ссылка на комментарий
Поделиться на другие сайты

58 минут назад, Sergey1953 сказал:

Это угол разворота машины или же что-то иное?

 

Обычно это вектор единичной длины(если по простому -  шаг проделываемый объектом), который используется для вычисления позиции за определенное количество времени и может принимать в себя разные параметры, типа ускорения, скорости и т.д.

Ссылка на комментарий
Поделиться на другие сайты

9 минут назад, partoftheworlD сказал:

 

Обычно это вектор единичной длины(если по простому -  шаг проделываемый объектом), который используется для вычисления позиции за определенное количество времени и может принимать в себя разные параметры, типа ускорения, скорости и т.д.

И его никак нельзя найти?

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Sergey1953 сказал:

И его никак нельзя найти?

Ищется так же как и любое другое значение в памяти. Не можешь найти скорость, значит ищи, то что можешь, например координаты, от них можно восстановить код и выйти на кусок кода работающий с расчетом координат, от него выходишь на дистанцию, от дистанции на скорость, от скорости на forward vector и т.д.

Ссылка на комментарий
Поделиться на другие сайты

Был у нас пользователь AntonVit, он как-то публиковал видео по поиску скорости или ускорения для симуляторов гонок. Там он искал коэффициенты ускорения вращения колес. К сожалению, видео более недоступно, поскольку автор его удалил. Связаться с автором тоже не представляется возможным, так как он покинул нашу скромную обитель.

Ссылка на комментарий
Поделиться на другие сайты

28 минут назад, Xipho сказал:

он как-то публиковал видео по поиску скорости или ускорения для симуляторов гонок.

Да вроде я выкладывал AntonVit-видео на форум

 

8 часов назад, Sergey1953 сказал:

это то, где или как в 3D играх формируется скорость.

Разные варианты есть, зависит от кода

Обычно самый простой если по одной координате

x = x + dx * dt * Time.deltaTime;

Где dx например это 3м, а dt= 1c, Time.deltaTime - разница времени между кадрами отрисовки.

Получается смещение на 3 метра за 1 секунду с учетом синхронизации кадров. Кадр может быть отрисовки или кадр может быть физическим.

Это упрощенная схема.

 

Для 3д Как обычно используются уже три оси и углы поворота. Если в игре есть физ. движок то там задается velocity по координатам.

В более реалистичных расчетах есть формулы посложнее. Там скорость передвижения задается от колес, как Xipho написал

var fwdSpeed = Vector3.Dot(rigidbody.velocity, transform.forward); (link)

 

8 часов назад, Sergey1953 сказал:

 нужно найти тот участок памяти (адрес), в котором записана текущая скорость

 

Текущая скорость это просто готовая уже рассчитанная величина для показа например в графическом интерфейсе. Толку её искать.

Другое дело искать ускорение и предел скорости, другие параметры... Вот от них уже зависит и скорость и другое.

 

8 часов назад, Sergey1953 сказал:

 boost = 0.5;

Судя по коду эту величину и надо менять

 

8 часов назад, Sergey1953 сказал:

Но вопрос, что же такое forward vector?

 

Вариант 1.

Это нормализованный вектор в глобальной системе координат. Нормализованный, т.е. от 0 до 1 каждая его ось.

 

Вариант 2

Направление игрового объекта, туда куда он как бы смотрит относительно самого себя. Обычно, тоже сразу нормазилованный.

Если бы я знал точку А и точку Б, то направление было бы Б - А. Это без нормализации.

Если А - точка откуда я смотрю, а Б - точка куда я смотрю. То вектор направления был бы также:  Б - А.

Но если я хочу относительно модели всегда знать, куда она направлена, то надо знать Б относительно 3д сетки. Короче forward позволяет узнать вектор направления. Так называемый локальный Forward можно разными способами высчитывать.

Ссылка на комментарий
Поделиться на другие сайты

У меня из опыта такие мысли по этому поводу.

У каждой машины есть свои технические характеристики. Например вес, инерция, аэродинамика, мощность двигателя, количество передач, вес колеса. Все это и много другое определяет поведение каждого автомобиля, в частности его ускорение и максимальную скорость. Изменив параметры изменим скорость.

 

Есть также инструкция кода, которая сбрасывает значения Velocity до максимально разрешенных. Занопив инструкцию снимем ограничение.

Ссылка на комментарий
Поделиться на другие сайты

В 09.10.2019 в 19:44, Antonshka сказал:

У каждой машины есть свои технические характеристики. Например вес, инерция, аэродинамика, мощность двигателя, количество передач, вес колеса.

Я через нр машины в игре The Simpsons Hit & Run выходил на выше перечисленное, можно было даже заставить её летать :))

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.