Вопрос BoneMatrix

Пользователь
Статус
Оффлайн
Регистрация
10 Ноя 2019
Сообщения
839
Реакции[?]
135
Поинты[?]
0
Screenshot (4).png
Не понимаю откуда берется matrix + 0x30,конкретнее значение 0x30 откуда оно берется и как самому его найти?Также значения 0xC,0x1C,0x2C.
 
Keine panik!
Эксперт
Статус
Оффлайн
Регистрация
29 Апр 2020
Сообщения
812
Реакции[?]
417
Поинты[?]
49K
Матрица 3x4
C++:
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.
То есть этот код просто возвращает координату каждой кости вытаскивания основание из матрицы.
 
Пользователь
Статус
Оффлайн
Регистрация
10 Ноя 2019
Сообщения
839
Реакции[?]
135
Поинты[?]
0
Матрица 3x4
C++:
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.
То есть этот код просто возвращает координату каждой кости вытаскивания основание из матрицы.
Спасибо за ответ, где можно почитать об этом?
 
Keine panik!
Эксперт
Статус
Оффлайн
Регистрация
29 Апр 2020
Сообщения
812
Реакции[?]
417
Поинты[?]
49K
где можно почитать об этом
Вообще эта структура из кода игры и она описана тут
Пожалуйста, авторизуйтесь для просмотра ссылки.
.
А насчет почитать, дело в том чтобы дойти до матриц нужно сперва знать кучу другой информации (про вектора, и тд.), поэтому за одну статью вряд ли поймешь, но к примеру можешь посмотреть 3Blue1Brown перевод на ютубе, там есть небольшой курс по линейной алгебре, и там не только описывается но и показывается как матрицы действуют.
 
Пользователь
Статус
Оффлайн
Регистрация
10 Ноя 2019
Сообщения
839
Реакции[?]
135
Поинты[?]
0
Вообще эта структура из кода игры и она описана тут
Пожалуйста, авторизуйтесь для просмотра ссылки.
.
А насчет почитать, дело в том чтобы дойти до матриц нужно сперва знать кучу другой информации (про вектора, и тд.), поэтому за одну статью вряд ли поймешь, но к примеру можешь посмотреть 3Blue1Brown перевод на ютубе, там есть небольшой курс по линейной алгебре, и там не только описывается но и показывается как матрицы действуют.
Спасибо, не я не имел ввиду 1 статью, а именно где почитать обширную информацию, благодарю
 
Пользователь
Статус
Оффлайн
Регистрация
10 Ноя 2019
Сообщения
839
Реакции[?]
135
Поинты[?]
0
Вообще эта структура из кода игры и она описана тут
Пожалуйста, авторизуйтесь для просмотра ссылки.
.
А насчет почитать, дело в том чтобы дойти до матриц нужно сперва знать кучу другой информации (про вектора, и тд.), поэтому за одну статью вряд ли поймешь, но к примеру можешь посмотреть 3Blue1Brown перевод на ютубе, там есть небольшой курс по линейной алгебре, и там не только описывается но и показывается как матрицы действуют.
Хотел бы задать ещё вопросик
Что за значение 0x10 и почему i-1.
Сорри я не знаю почему так качество схавало, или вот эта часть кода
Код:
for(int i = 0;i<=64;i++){
const int Target = mem.Read<int>(Client.Base + dwEntityList + (i-1) * 0x10);
 

Вложения

Участник
Статус
Оффлайн
Регистрация
16 Янв 2018
Сообщения
574
Реакции[?]
183
Поинты[?]
2K
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);
 
Keine panik!
Эксперт
Статус
Оффлайн
Регистрация
29 Апр 2020
Сообщения
812
Реакции[?]
417
Поинты[?]
49K
for(int i = 0;i<=64;i++){ const int Target = mem.Read<int>(Client.Base + dwEntityList + (i-1) * 0x10);
Тут проходится список сущностей, каждая описывается в таком формате:
C++:
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 т.е. переполнение.
 
Сверху Снизу