Lua Morph - лепим из себя чудовище

MrCreepTon

Неизвестный
Автор темы
Всефорумный модератор
2,203
4,985
morph.jpg

При помощи данного небольшого скрипта вы можете двигать кости персонажа. Может подойти для каких-то хоррор роликов или еще чего-либо.
Эффект визуальный (однако при желании можно сделать синхронизацию с другими пользователями скрипта 😄).

Установка: содержимое архива закинуть в папку moonloader
Команда: /morph
Требования: Memory, ImGui
1711396797714.png

Если у кого-то есть информация по тому, как можно вращать кости, отпишите в личку, либо сюда. Будет очень полезным для проекта VR.
 

Вложения

  • morph.zip
    201.2 KB · Просмотры: 367

VanoKLR

Известный
850
464
тоесть я могу свастон сделать?
Без поворотов будет кривой свастон. Хотя мб если изгальнуться и включить воображение...
да норм получилось
1711408227025.png


Посмотреть вложение 235525

При помощи данного небольшого скрипта вы можете двигать кости персонажа. Может подойти для каких-то хоррор роликов или еще чего-либо.
Эффект визуальный (однако при желании можно сделать синхронизацию с другими пользователями скрипта 😄).

Установка: содержимое архива закинуть в папку moonloader
Команда: /morph
Требования: Memory, ImGui

Если у кого-то есть информация по тому, как можно вращать кости, отпишите в личку, либо сюда. Будет очень полезным для проекта VR.
не хватает только кнопки ресетнуть всё

1711409068951.png
 
Последнее редактирование:

Bramble

Известный
1,201
197
ахуенный скрипт, только нехватает кнопки сброса все настроек
 

Fomikus

Известный
Проверенный
475
345
Если у кого-то есть информация по тому, как можно вращать кости, отпишите в личку, либо сюда. Будет очень полезным для проекта VR.
1711414158210.png

Но либо я дурак (что в целом ну, с памятью не дружу, там еще указатели вот это на CBone + 0x10 + 0x4 * номер оси и вроде там лежит флоат, если менять - куда-то двигается кость, но вроде там указатель и надо сначала
memory.getuint32(CBone + 0x10) и от него уже + 0x4, но там ничего нет)
И вообще после перевода в углы Эйлера у меня на одной оси NaN, ну крч что-то там есть точно, но я нуб
m_vTranslation - вроде как roll, pitch, yaw и вроде игра сама обновляет
Высер:
function quaternionToEulerAngles(quat)
    local pitch = math.asin(2 * (quat.w * quat.y - quat.x * quat.z))
    local roll = math.atan2(2 * (quat.w * quat.x + quat.y * quat.z), 1 - 2 * (quat.x^2 + quat.y^2))
    local yaw = math.atan2(2 * (quat.w * quat.z + quat.x * quat.y), 1 - 2 * (quat.y^2 + quat.z^2))
    return roll, pitch, yaw
end

function eulerAnglesToQuaternion(roll, pitch, yaw)
    local cy = math.cos(yaw * 0.5)
    local sy = math.sin(yaw * 0.5)
    local cp = math.cos(pitch * 0.5)
    local sp = math.sin(pitch * 0.5)
    local cr = math.cos(roll * 0.5)
    local sr = math.sin(roll * 0.5)

    local qw = cy * cp * cr + sy * sp * sr
    local qx = cy * cp * sr - sy * sp * cr
    local qy = sy * cp * sr + cy * sp * cr
    local qz = sy * cp * cr - cy * sp * sr

    return {w = qw, x = qx, y = qy, z = qz}
end

function setBoneQuat(boneId, quat)
    -- CBone
    -- 0x0000 | BYTE          m_bFlags
    -- 0x0004 | CVector       m_vOffset  // Статичное смещение относительно родительской кости
    -- 0x0010 | СHAnimIFrame *m_pIFrame  // Указатель на структуру, которая содержит интерполированные данные о положении кости
    -- 0x0014 | DWORD         m_dwNodeId // Специальный идентификатор кости

    -- СHAnimIFrame
    -- 0x0000 | CQuat   m_qOrientation
    -- 0x0010 | CVector m_vTranslation
    local cPed = memory.getuint32(0xB6F5F0)
    local cBone = memory.getuint32(cPed + 0x488 + 0x4 * boneId)
    memory.setfloat(cBone + 0x10 + 0x4 * 1, quat.w)
    memory.setfloat(cBone + 0x10 + 0x4 * 2, quat.x)
    memory.setfloat(cBone + 0x10 + 0x4 * 3, quat.y)
    memory.setfloat(cBone + 0x10 + 0x4 * 4, quat.z)
end

function getBoneQuat(boneId)
    local cPed = memory.getuint32(0xB6F5F0)
    local cBone = memory.getuint32(cPed + 0x488 + 0x4 * boneId)
    local quat = {
        w = memory.getfloat(cBone + 0x10 + 0x4 * 1),
        x = memory.getfloat(cBone + 0x10 + 0x4 * 2),
        y = memory.getfloat(cBone + 0x10 + 0x4 * 3),
        z = memory.getfloat(cBone + 0x10 + 0x4 * 4)
    }
    return quat
end
 

MrCreepTon

Неизвестный
Автор темы
Всефорумный модератор
2,203
4,985
Посмотреть вложение 235554
Но либо я дурак (что в целом ну, с памятью не дружу, там еще указатели вот это на CBone + 0x10 + 0x4 * номер оси и вроде там лежит флоат, если менять - куда-то двигается кость, но вроде там указатель и надо сначала
memory.getuint32(CBone + 0x10) и от него уже + 0x4, но там ничего нет)
И вообще после перевода в углы Эйлера у меня на одной оси NaN, ну крч что-то там есть точно, но я нуб
m_vTranslation - вроде как roll, pitch, yaw и вроде игра сама обновляет
Высер:
function quaternionToEulerAngles(quat)
    local pitch = math.asin(2 * (quat.w * quat.y - quat.x * quat.z))
    local roll = math.atan2(2 * (quat.w * quat.x + quat.y * quat.z), 1 - 2 * (quat.x^2 + quat.y^2))
    local yaw = math.atan2(2 * (quat.w * quat.z + quat.x * quat.y), 1 - 2 * (quat.y^2 + quat.z^2))
    return roll, pitch, yaw
end

function eulerAnglesToQuaternion(roll, pitch, yaw)
    local cy = math.cos(yaw * 0.5)
    local sy = math.sin(yaw * 0.5)
    local cp = math.cos(pitch * 0.5)
    local sp = math.sin(pitch * 0.5)
    local cr = math.cos(roll * 0.5)
    local sr = math.sin(roll * 0.5)

    local qw = cy * cp * cr + sy * sp * sr
    local qx = cy * cp * sr - sy * sp * cr
    local qy = sy * cp * sr + cy * sp * cr
    local qz = sy * cp * cr - cy * sp * sr

    return {w = qw, x = qx, y = qy, z = qz}
end

function setBoneQuat(boneId, quat)
    -- CBone
    -- 0x0000 | BYTE          m_bFlags
    -- 0x0004 | CVector       m_vOffset  // Статичное смещение относительно родительской кости
    -- 0x0010 | СHAnimIFrame *m_pIFrame  // Указатель на структуру, которая содержит интерполированные данные о положении кости
    -- 0x0014 | DWORD         m_dwNodeId // Специальный идентификатор кости

    -- СHAnimIFrame
    -- 0x0000 | CQuat   m_qOrientation
    -- 0x0010 | CVector m_vTranslation
    local cPed = memory.getuint32(0xB6F5F0)
    local cBone = memory.getuint32(cPed + 0x488 + 0x4 * boneId)
    memory.setfloat(cBone + 0x10 + 0x4 * 1, quat.w)
    memory.setfloat(cBone + 0x10 + 0x4 * 2, quat.x)
    memory.setfloat(cBone + 0x10 + 0x4 * 3, quat.y)
    memory.setfloat(cBone + 0x10 + 0x4 * 4, quat.z)
end

function getBoneQuat(boneId)
    local cPed = memory.getuint32(0xB6F5F0)
    local cBone = memory.getuint32(cPed + 0x488 + 0x4 * boneId)
    local quat = {
        w = memory.getfloat(cBone + 0x10 + 0x4 * 1),
        x = memory.getfloat(cBone + 0x10 + 0x4 * 2),
        y = memory.getfloat(cBone + 0x10 + 0x4 * 3),
        z = memory.getfloat(cBone + 0x10 + 0x4 * 4)
    }
    return quat
end
m_pIFrame является указателем. Потому прежде чем читать кватернионы и т.д. следует сделать примерно следующее:
Lua:
local m_pIFrame = memory.getuint32(cBone + 0x10)
Ну и соответственно смещения для w тоже не требуется и будет начинаться с 0x4 * 0.

Интересно, что в plugin-sdk еще есть в структуре какие-то указатели на кадры, но в действительности я их не заметил.
1711451600234.png

(а может и есть, пока хз)

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

1711451681666.png
 
Последнее редактирование: