|
|
|
Managed DirectX перевод экранных координат в мировые
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Только начал изучать DirectX. Хочу сделать такое приложение, чтобы при клике мышкой в этом месте появлялся какой-нибудь объект. Я так понимаю нужно перевести экранные координаты в мировые. Но как это сделать не пойму. В гугле искал, но в основном все примеры на выбор объекта и в основном на с++, а мне бы хотелось найти пример на c# и именно перевод координат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2013, 02:34 |
|
||
|
Managed DirectX перевод экранных координат в мировые
|
|||
|---|---|---|---|
|
#18+
2 Kokon: KokonЯ так понимаю нужно перевести экранные координаты в мировые. Да. KokonНо как это сделать не пойму. Например, с помощью метода Unproject. Берём 2 точки в экранных координатах: Код: c# 1. 2. Переводим их в мировые координаты, вызывая метод Unproject для каждой: Код: c# 1. 2. Полученные 2 точки задают луч, в мировых координатах. Где-нибудь на этом луче можете разместить новый объект. (Код не компилировал, нет SDK под рукой.) KokonВ гугле искал, но в основном все примеры на выбор объекта Примеры на выбор (picking) объекта обычно используют метод Unproject. Kokonи в основном на с++, а мне бы хотелось найти пример на c# Тут от языка мало что зависит, различия будут чисто синтаксические. Kokonи именно перевод координат. Метод Unproject как раз и делает перевод координат. Или вы хотите вручную всё сделать, то есть самостоятельно реализовать аналог этого метода? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2013, 16:29 |
|
||
|
Managed DirectX перевод экранных координат в мировые
|
|||
|---|---|---|---|
|
#18+
Пётр Седов, написал вот такой код 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 Т.е. либо метод как-то не правильно работает, либо у меня что-то не то, а где искать ошибку не знаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2013, 00:19 |
|
||
|
Managed DirectX перевод экранных координат в мировые
|
|||
|---|---|---|---|
|
#18+
2 Kokon: Одна точка на viewport-е (в экранных 2D-координатах) -- это целый луч в мировых координатах, проецирующийся в эту точку. Вот near/far как раз и вычисляются, чтобы узнать этот луч. (near (после Unproject) -- точка на ближней плоскости отсечения, far (после Unproject) -- точка на дальней плоскости отсечения) Кстати, если проекция перспективная, то near можно вообще не вычислять, а в качестве начала луча взять позицию камеры (cam_pos в коде ниже). Вам надо как-то дополнительно решить, где на этом луче разместить новый объект. Например, если хотим разместить новый объект на расстоянии 10 мировых единиц от камеры: Код: c# 1. 2. 3. 4. (Код не компилировал. Кстати, C#-код лучше обрамлять tag-ами [ src C# ] [ /src ].) Или можно находить пересечение этого луча с какой-нибудь плоскостью, чтобы новый объект появлялся на этой плоскости. KokonЕсли делаю Unproject с Matrix.Identity, В данном случае так и надо, ведь нужна точка в мировых координатах. Вот если бы была нужна точка в локальных координатах какого-нибудь объекта, тогда да, надо было бы при вызове метода Unproject в параметр world передавать мировое преобразование координат этого объекта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2013, 03:45 |
|
||
|
|

start [/forum/topic.php?fid=16&fpage=60&tid=1341977]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
77ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
44ms |
get tp. blocked users: |
2ms |
| others: | 237ms |
| total: | 414ms |

| 0 / 0 |
