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

C# Matrix4x4.CreateLookAt как обнаружить цель на экране?


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

Приветствую, есть игра с камерой по типу 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);


При увеличении дистанции наблюдается погрешность, вблизи работает неплохо. Что делать, как решатся такая задача?

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

17 минут назад, Xipho сказал:

Навскидку - приведение к int с отбросом дробной части может привести к погрешности

OffsetX & OffsetY - позиция курсора на экране, тоже int, погрешность примерно +/- 1 пиксель, на сколько я вижу.
А текущая погрешность ощущается, как 10-40 пикселей. Не уверен, что ошибка именно в этом.

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

Ты бы хоть сказал, left-handed или right-handed координатная система, и что ты кодом делаешь. 
Что за 250.0f?

Ты спрашиваешь, как найти координаты цели, но говоришь, что они известны.
В общем, подробнее объясни, что происходит и что ты делаешь 

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

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

Ты спрашиваешь, как найти координаты цели, но говоришь, что они известны.

Как найти координаты цели в окне игры 2D холст  {X,Y}.
Мне известны координаты в игровом пространстве - в 3D {X,Y,Z}.

 

 

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

Что за 250.0f?

Это преобразование полученной видовой матрицы к координатам курсора, наиболее похожая на правду пропорция. Но в особо ближних дистанциях и более дальних дает существенную погрешность.

 

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

Ты бы хоть сказал, left-handed или right-handed координатная система, и что ты кодом делаешь. 

Я не знаю, о чем идет речь. Что вы имеете в виду?

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

В 22.05.2022 в 6:15 PM, botmaker сказал:

Это преобразование полученной видовой матрицы к координатам курсора, наиболее похожая на правду пропорция. Но в особо ближних дистанциях и более дальних дает существенную погрешность.

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

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

1 час назад, botmaker сказал:

Какие варианты?

Проведи несколько экспериментов с разными дистанциями и разными пропорциями. Выведи формулу, опиши ее в коде.

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

В 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.

о которой нужно помнить. 

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

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

Если ты пишешь на C#, я так понимаю, у тебя игра на Юнити.

Это мнение ошибочно. Да, я пишу на C#, но без Юнити, это чит, читающий память игры.
Поэтому использовать данный метод просто неуместно. Есть ли другие варианты?

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

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

Да, я пишу на C#, но без Юнити, это чит, читающий память игры.

Очень странный выбор, но судить не буду :D

А найти направление (или поворот) камеры и направить камеру на "таргет" не вариант? 

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

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

Очень странный выбор, но судить не буду :D

А найти направление (или поворот) камеры и направить камеру на "таргет" не вариант? 

Направление камеры не удалось найти. Предположительно, камера направлена на персонажа игры. Вид сзади, как в гта.
Как найти направление камеры пока что не знаю, все остальное искал через CheatEngine.
Есть только координаты камеры, координаты игрока, направление игрока (в градусах) и координаты цели. Все приведенные координаты в 3D {x, y, z}

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

18 часов назад, botmaker сказал:

Предположительно, камера направлена на персонажа игры

Тогда можно предположить, что вращение камеры равно вращению персонажа? Если камера стоит за спиной персонажа, то они могут смотреть в одном направлении. 

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

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

Тогда можно предположить, что вращение камеры равно вращению персонажа? Если камера стоит за спиной персонажа, то они могут смотреть в одном направлении. 

Да, это так. Они смотрят в одном направлении относительно плоскости XY, на счет оси Z - не совсем, скорее камера под углом -45 градусов по отношению к плоскости XY.

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

6 минут назад, botmaker сказал:

Да, это так. Они смотрят в одном направлении относительно плоскости XY

Так это же в Cheat Engine можно найти, а отличия искать уже в каком нибудь ReClass или в инспекторе структур Cheat Engine. Отличие по Z -- наша камера. 

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

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

а отличия искать уже в каком нибудь ReClass

Отличия чего?
Направление камеры может быть задано, как вектор, а может быть, как два угла. Может быть как видовая матрица 4x4.
У вас есть знания в этой сфере, может быть есть желание поучаствовать в написании модуля за вознаграждение?
Есть наработки. Задача только в том, чтобы с достоверной точностью сопоставить координаты игровых объектов 3д в 2д перспективу на экране

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

1 час назад, botmaker сказал:

Направление камеры может быть задано, как вектор, а может быть, как два угла.

Чаще всего "направление" это "поворот", так что это почти всегда вектор или кватернионы. Потому что камера почти всегда логический объект, который так же имеет позицию и поворот. 

Если они заданы как два угла, допустим, как в движке Source, то вообще все намного легче искать, но эти углы нужно будет рассчитывать, если захочешь напрямую манипулировать камерой. 

 

1 час назад, botmaker сказал:

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

К сожалению, у меня нет времени, так как основная работа есть, да и C# я не люблю и не пишу на нём. 

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

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

или кватернионы.

Этого я опасаюсь больше всего. я их ни в жизнь не найду при помощи CE.

 

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

да и C# я не люблю и не пишу на нём. 

Было бы достаточно алгоритма, мне не удается его понять до сих пор. Пробовал много формул, но нужной точности не добился ни с одной из них.

 

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

В 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

Разбираться надо. Времени нет.

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

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

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

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