Перейти к содержанию

[Ultimate Spider-Man] Реверсинг функции инициализации матрицы перспективной проекции


Рекомендуемые сообщения

Всем привет. Занимаясь реверсингом, набрёл случайно на функцию, которая больно похожа на создание перспективной матрицы. Я перевел функцию в С++ (дизассемблерный листинг в 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 соответственно, инициализируются по-разному? Чтобы вы поняли, посмотрите на картинку с матрицей и сравните ее с моей функцией
 

Спойлер

41e032082b374f319b00a880772a3395.PNG

3) Почему элемент матрицы по индексу [2][3] иницализируются в одних формулах 1.0f, а в других -1.0f?

Ссылка на комментарий
Поделиться на другие сайты

  • faik003 изменил название на [Ultimate Spider-Man] Реверсинг функции инициализации матрицы перспективной проекции

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

2. Не все игры используют стандартные формулы для расчетов и почему в коде именно так, знают только разработчики

3. Такой же ответ как во 2-м пункте.

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, partoftheworlD сказал:

Неизвестно, надо восстановить откуда инициализируется и где используется эта функция

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

 

2 часа назад, partoftheworlD сказал:

Не все игры используют стандартные формулы для расчетов и почему в коде именно так, знают только разработчики

Не спорю, но до этого я находил функции, которые явно работают с матрицами и кватернионами, так там все практически также, как в типичных формулах. в этом плане мне помогли исходники Quake 3 Arena, движок которой использовался при создании Treyarch NGL и , собственно, самой игры (Ultimate Spider-Man). Поэтому я надеялся, что разработчики не будут замарачиваться с созданием "нестандартных" функций.

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.