| netlib.narod.ru | < Назад | Оглавление | Далее > |
Вспомните, что луч описывается параметрическим уравнением 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.
| netlib.narod.ru | < Назад | Оглавление | Далее > |