Подведи собственные итоги года совместно с YOUGAME и забери ценные призы! Перейти

Вопрос BoneMatrix

  • Автор темы Автор темы Tifok
  • Дата начала Дата начала
Пользователь
Пользователь
Статус
Оффлайн
Регистрация
10 Ноя 2019
Сообщения
839
Реакции
135
Screenshot (4).png

Не понимаю откуда берется matrix + 0x30,конкретнее значение 0x30 откуда оно берется и как самому его найти?Также значения 0xC,0x1C,0x2C.
 
Матрица 3x4
C++:
Expand Collapse Copy
union {
        float m[3][4]; // 0000
        struct {
            float m00, m01, m02, m03; // 0000
            float m10, m11, m12, m13; // 0010
            float m20, m21, m22, m23; // 0020
        };
    };
Размер одного float = 4 байта, в матрице их 4 на 3, то есть 4 * 3 * 4 = 48 = 0x30 (в хексе), т.е. 0x30 это размер матрицы одной кости.
Т.к. они идут друг за другом умножается на индекс.
0xC/0x1C/0x2C это 3 колонка в каждой строке.
Матрица описывает поворот в 3 на 3 (от m00 до m22) и описывает основание (координату) xyz в m03,m13,m23.
То есть этот код просто возвращает координату каждой кости вытаскивания основание из матрицы.
 
Матрица 3x4
C++:
Expand Collapse Copy
union {
        float m[3][4]; // 0000
        struct {
            float m00, m01, m02, m03; // 0000
            float m10, m11, m12, m13; // 0010
            float m20, m21, m22, m23; // 0020
        };
    };
Размер одного float = 4 байта, в матрице их 4 на 3, то есть 4 * 3 * 4 = 48 = 0x30 (в хексе), т.е. 0x30 это размер матрицы одной кости.
Т.к. они идут друг за другом умножается на индекс.
0xC/0x1C/0x2C это 3 колонка в каждой строке.
Матрица описывает поворот в 3 на 3 (от m00 до m22) и описывает основание (координату) xyz в m03,m13,m23.
То есть этот код просто возвращает координату каждой кости вытаскивания основание из матрицы.
Спасибо за ответ, где можно почитать об этом?
 
где можно почитать об этом
Вообще эта структура из кода игры и она описана тут
Пожалуйста, авторизуйтесь для просмотра ссылки.
.
А насчет почитать, дело в том чтобы дойти до матриц нужно сперва знать кучу другой информации (про вектора, и тд.), поэтому за одну статью вряд ли поймешь, но к примеру можешь посмотреть 3Blue1Brown перевод на ютубе, там есть небольшой курс по линейной алгебре, и там не только описывается но и показывается как матрицы действуют.
 
Вообще эта структура из кода игры и она описана тут
Пожалуйста, авторизуйтесь для просмотра ссылки.
.
А насчет почитать, дело в том чтобы дойти до матриц нужно сперва знать кучу другой информации (про вектора, и тд.), поэтому за одну статью вряд ли поймешь, но к примеру можешь посмотреть 3Blue1Brown перевод на ютубе, там есть небольшой курс по линейной алгебре, и там не только описывается но и показывается как матрицы действуют.
Спасибо, не я не имел ввиду 1 статью, а именно где почитать обширную информацию, благодарю
 
Вообще эта структура из кода игры и она описана тут
Пожалуйста, авторизуйтесь для просмотра ссылки.
.
А насчет почитать, дело в том чтобы дойти до матриц нужно сперва знать кучу другой информации (про вектора, и тд.), поэтому за одну статью вряд ли поймешь, но к примеру можешь посмотреть 3Blue1Brown перевод на ютубе, там есть небольшой курс по линейной алгебре, и там не только описывается но и показывается как матрицы действуют.
Хотел бы задать ещё вопросик
Что за значение 0x10 и почему i-1.
Сорри я не знаю почему так качество схавало, или вот эта часть кода
Код:
Expand Collapse Copy
for(int i = 0;i<=64;i++){
const int Target = mem.Read<int>(Client.Base + dwEntityList + (i-1) * 0x10);
 

Вложения

  • Screenshot_20210508_062300.jpg
    Screenshot_20210508_062300.jpg
    13.8 KB · Просмотры: 10
pp[0] = Meneycir.Read<float>(bonePlayer + (0x30 * 6) + 0xC);
pp[1] = Meneycir.Read<float>(bonePlayer + (0x30 * 6) + 0x1C);
pp[2] = Meneycir.Read<float>(bonePlayer + (0x30 * 6) + 0x2C);
 
for(int i = 0;i<=64;i++){ const int Target = mem.Read<int>(Client.Base + dwEntityList + (i-1) * 0x10);
Тут проходится список сущностей, каждая описывается в таком формате:
C++:
Expand Collapse Copy
class CEntInfo
{
public:
    IHandleEntity* m_pEntity; // 0000 указатель на сущность
    int m_SerialNumber; // 0004
    CEntInfo* m_pPrev; // 0008 предыдущая ячейка списка
    CEntInfo* m_pNext; // 000C следующая ячейка списка
}; // 0010
Сам список сущностей двусвязный, поэтому чтобы удобно проходить по ним вперед назад есть ссылки на след/пред ячейки.
0x10 это размер одной ячейки в списке.
В твоем коде есть неявное смещение +0x0, т.е. читается именно m_pEntity в каждой ячейке списка.
Сами сущности в списке распределены определенным образом:
- 0 всегда мир
- 1-65 это игроки, их максимум 64 может быть, не все из них заполнены
- 65+ остальные сущности
Так же я думаю в твоем коде есть ошибка, потому как итерация начинается с 0, но в первом проходе будет 0 - 1 = -1 т.е. переполнение.
 
Назад
Сверху Снизу