Вычисление луча выбора
Вспомните, что луч описывается параметрическим уравнением p(t) = p0 + tu, где p0 — это точка, являющаяся началом луча, а u — это вектор, задающий направление луча.
На Рисунок 15.2 видно, что начало луча является также началом координат пространства вида, так что p0 = (0, 0, 0). Если p — это точка окна проекции, через которую проходит луч, то вектор направления u получаем по формуле u = p – p0 = (px, py, 1) – (0, 0, 0) = p.
Приведенный ниже метод вычисляет луч выбора в пространстве вида по заданным координатам x и y точки экранного пространства, по которой был выполнен щелчок:
d3d::Ray CalcPickingRay(int x, int y) { float px = 0.0f; float py = 0.0f;
D3DVIEWPORT9 vp; Device->GetViewport(&vp);
D3DXMATRIX proj; Device->GetTransform(D3DTS_PROJECTION, &proj);
px = ((( 2.0f*x) / vp.Width) - 1.0f) / proj(0, 0); py = (((-2.0f*y) / vp.Height) + 1.0f) / proj(1, 1);
d3d::Ray ray; ray._origin = D3DXVECTOR3(0.0f, 0.0f, 0.0f); ray._direction = D3DXVECTOR3(px, py, 1.0f);
return ray; }
где определение Ray выглядит так:
struct Ray { D3DXVECTOR3 _origin; D3DXVECTOR3 _direction; };
Мы обновляем файл d3dUtility.h и пространство имен d3d, добавляя туда определение Ray.