botmaker Опубликовано 22 мая, 2022 Поделиться Опубликовано 22 мая, 2022 Приветствую, есть игра с камерой по типу GTA ( вид сверху сзади, т. е игрок бегает перед камерой) Имеются координаты камеры, игрока, цели. Как найти координаты цели, зная эти параметры? Пишу на C# есть классы типа Vector3 и тд, может быть это облегчит задачу. var mvMatrix = Matrix4x4.CreateLookAt(Player.CamPos, Player.Coord, new Vector3(0, 0, 1)); var pMatrix = Matrix4x4.CreatePerspective(XSize, YSize, 0.1f, 1.0f); Matrix4x4.Invert(pMatrix, out pMatrix); var world = Matrix4x4.Multiply(mvMatrix, pMatrix); var ViewMatrix = Vector3.Transform(target.Coord, world); var ViewMatrix2 = Vector3.Transform(Player.Coord, world); Console.WriteLine($"Target transform: {ViewMatrix}"); Console.WriteLine($"Player transform: {ViewMatrix2}"); YOffset -= (int)(ViewMatrix.Y / 250.0f); XOffset += (int)(ViewMatrix.X / 250.0f); SetCursorPos(XOffset, YOffset); При увеличении дистанции наблюдается погрешность, вблизи работает неплохо. Что делать, как решатся такая задача? Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 22 мая, 2022 Поделиться Опубликовано 22 мая, 2022 Навскидку - приведение к int с отбросом дробной части может привести к погрешности Ссылка на комментарий Поделиться на другие сайты Поделиться
botmaker Опубликовано 22 мая, 2022 Автор Поделиться Опубликовано 22 мая, 2022 17 минут назад, Xipho сказал: Навскидку - приведение к int с отбросом дробной части может привести к погрешности OffsetX & OffsetY - позиция курсора на экране, тоже int, погрешность примерно +/- 1 пиксель, на сколько я вижу. А текущая погрешность ощущается, как 10-40 пикселей. Не уверен, что ошибка именно в этом. Ссылка на комментарий Поделиться на другие сайты Поделиться
KRYPTOPUNK Опубликовано 22 мая, 2022 Поделиться Опубликовано 22 мая, 2022 Ты бы хоть сказал, left-handed или right-handed координатная система, и что ты кодом делаешь. Что за 250.0f? Ты спрашиваешь, как найти координаты цели, но говоришь, что они известны. В общем, подробнее объясни, что происходит и что ты делаешь Ссылка на комментарий Поделиться на другие сайты Поделиться
botmaker Опубликовано 22 мая, 2022 Автор Поделиться Опубликовано 22 мая, 2022 16 минут назад, KRYPTOPUNK сказал: Ты спрашиваешь, как найти координаты цели, но говоришь, что они известны. Как найти координаты цели в окне игры 2D холст {X,Y}. Мне известны координаты в игровом пространстве - в 3D {X,Y,Z}. 18 минут назад, KRYPTOPUNK сказал: Что за 250.0f? Это преобразование полученной видовой матрицы к координатам курсора, наиболее похожая на правду пропорция. Но в особо ближних дистанциях и более дальних дает существенную погрешность. 20 минут назад, KRYPTOPUNK сказал: Ты бы хоть сказал, left-handed или right-handed координатная система, и что ты кодом делаешь. Я не знаю, о чем идет речь. Что вы имеете в виду? Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 24 мая, 2022 Поделиться Опубликовано 24 мая, 2022 В 22.05.2022 в 6:15 PM, botmaker сказал: Это преобразование полученной видовой матрицы к координатам курсора, наиболее похожая на правду пропорция. Но в особо ближних дистанциях и более дальних дает существенную погрешность. Выглядит как будто эта пропорция должна высчитываться программно, а не быть константой. Ссылка на комментарий Поделиться на другие сайты Поделиться
botmaker Опубликовано 24 мая, 2022 Автор Поделиться Опубликовано 24 мая, 2022 1 час назад, Xipho сказал: Выглядит как будто эта пропорция должна высчитываться программно, а не быть константой. Какие варианты? Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 24 мая, 2022 Поделиться Опубликовано 24 мая, 2022 1 час назад, botmaker сказал: Какие варианты? Проведи несколько экспериментов с разными дистанциями и разными пропорциями. Выведи формулу, опиши ее в коде. Ссылка на комментарий Поделиться на другие сайты Поделиться
KRYPTOPUNK Опубликовано 24 мая, 2022 Поделиться Опубликовано 24 мая, 2022 В 22.05.2022 в 5:47 PM, botmaker сказал: погрешность примерно +/- 1 пиксель, У тебя не может быть погрешность примерно +- 1 пиксель, потому что каст к инту может отбросить только с одной стороны .9, так что глупо так считать. Если ты пишешь на C#, я так понимаю, у тебя игра на Юнити. В этом случае есть штука, которая называется Camera.worldToCameraMatrix, которая отдаст тебе матрицу трансформирования мировых координат в координаты камеры. Однако, там есть сноска Цитата Note that camera space matches OpenGL convention: camera's forward is the negative Z axis. This is different from Unity's convention, where forward is the positive Z axis. о которой нужно помнить. Ссылка на комментарий Поделиться на другие сайты Поделиться
botmaker Опубликовано 24 мая, 2022 Автор Поделиться Опубликовано 24 мая, 2022 10 минут назад, KRYPTOPUNK сказал: Если ты пишешь на C#, я так понимаю, у тебя игра на Юнити. Это мнение ошибочно. Да, я пишу на C#, но без Юнити, это чит, читающий память игры. Поэтому использовать данный метод просто неуместно. Есть ли другие варианты? Ссылка на комментарий Поделиться на другие сайты Поделиться
KRYPTOPUNK Опубликовано 24 мая, 2022 Поделиться Опубликовано 24 мая, 2022 3 минуты назад, botmaker сказал: Да, я пишу на C#, но без Юнити, это чит, читающий память игры. Очень странный выбор, но судить не буду А найти направление (или поворот) камеры и направить камеру на "таргет" не вариант? Ссылка на комментарий Поделиться на другие сайты Поделиться
botmaker Опубликовано 24 мая, 2022 Автор Поделиться Опубликовано 24 мая, 2022 21 минуту назад, KRYPTOPUNK сказал: Очень странный выбор, но судить не буду А найти направление (или поворот) камеры и направить камеру на "таргет" не вариант? Направление камеры не удалось найти. Предположительно, камера направлена на персонажа игры. Вид сзади, как в гта. Как найти направление камеры пока что не знаю, все остальное искал через CheatEngine. Есть только координаты камеры, координаты игрока, направление игрока (в градусах) и координаты цели. Все приведенные координаты в 3D {x, y, z} Ссылка на комментарий Поделиться на другие сайты Поделиться
botmaker Опубликовано 25 мая, 2022 Автор Поделиться Опубликовано 25 мая, 2022 Где найти того, кто мог бы решить вопрос за вознаграждение ? (это не оффлайн игра) Ссылка на комментарий Поделиться на другие сайты Поделиться
KRYPTOPUNK Опубликовано 25 мая, 2022 Поделиться Опубликовано 25 мая, 2022 18 часов назад, botmaker сказал: Предположительно, камера направлена на персонажа игры Тогда можно предположить, что вращение камеры равно вращению персонажа? Если камера стоит за спиной персонажа, то они могут смотреть в одном направлении. Ссылка на комментарий Поделиться на другие сайты Поделиться
botmaker Опубликовано 25 мая, 2022 Автор Поделиться Опубликовано 25 мая, 2022 4 минуты назад, KRYPTOPUNK сказал: Тогда можно предположить, что вращение камеры равно вращению персонажа? Если камера стоит за спиной персонажа, то они могут смотреть в одном направлении. Да, это так. Они смотрят в одном направлении относительно плоскости XY, на счет оси Z - не совсем, скорее камера под углом -45 градусов по отношению к плоскости XY. Ссылка на комментарий Поделиться на другие сайты Поделиться
KRYPTOPUNK Опубликовано 25 мая, 2022 Поделиться Опубликовано 25 мая, 2022 6 минут назад, botmaker сказал: Да, это так. Они смотрят в одном направлении относительно плоскости XY Так это же в Cheat Engine можно найти, а отличия искать уже в каком нибудь ReClass или в инспекторе структур Cheat Engine. Отличие по Z -- наша камера. Ссылка на комментарий Поделиться на другие сайты Поделиться
botmaker Опубликовано 25 мая, 2022 Автор Поделиться Опубликовано 25 мая, 2022 36 минут назад, KRYPTOPUNK сказал: а отличия искать уже в каком нибудь ReClass Отличия чего? Направление камеры может быть задано, как вектор, а может быть, как два угла. Может быть как видовая матрица 4x4. У вас есть знания в этой сфере, может быть есть желание поучаствовать в написании модуля за вознаграждение? Есть наработки. Задача только в том, чтобы с достоверной точностью сопоставить координаты игровых объектов 3д в 2д перспективу на экране Ссылка на комментарий Поделиться на другие сайты Поделиться
KRYPTOPUNK Опубликовано 25 мая, 2022 Поделиться Опубликовано 25 мая, 2022 1 час назад, botmaker сказал: Направление камеры может быть задано, как вектор, а может быть, как два угла. Чаще всего "направление" это "поворот", так что это почти всегда вектор или кватернионы. Потому что камера почти всегда логический объект, который так же имеет позицию и поворот. Если они заданы как два угла, допустим, как в движке Source, то вообще все намного легче искать, но эти углы нужно будет рассчитывать, если захочешь напрямую манипулировать камерой. 1 час назад, botmaker сказал: может быть есть желание поучаствовать в написании модуля за вознаграждение? К сожалению, у меня нет времени, так как основная работа есть, да и C# я не люблю и не пишу на нём. Ссылка на комментарий Поделиться на другие сайты Поделиться
botmaker Опубликовано 25 мая, 2022 Автор Поделиться Опубликовано 25 мая, 2022 43 минуты назад, KRYPTOPUNK сказал: или кватернионы. Этого я опасаюсь больше всего. я их ни в жизнь не найду при помощи CE. 46 минут назад, KRYPTOPUNK сказал: да и C# я не люблю и не пишу на нём. Было бы достаточно алгоритма, мне не удается его понять до сих пор. Пробовал много формул, но нужной точности не добился ни с одной из них. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 31 мая, 2022 Поделиться Опубликовано 31 мая, 2022 В 25.05.2022 в 2:18 PM, botmaker сказал: Было бы достаточно алгоритма, мне не удается его понять до сих пор. Проекция точки на экран на SlimDX var viewProj = mMainCamera.View * mMainCamera.Projection; var vp = mDevice.ImmediateContext.Rasterizer.GetViewports()[0]; var screenCoords = Vector3.Project(worldSpaceCoordinates, vp.X, vp.Y, vp.Width, vp.Height, vp.MinZ, vp.MaxZ, viewProj); Не знаю, оно или нет. Надо в API смотреть. Просто загуглил. На unity это одной функцией Camera.WorldToScreenPoint Разбираться надо. Времени нет. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения