Введение в программирование трехмерных игр с DX9

       

Вычисление луча выбора


Вспомните, что луч описывается параметрическим уравнением 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.



Содержание раздела