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

       

Окно программы Bounding Volumes



Рисунок 11.5. Окно программы Bounding Volumes. Обратите внимание, чтобы ограничивающая сфера была прозрачной используется альфа-смешивание


Код приложения достаточно прост, и мы не будем его обсуждать. Интерес представляет только реализация двух функций, которые формируют ограничивающую сферу и ограничивающий параллелепипед для указанной сетки:

bool ComputeBoundingSphere( ID3DXMesh* mesh, // сетка, для которой вычисляется ограничивающая сфера d3d::BoundingSphere* sphere) // возвращает ограничивающую сферу { HRESULT hr = 0;

BYTE* v = 0; mesh->LockVertexBuffer(0, (void**)&v);

hr = D3DXComputeBoundingSphere( (D3DXVECTOR3*)v, mesh->GetNumVertices(), D3DXGetFVFVertexSize(mesh->GetFVF()), &sphere->_center, &sphere->_radius);

mesh->UnlockVertexBuffer();

if( FAILED(hr) ) return false;

return true; }

bool ComputeBoundingBox( ID3DXMesh* mesh, // сетка, для которой вычисляется ограничивающий параллелепипед d3d::BoundingBox* box) // возвращает ограничивающий параллелепипед { HRESULT hr = 0;

BYTE* v = 0; mesh->LockVertexBuffer(0, (void**)&v);

hr = D3DXComputeBoundingBox( (D3DXVECTOR3*)v, mesh->GetNumVertices(), D3DXGetFVFVertexSize(mesh->GetFVF()), &box->_min, &box->_max);

mesh->UnlockVertexBuffer();

if( FAILED(hr) ) return false;

return true; }

Обратите внимание, что приведение типа (D3DXVECTOR3*)v подразумевает, что в используемой структуре данных вершины информация о координатах вершины хранится в самом начале. Также обратите внимание на использование функции D3DXGetFVFVertexSize для получения размера структуры данных вершины, соответствующей указанному описанию формата вершин.



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