Крепление эффектов освещения к автомобилю
|
|
Den_spb | Дата: Четверг, 05.04.2012, 00:06 | Сообщение # 61 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: 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
|
|
| |
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 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| В переменные записываются глобальные координаты углов прямоугольника, в который вписан прямоугольник текстуры.
|
|
| |
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 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: 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 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: 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 байтов 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 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: 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 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: 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]), ничего не происходит. Если добавить в код еще один множитель, проекция перемещается, но точно так же, как на скринах сверху. Плюс ко всему, после посадки в машину у неё пропадает правое переднее колесо
|
|
| |
Den_spb | Дата: Понедельник, 30.07.2012, 23:06 | Сообщение # 74 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: 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
|
|
| |