botmaker Опубликовано 22 мая Поделиться Опубликовано 22 мая Приветствую, есть игра с камерой по типу 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 мая Поделиться Опубликовано 22 мая Навскидку - приведение к int с отбросом дробной части может привести к погрешности Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
botmaker Опубликовано 22 мая Автор Поделиться Опубликовано 22 мая 17 минут назад, Xipho сказал: Навскидку - приведение к int с отбросом дробной части может привести к погрешности OffsetX & OffsetY - позиция курсора на экране, тоже int, погрешность примерно +/- 1 пиксель, на сколько я вижу. А текущая погрешность ощущается, как 10-40 пикселей. Не уверен, что ошибка именно в этом. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
KRYPTOPUNK Опубликовано 22 мая Поделиться Опубликовано 22 мая Ты бы хоть сказал, left-handed или right-handed координатная система, и что ты кодом делаешь. Что за 250.0f? Ты спрашиваешь, как найти координаты цели, но говоришь, что они известны. В общем, подробнее объясни, что происходит и что ты делаешь Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
botmaker Опубликовано 22 мая Автор Поделиться Опубликовано 22 мая 16 минут назад, KRYPTOPUNK сказал: Ты спрашиваешь, как найти координаты цели, но говоришь, что они известны. Как найти координаты цели в окне игры 2D холст {X,Y}. Мне известны координаты в игровом пространстве - в 3D {X,Y,Z}. 18 минут назад, KRYPTOPUNK сказал: Что за 250.0f? Это преобразование полученной видовой матрицы к координатам курсора, наиболее похожая на правду пропорция. Но в особо ближних дистанциях и более дальних дает существенную погрешность. 20 минут назад, KRYPTOPUNK сказал: Ты бы хоть сказал, left-handed или right-handed координатная система, и что ты кодом делаешь. Я не знаю, о чем идет речь. Что вы имеете в виду? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 24 мая Поделиться Опубликовано 24 мая В 22.05.2022 в 6:15 PM, botmaker сказал: Это преобразование полученной видовой матрицы к координатам курсора, наиболее похожая на правду пропорция. Но в особо ближних дистанциях и более дальних дает существенную погрешность. Выглядит как будто эта пропорция должна высчитываться программно, а не быть константой. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
botmaker Опубликовано 24 мая Автор Поделиться Опубликовано 24 мая 1 час назад, Xipho сказал: Выглядит как будто эта пропорция должна высчитываться программно, а не быть константой. Какие варианты? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 24 мая Поделиться Опубликовано 24 мая 1 час назад, botmaker сказал: Какие варианты? Проведи несколько экспериментов с разными дистанциями и разными пропорциями. Выведи формулу, опиши ее в коде. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
KRYPTOPUNK Опубликовано 24 мая Поделиться Опубликовано 24 мая В 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 мая Автор Поделиться Опубликовано 24 мая 10 минут назад, KRYPTOPUNK сказал: Если ты пишешь на C#, я так понимаю, у тебя игра на Юнити. Это мнение ошибочно. Да, я пишу на C#, но без Юнити, это чит, читающий память игры. Поэтому использовать данный метод просто неуместно. Есть ли другие варианты? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
KRYPTOPUNK Опубликовано 24 мая Поделиться Опубликовано 24 мая 3 минуты назад, botmaker сказал: Да, я пишу на C#, но без Юнити, это чит, читающий память игры. Очень странный выбор, но судить не буду А найти направление (или поворот) камеры и направить камеру на "таргет" не вариант? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
botmaker Опубликовано 24 мая Автор Поделиться Опубликовано 24 мая 21 минуту назад, KRYPTOPUNK сказал: Очень странный выбор, но судить не буду А найти направление (или поворот) камеры и направить камеру на "таргет" не вариант? Направление камеры не удалось найти. Предположительно, камера направлена на персонажа игры. Вид сзади, как в гта. Как найти направление камеры пока что не знаю, все остальное искал через CheatEngine. Есть только координаты камеры, координаты игрока, направление игрока (в градусах) и координаты цели. Все приведенные координаты в 3D {x, y, z} Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
botmaker Опубликовано 25 мая Автор Поделиться Опубликовано 25 мая Где найти того, кто мог бы решить вопрос за вознаграждение ? (это не оффлайн игра) Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
KRYPTOPUNK Опубликовано 25 мая Поделиться Опубликовано 25 мая 18 часов назад, botmaker сказал: Предположительно, камера направлена на персонажа игры Тогда можно предположить, что вращение камеры равно вращению персонажа? Если камера стоит за спиной персонажа, то они могут смотреть в одном направлении. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
botmaker Опубликовано 25 мая Автор Поделиться Опубликовано 25 мая 4 минуты назад, KRYPTOPUNK сказал: Тогда можно предположить, что вращение камеры равно вращению персонажа? Если камера стоит за спиной персонажа, то они могут смотреть в одном направлении. Да, это так. Они смотрят в одном направлении относительно плоскости XY, на счет оси Z - не совсем, скорее камера под углом -45 градусов по отношению к плоскости XY. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
KRYPTOPUNK Опубликовано 25 мая Поделиться Опубликовано 25 мая 6 минут назад, botmaker сказал: Да, это так. Они смотрят в одном направлении относительно плоскости XY Так это же в Cheat Engine можно найти, а отличия искать уже в каком нибудь ReClass или в инспекторе структур Cheat Engine. Отличие по Z -- наша камера. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
botmaker Опубликовано 25 мая Автор Поделиться Опубликовано 25 мая 36 минут назад, KRYPTOPUNK сказал: а отличия искать уже в каком нибудь ReClass Отличия чего? Направление камеры может быть задано, как вектор, а может быть, как два угла. Может быть как видовая матрица 4x4. У вас есть знания в этой сфере, может быть есть желание поучаствовать в написании модуля за вознаграждение? Есть наработки. Задача только в том, чтобы с достоверной точностью сопоставить координаты игровых объектов 3д в 2д перспективу на экране Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
KRYPTOPUNK Опубликовано 25 мая Поделиться Опубликовано 25 мая 1 час назад, botmaker сказал: Направление камеры может быть задано, как вектор, а может быть, как два угла. Чаще всего "направление" это "поворот", так что это почти всегда вектор или кватернионы. Потому что камера почти всегда логический объект, который так же имеет позицию и поворот. Если они заданы как два угла, допустим, как в движке Source, то вообще все намного легче искать, но эти углы нужно будет рассчитывать, если захочешь напрямую манипулировать камерой. 1 час назад, botmaker сказал: может быть есть желание поучаствовать в написании модуля за вознаграждение? К сожалению, у меня нет времени, так как основная работа есть, да и C# я не люблю и не пишу на нём. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
botmaker Опубликовано 25 мая Автор Поделиться Опубликовано 25 мая 43 минуты назад, KRYPTOPUNK сказал: или кватернионы. Этого я опасаюсь больше всего. я их ни в жизнь не найду при помощи CE. 46 минут назад, KRYPTOPUNK сказал: да и C# я не люблю и не пишу на нём. Было бы достаточно алгоритма, мне не удается его понять до сих пор. Пробовал много формул, но нужной точности не добился ни с одной из них. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 31 мая Поделиться Опубликовано 31 мая В 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 Разбираться надо. Времени нет. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.