Пятница, 19 Апреля 2024, 06:51

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Записи участника » IG_Rich [1]
Результаты поиска
IG_RichДата: Воскресенье, 22 Мая 2016, 16:13 | Сообщение # 1 | Тема: DirectX: преобразование координат (screen->world)
уже был
Сейчас нет на сайте
День добры, товарищи!
Возникла проблема с обработкой мыши: требуется преобразовать их из координат экрана,в мировые координаты.
Для начала создание матриц:
C++
Код
//проекция
D3DXMatrixOrthoLH(&matProj, 1024, 768, 1, 5000);
g_pD3DDevice->SetTransform(D3DTS_PROJECTION, &matProj);

//вида
D3DXVECTOR3 pEye(2000.0f, 2000.0f, 2000.0f),
pAt(0.0f, 0.0f, 0.0f),
pUp(0.0f, 1.0f, 0.0f);
D3DXMatrixLookAtLH(&matView, &pEye, &pAt, &pUp);
g_pD3DDevice->SetTransform(D3DTS_VIEW, &matView);

Мировая матрица единичная и ничего не делает.
Координаты мыши получаю относительно левого верхнего угла экрана, его координаты от нуля до ширины экрана(по x),и от нуля до высоты(по y).
При нажатии ЛКМ требуется переместить камеру в точку нажатия, то есть вектор pAt примет значение того,куда мы кликнули,ну а pEye сместится вместе с ним.
Поиски по куче статей и ресурсов ничего не дали, всё равно не могу понять как правильно преобразовывать.
Пытался через D3DXVec3Unproject:
C++
Код
D3DXMATRIX view, proj, world;
D3DXVECTOR3 p1;
g_pD3DDevice->GetTransform(D3DTS_PROJECTION, &proj);
g_pD3DDevice->GetTransform(D3DTS_VIEW, &view);
g_pD3DDevice->GetTransform(D3DTS_WORLD, &world);
D3DVIEWPORT9 pViewport = { 0, 0, 100, 100, 0.0f, 1.0f };
g_pD3DDevice->GetViewport(&pViewport);
D3DXVec3Unproject(&p1, &D3DXVECTOR3(g_MouseXPos, g_MouseYPos, 0), &pViewport, &proj, &view, &world);

но то-же не получается. Что вообще эта функция возвращает?Вектор из нашего экрана в точку куда кликнули(в мире),в мировых координатах?
Так-же пытался сам через скудные знания в геометрии и линейной алгебре вычислить вектора,в итоге получилось что-то вроде:
C++
Код
//destination - положение курсора мыши относительно лев.верхнего угла
temp.x=(destination.x-WNDWIDTH/2);  
temp.y=(destination.y-WNDHEIGHT/2);
temp.z = 0;
result.x = pAt.x - temp.x / sqrt(2) + temp.y;
result.y = 0;
result.z = pAt.z+temp.x / sqrt(2) + temp.y;

В итоге все почти верно,лишь с небольшой погрешностью, что говорит о том, что вероятно я напутал что то с коэффициентами.
Прошу вашей компетентной помощи.
Форум игроделов » Записи участника » IG_Rich [1]
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг