faik003 Опубликовано 8 июня, 2018 Поделиться Опубликовано 8 июня, 2018 Всем привет. Занимаясь реверсингом, набрёл случайно на функцию, которая больно похожа на создание перспективной матрицы. Я перевел функцию в С++ (дизассемблерный листинг в IDA Pro и листинг, который вывел Visual Studio, полностью соответствуют друг другу), переименовал для удобства переменные и собственно сама функция выглядит так: Спойлер void Matrix4::sub_587DA0(float fov, float aspectRatio, float nearPlane, float farPlane, float a7) { double v7; this->mat[1][3] = this->mat[2][0] = this->mat[2][1] = this->mat[3][0] = this->mat[3][1] = 0; this->mat[0][1] = this->mat[0][2] = this->mat[0][3] = this->mat[1][0] = this->mat[1][2] = 0; this->mat[2][3] = 1.0f; this->mat[3][3] = 0; this->mat[0][0] = 1.0f / tan(0.5f * fov); this->mat[1][1] = this->mat[0][0] / aspectRatio; v7 = farPlane / (farPlane - nearPlane); this->mat[2][2] = v7; this->mat[3][2] = (a7 - nearPlane) * v7; } Matrix4 - класс, описывающий матрицу 4x4. Сразу скажу, что в линейной алгебре я не силен, но прошерстив интернет, вывел: fov - предположительно вертикальный угол обзора. aspectRatio - соотношение сторон. farPlane - ближний план отсечения. nearPlane - дальний план отсечения. Собственно, сами вопросы: 1) Действительно ли это матрица перспективной проекции? Если нет, то просьба обосновать свои мысли. Если да, то следующие вопросы являются дополнительными. 2) Почему в разных формулах элементы матрицы по индексам [0][0] и [1][1], которые собственно отвечают за скалирование по оси X и Y соответственно, инициализируются по-разному? Чтобы вы поняли, посмотрите на картинку с матрицей и сравните ее с моей функцией Спойлер 3) Почему элемент матрицы по индексу [2][3] иницализируются в одних формулах 1.0f, а в других -1.0f? Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 8 июня, 2018 Поделиться Опубликовано 8 июня, 2018 1. Неизвестно, надо восстановить откуда инициализируется и где используется эта функция т.к при инициализации должна быть нормализация значений на непредвиденный случай, а у тебя просто кусок кода, который неизвестно для чего используется. 2. Не все игры используют стандартные формулы для расчетов и почему в коде именно так, знают только разработчики 3. Такой же ответ как во 2-м пункте. Ссылка на комментарий Поделиться на другие сайты Поделиться
faik003 Опубликовано 8 июня, 2018 Автор Поделиться Опубликовано 8 июня, 2018 2 часа назад, partoftheworlD сказал: Неизвестно, надо восстановить откуда инициализируется и где используется эта функция Что самое забавное, функция вызывается только один раз. В функцию передаются значения через переменные, кроме последнего аргумента - там ноль. Перед этой функцией с матрицей больше ничего не происходит, она изначально инициализируется в моей функции. После инициализации матрицы она копируется в другую матрицу и затем идет просто перемножение матриц и куча других манипуляций, которые я не совсем понял, что делают. 2 часа назад, partoftheworlD сказал: Не все игры используют стандартные формулы для расчетов и почему в коде именно так, знают только разработчики Не спорю, но до этого я находил функции, которые явно работают с матрицами и кватернионами, так там все практически также, как в типичных формулах. в этом плане мне помогли исходники Quake 3 Arena, движок которой использовался при создании Treyarch NGL и , собственно, самой игры (Ultimate Spider-Man). Поэтому я надеялся, что разработчики не будут замарачиваться с созданием "нестандартных" функций. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения