Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Вопрос Overwatch 2 — Структура костей и трансформация для Bone ESP

Sloppy
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
13 Фев 2026
Сообщения
724
Реакции
18
Парни, уже несколько дней долблюсь в реверс Overwatch 2, пытаюсь довести до ума Bone ESP, но застрял на этапе отрисовки скелета. Данные читаются, индексы валидные, но на экране получается каша: либо кости схлопываются в одну точку в центре модели, либо разлетаются веером при повороте камеры.

Что имеем по оффсетам (актуально на данный момент):
  1. meshComp + 0x8B0 —> указатель на boneData
  2. boneData + 0x20 —> boneBase
  3. boneData + 0x00 —> boneList
  4. boneList + 0x66 —> количество костей (обычно около 13 на героя)
  5. boneList + 0x38 —> таблица ID (idTable)
  6. Stride — 0x30

Проблема в том, что когда я пытаюсь вытащить Vec3 из структуры (пробовал смещения +0x20, +0x00), координаты явно локальные и очень маленькие (в районе 0.7-0.9 единиц). Обычное сложение entity origin + local дает «спрессованный» скелет в ногах у персонажа.

Код:
Expand Collapse Copy
static inline int ReadBones(uintptr_t meshComp, uintptr_t movComp, const Vec3& origin, Vec3* out, int maxBones) {
    const uintptr_t boneData = mem::Read<uintptr_t>(meshComp + 0x8B0);
    const uintptr_t boneBase = mem::Read<uintptr_t>(boneData + 0x20);
    const uintptr_t boneList = mem::Read<uintptr_t>(boneData + 0x00);
    const uint16_t boneCount = mem::Read<uint16_t>(boneList + 0x66);
    const uintptr_t idTable = mem::Read<uintptr_t>(boneList + 0x38);

    uint32_t id_table[200];
    mem::ReadBuf(idTable, id_table, boneCount * sizeof(uint32_t));

    char* buf = (char*)malloc(boneCount * 0x30);
    mem::ReadBuf(boneBase, buf, boneCount * 0x30);

    for (int i = 0; i < (int)boneCount; ++i) {
        const uint32_t boneId = id_table[i];
        const Vec3* local = reinterpret_cast<const Vec3*>(buf + i * 0x30 + 0x20);
        
        // Вот тут явно не хватает трансформации
        out[boneId] = { origin.x + local->x, origin.y + local->y, origin.z + local->z };
    }
    free(buf);
    return 1;
}

Мои мысли и вопросы к тем, кто ковырял движок Близзов:
1. Где брать ротацию? Пробовал дергать yaw из movComp + 0x80, но при повороте дичи становится еще больше. Похоже, там нужны кватернионы или матрица трансформации для каждой кости.
2. Пространство координат: Кости в OW2 стоп пудово лежат в local space. Но как их правильно развернуть в world space с учетом ориентации модельки?
3. Структура: Страйд 0x30 кажется верным, но может Vec3 лежит не по +0x20? Хотя значения похожи на правду.

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

Давайте обсудим, наверняка кто-то уже сталкивался с этим «схлопыванием» скелета.
 
Назад
Сверху Снизу