Информация Страшное слово «кватернион» — это вообще что?

Vintik

Через тернии к звёздам
Автор темы
Проверенный
1,566
1,045
Я делаю маппинг в программе MED (Map Editor). Тем самым на прямую внутри игры меняю игровую карту в файлах IPL.
Ага, теперь понял.
Значение жирным - он округляет и соответственно в игре отображает объект горизонтально а не под углом.
Округляет значение?
Как пишут на форуме, на который ты указал, формат файла следующий:
IPL:
ID, modelname, interior, posX, posY, posZ, [B]quaternionX, quaternionY, quaternionZ, quaternionW[/B], LOD
Заметь, в IPL файле именно что кватернион, а не обычные углы поворота по осям.
Как я писал выше:
И да, этот вектор должен быть длины 1 для того, чтобы выполнялись математические преобразования, не буду вдаваться в их подробности.
То есть, иными словами, норма (длина) кватерниона должна быть равна одному. На примере:
Кватернион:
q = w + xi + yj + zk
N(q) = √(w² + x² + y² + z²)

N(q) should be equal to 1
Это одна из причин, почему редактор (или сама игра) могут «округлять» значения кватерниона. То есть если получается, что норма НЕ равна 1, то игра может начать менять значения (но я не уверен).
На скрине ниже предоставлено так называемое решение, автор пишет, что нужно поменять значение после запятой - я так и не понял, что он имел ввиду.
1714860831047.png
Он имеет ввиду изменение значений указателя в памяти игры. Вот стандартные значения:
1714911405456.png
А вот заменённые:
1714911485310.png
Если у тебя нет опыта работы с памятью игры — можешь просто попробовать использовать Lua-скрипт (который я прикрепил к своему сообщению, см. ниже). Для его работы нужно установить MoonLoader.
 

Вложения

  • fix.lua
    226 байт · Просмотры: 3
  • Нравится
Реакции: Fridom3

Fridom3

Новичок
4
1
Так окей! Радует, что ты смог понять в чем дело. Вопрос в следующем, у меня до сегодняшнего дня не было в клиенте moonloader(a), приходиться его добавлять. Вроде бы ничего сложного через установщик все просто.

Загрузил твой скрипт fix.lua и захожу в игру, на удивление все без ошибок и вылетов. Отлично! Думаю я, но объекты все равно не принимают свой правильный угол наклона.. Сразу же подумал на moonloader, видимо не подгрузился. Лезу в логи moonloader.log и вижу там следующее - согласно строчкам о fix.lua скрипт загрузился но потом происходит прерывание и затем и выгрузка скрипта. В чем же дело!?

[17:19:48.064562] (system) fix.lua: Script terminated. (20BCA9D4)

[17:19:33.954273] (system) Session started.
[17:19:33.957273] (debug) Module handle: 7BE60000

MoonLoader v.026.5-beta loaded.
Developers: FYP, hnnssy, EvgeN 1137

Copyright (c) 2016, BlastHack Team
https://www.blast.hk/moonloader/

[17:19:33.957273] (info) Working directory: G:\MartinCRMP\moonloader
[17:19:33.957273] (debug) FP Control: 0009001F
[17:19:33.957273] (debug) Game: GTA SA 1.0.0.0 US
[17:19:33.957273] (system) Installing pre-game hooks...
[17:19:33.965276] (system) Hooks installed.
[17:19:37.844617] (debug) Initializing opcode handler table
[17:19:37.844617] (debug) package.path = G:\MartinCRMP\moonloader\lib\?.lua;G:\MartinCRMP\moonloader\lib\?\init.lua;G:\MartinCRMP\moonloader\?.lua;G:\MartinCRMP\moonloader\?\init.lua;.\?.lua;G:\MartinCRMP\moonloader\lib\?.luac;G:\MartinCRMP\moonloader\lib\?\init.luac;G:\MartinCRMP\moonloader\?.luac;G:\MartinCRMP\moonloader\?\init.luac;.\?.luac
[17:19:37.844617] (debug) package.cpath = G:\MartinCRMP\moonloader\lib\?.dll;
[17:19:37.884618] (system) Loading script 'G:\MartinCRMP\moonloader\fix.lua'...
[17:19:37.884618] (debug) New script: 20BCA9D4
[17:19:37.900728] (system) fix.lua: Loaded successfully.
[17:19:48.063562] (system) Installing post-load hooks...
[17:19:48.064562] (system) Hooks installed.
[17:19:48.064562] (system) fix.lua: Script terminated. (20BCA9D4)
[17:20:18.679440] (system) Unloading...
[17:20:18.693441] (system) Session terminated.
 

MrCreepTon

Неизвестный
Всефорумный модератор
2,283
5,191
Так окей! Радует, что ты смог понять в чем дело. Вопрос в следующем, у меня до сегодняшнего дня не было в клиенте moonloader(a), приходиться его добавлять. Вроде бы ничего сложного через установщик все просто.

Загрузил твой скрипт fix.lua и захожу в игру, на удивление все без ошибок и вылетов. Отлично! Думаю я, но объекты все равно не принимают свой правильный угол наклона.. Сразу же подумал на moonloader, видимо не подгрузился. Лезу в логи moonloader.log и вижу там следующее - согласно строчкам о fix.lua скрипт загрузился но потом происходит прерывание и затем и выгрузка скрипта. В чем же дело!?

[17:19:48.064562] (system) fix.lua: Script terminated. (20BCA9D4)
В этом ничего страшного нет. Скрипт меняет значения памяти и, так скажем, самоликвидируется в виду отсутствия необходимости работать дальше.
 
  • Нравится
Реакции: Vintik

Vintik

Через тернии к звёздам
Автор темы
Проверенный
1,566
1,045
В этом ничего страшного нет. Скрипт меняет значения памяти и, так скажем, самоликвидируется в виду отсутствия необходимости работать дальше.
Да, но и проблему не решает...)
 

copypaste_scripter

Известный
1,417
288
1748062322723.png


чтобы вот так на 90 градусов повернуть какие значения надо задавать я все равно не понял, чтобы 4 встал на место 6
 

Vintik

Через тернии к звёздам
Автор темы
Проверенный
1,566
1,045
Посмотреть вложение 270768

чтобы вот так на 90 градусов повернуть какие значения надо задавать я все равно не понял, чтобы 4 встал на место 6
Привет, всё зависит от направления осей.
Давай будем считать, что вертикальная ось — Z (так оно обычно).

А так шаблон такой:

1) Определить ось вращения (она же — нормаль к плоскости вращения). То есть ось, которая при повороте перейдёт в себя же.
В данном случае это вертикальная ось — при повороте 4 в 6 она останется на своём же месте.
Её координаты: (0, 0, 1) — так как по X, Y ничего не меняется, а Z увеличивается (либо уменьшается) на 1.

2) Определить угол вращения. В твоём случае это либо 90 (π/2 в радианах), либо -90 (-π/2 в радианах).
Попробуй и тот, и другой.

3) Вот из статьи:
Если мы вращаем объект на угол α «в плоскости», нормаль которой имеет координаты (x, y, z), то кватернион данного вращения будет иметь вид:
q = cos(α / 2) + sin(α / 2) * (x * i + y * j + z * k)
q = cos(45°) + sin(45°) * (0 * i + 0 * j + 1 * k) = cos(45°) + sin(45°) * k = 0.707 + 0.707 * k
Либо, если угол всё же -90°, тогда: q = 0.707 - 0.707 * k (так как косинус -45 остаётся тем же, а синус меняет знак).

Ответ:
q = 0.707 + 0.707 * k
В игровых движках обычно записывается либо (0.707, 0, 0, 0.707), если в записи (w, i, j, k) либо (0, 0, 0.707, 0.707), если в записи (i, j, k, w).
 
  • Нравится
Реакции: copypaste_scripter