Крепление эффектов освещения к автомобилю - Страница 5 - Форум
Вторник, 06.12.2016, 11:13
Качественные скрипты, моды и дополнения для GTA без регистрации
Главная Регистрация Вход
Приветствую Вас, Гость · RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 5 из 6«123456»
Форум » Игры серии ГТА » Работа с памятью, exe » Крепление эффектов освещения к автомобилю
Крепление эффектов освещения к автомобилю
Den_spbДата: Четверг, 05.04.2012, 00:06 | Сообщение # 61
Создатель сайта
Группа: Администраторы
Сообщений: 1536
Статус: Offline
0AA5: 0x707390 16 pop 16 0 0 1.0 0 5.0 128 128 128 128 Y1 X1 Y2 X2 31@ 30@ 2

Отмеченные параметры определяются как разница между мировыми координатами указанных точек и мировыми координатами центра прямоугольника.



Представление параметров через угол поворота текстуры, её длину и ширину:
Y1 = SIN(Z) * W/2
X1 = COS(Z) * W/2
Y2 = SIN(Z+90.0) * L/2
X2 = COS(Z+90.0) * L/2
Прикрепления: 2451194.jpg(27Kb)
 
DK22PacДата: Вторник, 24.04.2012, 02:15 | Сообщение # 62
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
Den_spb, спасибо, что рассписал. Сложноватая система.
Я вот роюсь в рендере этих теней...

Добавлено (24.04.2012, 02:15)
---------------------------------------------
Если будет время, посмотри... Надо узнать, что записывается в v120, v116, v121, v117.
v10 - это |X2| + |X1|
v13 = |Y2| + |Y1|

 
Den_spbДата: Вторник, 24.04.2012, 03:11 | Сообщение # 63
Создатель сайта
Группа: Администраторы
Сообщений: 1536
Статус: Offline
В переменные записываются глобальные координаты углов прямоугольника, в который вписан прямоугольник текстуры.

Прикрепления: 9361364.jpg(31Kb)
 
DK22PacДата: Среда, 25.04.2012, 01:42 | Сообщение # 64
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
Спасибо. Вот, дальше продвинулся благодоря этому:
 
Sergey81_agДата: Воскресенье, 22.07.2012, 04:53 | Сообщение # 65
Группа: Проверенные
Сообщений: 9
Статус: Offline
А как в неоновом моде менять расположение самого неона относительно машины?
 
Den_spbДата: Воскресенье, 22.07.2012, 17:46 | Сообщение # 66
Создатель сайта
Группа: Администраторы
Сообщений: 1536
Статус: Offline
Что конкретно нужно изменить? (положение центра проекции, длина проекции, ширина проекции ...)
 
Sergey81_agДата: Воскресенье, 22.07.2012, 22:35 | Сообщение # 67
Группа: Проверенные
Сообщений: 9
Статус: Offline
Я хочу сделать вместо неона проекцию задних фар у машины, как поменять длину/ширину вроде разобрался, а вот положение центра почему-то не получилось. Так же интересует возможность применить данный код и к авто в траффике.
ЗЫ. Поставил Windows 8, так в ней вобще беда со скриптами, мало того что без совместимости с 7 gta_sa.exe не запускается, так после запуска с совместимостью в игре при соприкосновении игрока с любой машиной, последняя загорается и потом взрывается, а в самом мире творится хаос как при включенном riot режиме. Почему так я категорически не понимаю, в win7 все отлично работает. Вайс вобще отказался запускаться, ссылаясь на ошибку в cleo.asi, гта 3 заработала.
 
Den_spbДата: Воскресенье, 22.07.2012, 22:57 | Сообщение # 68
Создатель сайта
Группа: Администраторы
Сообщений: 1536
Статус: Offline
Одним из параметров функции, создающей проекцию света, является адрес вектора, указывающего на позицию центра проекции (напомню, что вектор состоит из трёх координат, записанных подряд, а адрес вектора - это адрес, по которому записана первая координата).
В данном скрипте используется вектор мировой позиции автомобиля (т.е. центр проекции устанавливается в "центре" автомобиля):
Code
    8B 46 14        // mov eax, [esi+14h] - записали в eax адрес матрицы вращения и позиции автомобиля $eax = [$carStruct + 0x14]
           83 C0 30        // add eax, 0x30 - вектор мировой позиции записан в матрице по смещению 0x30          
           50              // push eax - передали адрес вектора на стек

Для изменения положения центра проекции нужно заменить первые две строчки указанного отрывка кода своим кодом.
После редактирования кода будет необходимо исправить значения в командах переходов:
Code
    75 47           // jnz +0x47                   Если нет, то пропускаем участок кода в 0x47 байтов

Code
    75 65           // jnz +0x65

Quote (Sergey81_ag)
Так же интересует возможность применить данный код и к авто в траффике.

Код exe обрабатывает все существующие автомобили. Проекция создаётся только на автомобиле игрока потому, что в начале я поставил проверку:
Code
    A1 00 00 00 00  // mov eax, 0_PlayerCarStruct          
           3B F0           // cmp esi, eax                Проверяем, явяется ли текущий обрабатываемый транспорт автомобилем игрока
           75 47           // jnz +0x47                   Если нет, то пропускаем участок кода в 0x47 байтов
 
Sergey81_agДата: Вторник, 24.07.2012, 10:26 | Сообщение # 69
Группа: Проверенные
Сообщений: 9
Статус: Offline
Сделал вот таким образом скрипт, но есть проблема, когда пытаюсь изменить координаты(пробую простым sub/add ecx), проекция странно себя ведет:

http://pastebin.com/zTps21DQ
Предложения?


Сообщение отредактировал Sergey81_ag - Вторник, 24.07.2012, 10:27
 
Den_spbДата: Суббота, 28.07.2012, 23:53 | Сообщение # 70
Создатель сайта
Группа: Администраторы
Сообщений: 1536
Статус: Offline
sub/add не подойдёт, поскольку это целочисленное вычитание и сложение, а координаты являются дробными числами. Порядок действий должен быть примерно такой:
1. Загружаем координаты автомобиля из Matrix+0x30 на стек FPU (это специальный стек, предназначенный для осуществления операций с дробными числами - см. статьи в интернете "Работа с дробными числами в ассемблере" и т.п.) с помощью команды fld.
2. Загружаем на стек синус и косинус Z-угла поворота автомобиля (это координаты вектора Top - берём из матрицы позиции и вращения машины).
3. Загружаем на стек величину расстояния между центром автомобиля и центром проекции и умножаем на него значения синуса и косинуса командой fmul.
4. Прибавляем к полученным значениям координаты автомобиля (или наооборот) с помощью команды fadd.
5. Выгружаем результаты в регистры или в буфер с помощью команды fstp (fstp при этом и очищает стек, fst - только копирует результат в указанное место).

Не нужно пытаться перенести вычисление координат из ассемблерной части в скриптовую. Проекции, создаваемые обычными скриптами, дёргаются и отстают от машин потому, что создаются в "устаревших" координатах. Причина этому - очерёдность выполнения операций:
выполнение скриптов -> обновление положения объектов и машин (пересчёт координат) -> отрисовка
Задача ассемблерной вставки как раз и заключается в том, чтобы внедрить код создания проекции в одну из функций exe, выполняемых после обновления координат:
обновление положения объектов и машин (пересчёт координат) -> создание проекции -> отрисовка
 
Sergey81_agДата: Воскресенье, 29.07.2012, 08:36 | Сообщение # 71
Группа: Проверенные
Сообщений: 9
Статус: Offline
Попытался, теперь проекция прыгает туда-сюда под машиной. Что я делаю не так?
http://pastebin.com/K77ErMie
 
Den_spbДата: Понедельник, 30.07.2012, 18:50 | Сообщение # 72
Создатель сайта
Группа: Администраторы
Сообщений: 1536
Статус: Offline
У тебя получается вычисление синуса и косинуса от Х-координаты автомобиля:
Code
hex
8B 46 14        // mov eax, [esi+14h]               $eax = [$carStruct + 0x14] Записали в eax адрес матрицы вращения и позиции
83 C0 30                   //- add eax,30               Получили адрес вектора позиции
8B D8                      //- mov ebx,eax
83 C3 08                   //- add ebx,08
8B 1B                      //- mov ebx,[ebx]
89 1D  
end
:qqq4
hex
00 00 00 00             //- mov [02C4A747],ebx

90 90 90
D9 00                       // fld dword ptr [eax]            Загрузили X-координату автомобиля на стек FPU
83 C0 00      //add eax,00
D9 00           //fld dword ptr [eax]                         Загрузили X-координату автомобиля ещё раз
D9 FE                     //fsin                    ВЫЧИСЛЯЕМ СИНУС ОТ Х-КООРДИНАТЫ ?
D9 00                       //fld dword ptr [eax]
D9 FF                       //fcos

На самом деле нужно просто загрузить координаты вектора Top - это и есть синус и косинус Z-угла поворота автомобиля
Code
Matrix+0x10    TopX (-sinZ)
Matrix+0x14    TopY (cosZ)
 
Sergey81_agДата: Понедельник, 30.07.2012, 20:57 | Сообщение # 73
Группа: Проверенные
Сообщений: 9
Статус: Offline
А, значит я неправильно понял просто.
http://pastebin.com/a7sdHVyL
Вроде так, но желаемого результата нет. Меняя т.н. величину расстояния между центром автомобиля и центром проекции(которая [00858624]), ничего не происходит. Если добавить в код еще один множитель, проекция перемещается, но точно так же, как на скринах сверху. Плюс ко всему, после посадки в машину у неё пропадает правое переднее колесо laugh
 
Den_spbДата: Понедельник, 30.07.2012, 23:06 | Сообщение # 74
Создатель сайта
Группа: Администраторы
Сообщений: 1536
Статус: Offline
Первое, что бросилось в глаза:
Quote
8B 46 14 // mov eax, [esi+14h] $eax = [$carStruct + 0x14]
83 C0 30 //- add eax,30 Теперь в eax записан адрес Matrix+0x30
8B D8 //- mov ebx,eax
83 C3 08 //- add ebx,08
8B 1B //- mov ebx,[ebx]
89 1D
end
:qqq4
hex
00 00 00 00 //- mov [02C4A747],ebx

90 90 90
D9 00 // fld dword ptr [eax]
83 C0 10 //add eax,10 Было Matrix+0x30, прибавили ещё 0x10 - получилось Matrix+0x40, а должно быть Matrix+0x10
D9 00 //fld dword ptr [eax] TopX (-sinZ)
 
Sergey81_agДата: Вторник, 31.07.2012, 10:53 | Сообщение # 75
Группа: Проверенные
Сообщений: 9
Статус: Offline
Тут что-то еще, потому что колесо пропадает, ну и проекция все равно находится рядом с машиной, хотя теперь на её положение влияет множитель 858624.
http://pastebin.com/Jbu9R4y0
 
Форум » Игры серии ГТА » Работа с памятью, exe » Крепление эффектов освещения к автомобилю
Страница 5 из 6«123456»
Поиск: