| Цитата | | Ничего подобного в DirectX я не нашел! Может быть плохо искал, не знаю! | Да... На самом деле я тоже щас посмотрел, не нашел никаких подобных D3DXMatrix*-функций... Ну можно было тогда просто посмотреть, какую матрицу формирует gluPickMatrix, и самому её формировать . Немного повызывав gluPickMatrix, эспериментально определил формулы матрицы (они простые):
| Код | Pick-матрица: a 0 0 0 0 b 0 0 0 0 1 0 c d 0 1
Где: a = vp_w / pr_w b = vp_h / pr_h
vp_w - 2*(pr_x - vp_x) c = ---------------------- pr_w
vp_h - 2*(pr_y - vp_y) d = ---------------------- pr_h
Где: vp_x, vp_y - координаты левого верхнего угла viewport'а в пикселах (обычно = 0) vp_w, vp_h - ширина и высота viewport'а в пикселах pr_x, pr_y - координаты центра выбираемой области (picking rectangle), в пикселах pr_w, pr_y - ширина и высота выбираемой области
|
Как это использовать ?
Например, было у тебя примерно так:
| Код | D3DXMATRIX your_projection_matrix; D3DXMatrixPerspectiveFovLH( &your_projection_matrix, ... ); d3ddev->SetTransform( D3DTS_PROJECTION, &your_projection_matrix );
D3DVIEWPORTx vp; vp.X = 0; vp.Y = 0; vp.Width = 800; vp.Height = 600; vp.MinZ = ...; vp.MaxZ = ...; d3ddev->SetViewport( &vp );
// какое-либо рисование сцены
|
Теперь нужно определить, какой объект нарисованной сцены находится под курсором:
| Код | pr_x = ...; // координаты мышиного курсора относительно сурфейса pr_y = ...; // pr_w = 1; // просматриваем область 1x1 pr_h = 1; vp_w = 800; // это ширина и высота оригинального вьюпорта vp_h = 600;
// создаём pick-матрицу D3DXMATRIX PickMatrix; D3DXMatrixIdentity( &PickMatrix ); PickMatrix._11 = vp_w / pr_w; PickMatrix._22 = vp_h / pr_h; PickMatrix._41 = (vp_w - 2*pr_x)/pr_w; PickMatrix._42 = (vp_h - 2*pr_y)/pr_h;
// настройка матрицы проекции d3ddev->SetTransform( D3DTS_PROJECTION, &PickMatrix ); d3ddev->MultiplyTransform( D3DTS_PROJECTION, &your_projection_matrix );
// настройка вьюпорта, рендерим только 1 пиксел D3DVIEWPORTx vp1; vp1.X = 0; // (можно где угодно рендерить, возьмем левый-верхний угол поверхности) vp1.Y = 0; vp1.Width = pr_w; vp1.Height = pr_h; vp1.MinZ = ...; vp1.MaxZ = ...; d3ddev->SetViewport( &vp1 );
// теперь рисуем без всяких наворотов только те объекты сцены, которые можно выбрать курсором // при этом каждый объект рисуется однотонным уникальным цветом // запоминаем любым образом соответствие: цвет <-> объект ...
// теперь смотрим, что находися в самом верхнем-левом пикселе отрендеренной картинки (например, через LockRect) // и определяем, какому объекту соответствует цвет пикселя
|
|