powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Managed DirectX перевод экранных координат в мировые
5 сообщений из 5, страница 1 из 1
Managed DirectX перевод экранных координат в мировые
    #38099816
Kokon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте! Только начал изучать DirectX. Хочу сделать такое приложение, чтобы при клике мышкой в этом месте появлялся какой-нибудь объект. Я так понимаю нужно перевести экранные координаты в мировые. Но как это сделать не пойму. В гугле искал, но в основном все примеры на выбор объекта и в основном на с++, а мне бы хотелось найти пример на c# и именно перевод координат.
...
Рейтинг: 0 / 0
Managed DirectX перевод экранных координат в мировые
    #38100586
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Kokon:

KokonЯ так понимаю нужно перевести экранные координаты в мировые.
Да.

KokonНо как это сделать не пойму.
Например, с помощью метода Unproject. Берём 2 точки в экранных координатах:
Код: c#
1.
2.
Vector3 p1 = new Vector3(mouse_x, mouse_y, 0);
Vector3 p2 = new Vector3(mouse_x, mouse_y, 1);


Переводим их в мировые координаты, вызывая метод Unproject для каждой:
Код: c#
1.
2.
p1.Unproject(_device.Viewport, _device.Transform.Projection, _device.Transform.View, Matrix.Identity);
p2.Unproject(_device.Viewport, _device.Transform.Projection, _device.Transform.View, Matrix.Identity);


Полученные 2 точки задают луч, в мировых координатах. Где-нибудь на этом луче можете разместить новый объект.
(Код не компилировал, нет SDK под рукой.)

KokonВ гугле искал, но в основном все примеры на выбор объекта
Примеры на выбор (picking) объекта обычно используют метод Unproject.

Kokonи в основном на с++, а мне бы хотелось найти пример на c#
Тут от языка мало что зависит, различия будут чисто синтаксические.

Kokonи именно перевод координат.
Метод Unproject как раз и делает перевод координат. Или вы хотите вручную всё сделать, то есть самостоятельно реализовать аналог этого метода?
...
Рейтинг: 0 / 0
Managed DirectX перевод экранных координат в мировые
    #38100797
Kokon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пётр Седов, написал вот такой код

Matrix proj = device.Transform.Projection;
Matrix view = device.Transform.View;
Matrix mWorld = device.Transform.World;
Vector3 near = new Vector3(e.X, e.Y, 0);
Vector3 far = new Vector3(e.X, e.Y, 1);

near.Unproject(device.Viewport, proj, view, Matrix.Identity);
far.Unproject(device.Viewport, proj, view, Matrix.Identity);

//near.Unproject(device.Viewport, proj, view, mWorld);
//far.Unproject(device.Viewport, proj, view, mWorld);

Если делаю Unproject с Matrix.Identity, то near.X и near.Y имеют слишком маленькие значения(всегда меньше 1), а если использую мировую матрицу как написано msdn, координаты имеют слишком большие значения. Например кликаю в том месте где должны быть координаты X=-1 Y=-1, а выдает X=-7 Y=-15 Т.е. либо метод как-то не правильно работает, либо у меня что-то не то, а где искать ошибку не знаю.
...
Рейтинг: 0 / 0
Managed DirectX перевод экранных координат в мировые
    #38100833
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Kokon:

Одна точка на viewport-е (в экранных 2D-координатах) -- это целый луч в мировых координатах, проецирующийся в эту точку. Вот near/far как раз и вычисляются, чтобы узнать этот луч. (near (после Unproject) -- точка на ближней плоскости отсечения, far (после Unproject) -- точка на дальней плоскости отсечения) Кстати, если проекция перспективная, то near можно вообще не вычислять, а в качестве начала луча взять позицию камеры (cam_pos в коде ниже). Вам надо как-то дополнительно решить, где на этом луче разместить новый объект. Например, если хотим разместить новый объект на расстоянии 10 мировых единиц от камеры:
Код: c#
1.
2.
3.
4.
Vector3 cam_pos = ...; // вместо near
Vector3 ray_dir = Vector3.Normalize(far - cam_pos);
float dist = 10;
Vector3 new_obj_pos = cam_pos + dist * ray_dir;


(Код не компилировал. Кстати, C#-код лучше обрамлять tag-ами [ src C# ] [ /src ].)
Или можно находить пересечение этого луча с какой-нибудь плоскостью, чтобы новый объект появлялся на этой плоскости.

KokonЕсли делаю Unproject с Matrix.Identity,
В данном случае так и надо, ведь нужна точка в мировых координатах. Вот если бы была нужна точка в локальных координатах какого-нибудь объекта, тогда да, надо было бы при вызове метода Unproject в параметр world передавать мировое преобразование координат этого объекта.
...
Рейтинг: 0 / 0
Managed DirectX перевод экранных координат в мировые
    #38100900
Kokon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пётр Седов, большое вам спасибо за помощь. Все заработало.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Managed DirectX перевод экранных координат в мировые
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]