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

Проблема с видовой матрицей [Phasmophobia]


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

19 минут назад, Antonshka сказал:

По моему опыту матрица почти всегда расположена рядом с координатами.

Почему у тебя на видео надпись двигается рывками?

 

Потому что я её рисую и перерисовываю каждый кадр + Bandicam пишет параллельно, потом упрощу немного задачу.

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

еще видовые матрицы делятся на два типа: Column-major и Row-major.
Если матрица в игре Row-major, то значения в ней так и идут: x11,x12,x13,x14 и так далее. Но могут быть и Column-major, значения в ней пойдут уже так: x11,x21,x31,x41 и так далее. Нужно это так же учитывать.
Для ознакомления: https://en.wikipedia.org/wiki/Row-_and_column-major_order

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

3 минуты назад, KRYPTOPUNK сказал:

еще видовые матрицы делятся на два типа: Column-major и Row-major.
Если матрица в игре Row-major, то значения в ней так и идут: x11,x12,x13,x14 и так далее. Но могут быть и Column-major, значения в ней пойдут уже так: x11,x21,x31,x41 и так далее. Нужно это так же учитывать.
Для ознакомления: https://en.wikipedia.org/wiki/Row-_and_column-major_order

Да, как раз на C# уже написал алгоритм для записи в одномерный массив column-major матрицы, таким же образом чтобы в обработку WorldToScreen() мой массив приходил таким же упорядоченным как и в других играх. Надеюсь что для column-major матрицы функцию WorldToScreen() не придётся переписывать.

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

14 часов назад, ChestGlaring сказал:

А что мешает взять dnSpy и просто найти, в каком методе используется видовая  матрица? Затем взять CE Mono и перейти по методу найденному в dnSpy.
Поиск можно начать с Camera, тем более, в зависимости от игры камер может быть несколько и у каждой будет своя матрица.

И да, Cheat Engine даже 7.0 не предлагает Dissest Mono, а отладчик OllyDbg не может присоединиться к процессу даже. Учитывая что в Cheat Engine если нашёл адрес с координатой и потом ищешь инструкцию, который пишет туда, то из Memory Viewer'а на ту же инструкцию тыкаешь правой кнопкой и хочешь найти к чему получает доступ эта инструкция, то он тебе выдает либо ничего либо какой-то левый адрес. Похоже это игра не до конца закончена оно и понятно, ранний доступ всё-таки, но всё равно даже так она как-то не так работает (это я про проблему описанную выше).

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

16 часов назад, ChestGlaring сказал:

А что мешает взять dnSpy и просто найти, в каком методе используется видовая  матрица? Затем взять CE Mono и перейти по методу найденному в dnSpy.
Поиск можно начать с Camera, тем более, в зависимости от игры камер может быть несколько и у каждой будет своя матрица.

Хотя вот качнул Cheat Engine 7.2 -> Mono есть.

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

Ты используешь матрицу 4x4 для вычисления X, Y координат. А если она в памяти будет в виде другой размерности, или может быть просто в виде Yaw, Pitch, Roll, X, Y, Z?

 

Я тоже хочу попробовать такое в одной гоночной игре, ради интереса. В ней есть матрица 1х4, есть 3х3, но нет 4х4. Вот я и думаю, как мне произвести вычисления X, Y координат по твоему примеру если в игре не используется 4х4 матрица.

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

8 часов назад, Antonshka сказал:

Ты используешь матрицу 4x4 для вычисления X, Y координат. А если она в памяти будет в виде другой размерности, или может быть просто в виде Yaw, Pitch, Roll, X, Y, Z?

 

Я тоже хочу попробовать такое в одной гоночной игре, ради интереса. В ней есть матрица 1х4, есть 3х3, но нет 4х4. Вот я и думаю, как мне произвести вычисления X, Y координат по твоему примеру если в игре не используется 4х4 матрица.

Я тоже думаю что матрица представлена в памяти как-то "не по обычному". Но вряд ли думаю что байты будут представлены так как ты описал выше (6 значений). Так как в любой игре всё это должно храниться в виде матрицы (как я читал) иначе от куда функция WorlsToScreen() будет брать все три вектора + 4 вектор (позиция), ведь каждый вектор это 4 байта => матрица 4x4 = 16 байт.

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

В общем спустя много времени я нашёл структуру очень похожу на видовую матрицу, однако есть одно отличие от тех, скриншоты которых были выше по теме:

 

2.png - Синий прямоугольник (предположительно видовая матрица), зелёный - координаты (меняются когда я передвигаюсь, мышь и соответственно камера не двигается). В общем всё как для Cod:MW2 и Amnesia.

 

А вот есть ещё оранжевый прямоугольник (поверх зелёного следовательно затрагивает зелёный). Значения в нём изменяются когда я хожу только влево и вправо (клавиши A, D). Это очень сильно похоже на поведение когда я прыгаю в Amnesia и CoD:MW2, так как там меняется лишь одна координата Z, а тут видимо эту особенность переняла другая координата, ведь если я с клавишами A, D буду ещё и камеру двигать то остальные координаты тоже начнут меняться.

 

Похоже здесь каждый элемент матрицы разбит на два значения, тогда вопрос:

такое разве возможно?

И как тогда мне конвертировать координаты объекта в экранные координаты с такой видовой матрицей?

 

Если каждый элемента матрицы действительно разбит на 2 значения, как тогда одномерный массив (32 элемента для такой матрицы 4x8 = 32) использовать в моей функции WorldToScreen()? Нужно складывать эти два значения или как-то по другому?

 

Решил через Mono попробовать, как раз нашёл метод класса Camera -> Camera.WorldToScreenPoint, который как раз таки должен использовать видовую матрицу для преобразования координат из 3D в 2D, вот только как найти эту самую матрицу, которую использует эта функция. Нужно регистры проверять или адреса (если использовать средства Cheat Engine)? Потому что, по моему мнению, метод того же класса Camera.GetStereoViewMatrix, не совсем подходит хотя, возможно, я ошибаюсь.

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

49 минут назад, Sergey99 сказал:

Решил через Mono попробовать, как раз нашёл метод класса Camera -> Camera.WorldToScreenPoint, который как раз таки должен использовать видовую матрицу для преобразования координат из 3D в 2D, вот только как найти эту самую матрицу, которую использует эта функция.

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

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

10 часов назад, roma912 сказал:

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

И так тоже, но разве это не через инъекции кода делается, например, все хаки для Phasmophobia, которые существуют они все поголовно являются .dll файлами, которые инжектятся внутрь. А моя задача состоит в том чтобы получить координаты на экране, зная координаты в 3D и видовую матрицу (чтобы не использовать инъекции когда всегда).

 

И да, я знаю что через Mono тоже можно инжектиться.

 

10 часов назад, Antonshka сказал:

Я пока не знаю тоже. Планирую на днях заняться темой преобразования 3D в 2D. Пока занимаюсь переустановкой Windows.

Хех ну да, Windows бывает капризная :)

 

10 часов назад, roma912 сказал:

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

Или же ты имеешь ввиду вызывать через движк Lua в Cheat Engine или Auto Assembler? Просто конкретно как вызывать методы через Auto Assembler не знаю, а вот документацию по CE Lua успел почитать.

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

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

Или же ты имеешь ввиду вызывать через движк Lua в Cheat Engine или Auto Assembler? Просто конкретно как вызывать методы через Auto Assembler не знаю, а вот документацию по CE Lua успел почитать.

Ну это уже слишком...
Хотя тоже имеет право на жизнь
Мне проще написать dll на с++ которая вызовет просто эту функцию по адресу и все. Тем более все аргументы ты уже знаешь через декомпилятор .net

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

@Sergey99 не нужно устраивать чат из форума. Отвечать нужно в одном сообщение, а не в нескольких последовательных. И цитировать только ту часть, на которую отвечаешь. Это первое и последнее устное предупреждение. Далее будут выдаваться преды.

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

3 часа назад, Xipho сказал:

@Sergey99 не нужно устраивать чат из форума. Отвечать нужно в одном сообщение, а не в нескольких последовательных. И цитировать только ту часть, на которую отвечаешь. Это первое и последнее устное предупреждение. Далее будут выдаваться преды.

Понял, принял

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

4 часа назад, Antonshka сказал:

@Sergey99 как успехи с поиском матрицы?

 

Всё нашёл, я создал топик на иностранном форуме там мы вместе решили вопрос, так как я понимаю принцип работы матрицы и  знаю технический английски :). Я готовлю детальный разбор по этой теме для этого топика или выведу в отдельный гайдик, не знаю в общем.

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

8 часов назад, Sergey99 сказал:

Всё нашёл, я создал топик на иностранном форуме там мы вместе решили вопрос, так как я понимаю принцип работы матрицы и  знаю технический английски :). Я готовлю детальный разбор по этой теме для этого топика или выведу в отдельный гайдик, не знаю в общем.

Отлично, мне очень интересно

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

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

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

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