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

[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? Это угол разворота машины или же что-то иное?

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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 можно разными способами высчитывать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
6 часов назад, MasterGH сказал:

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

 

Вот оно - ТЫК

Поделиться сообщением


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

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В 09.10.2019 в 19:44, Antonshka сказал:

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

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

Поделиться сообщением


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

×

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

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