Несколько полезных функций, использующих векторы.
Автор: Alexey Stashin
Эти функции довольно универсальны и вместе с тем задачи, которые они выполняют, довольно часто используемы. Среди областей их применения могу выделить следующие, в которых я сам их использовал: управление камерой клавиатурой/мышью, позиционирование 3D звуков, создание игрового радара. Надеюсь, они сэкономят Ваше время.
Итак,
//------------------------------------------ // Имя: RelativePosition() // Описание: Возвращает положение точки src относительно вектора origin, // направленного к target // (Исп. для перевода из мировой СК в СК игрока/камеры/радара) //------------------------------------------ D3DXVECTOR3 RelativePosition(const D3DXVECTOR3 *src,const D3DXVECTOR3 *origin, const D3DXVECTOR3 *target,const D3DXVECTOR3 *upvector) { D3DXVECTOR3 dirn; D3DXVec3Normalize(&dirn,&D3DXVECTOR3(*target-*origin)); D3DXVECTOR3 u; D3DXVec3Cross(&u, &dirn, upvector); D3DXVec3Normalize(&u,&u); D3DXVECTOR3 v; D3DXVec3Cross(&v,&u,&dirn); D3DXVECTOR3 originToSrc=*origin-*src; return D3DXVECTOR3( D3DXVec3Dot(&u,&originToSrc), D3DXVec3Dot(&v,&originToSrc), D3DXVec3Dot(&dirn,&originToSrc) ); } //------------------------------------------ // Имя: SetCameraShift() // Описание: Сдвигает камеру и ее цель в определенном направлении // (Исп. для перемещения вперед/назад/влево/вправо) //------------------------------------------ void SetCameraShift(D3DXVECTOR3 *cam,D3DXVECTOR3 *camtarg, const D3DXVECTOR3 *shift,const D3DXVECTOR3 *upvector) { D3DXVECTOR3 dirn; D3DXVec3Normalize(&dirn,&D3DXVECTOR3(*camtarg-*cam)); D3DXVECTOR3 u; D3DXVec3Cross(&u, &dirn, upvector); D3DXVec3Normalize(&u,&u); D3DXVECTOR3 v; D3DXVec3Cross(&v,&u,&dirn); *cam += u*(shift->x) + v*(shift->y) + dirn*(shift->z); *camtarg += u*(shift->x) + v*(shift->y) + dirn*(shift->z); } //------------------------------------------ // Имя: SetCameraRotationX() // Описание: Поворачивает камеру по оси X, изменяя координаты ее цели // (Исп. для поворота вверх/вниз) //------------------------------------------ void SetCameraRotationX(const D3DXVECTOR3 *cam,D3DXVECTOR3 *camtarg, const D3DXVECTOR3 *upvector, const float angle) { D3DXVECTOR3 dirn; D3DXVec3Normalize(&dirn,&D3DXVECTOR3(*camtarg-*cam)); D3DXVECTOR3 u; D3DXVec3Cross(&u, &dirn, upvector); D3DXVec3Normalize(&u,&u); D3DXMATRIX rotmatrix; D3DXMatrixRotationAxis(&rotmatrix,&u,angle); D3DXVec3TransformCoord(&dirn,&dirn,&rotmatrix); *camtarg=*cam+dirn; } //------------------------------------------ // Имя: SetCameraRotationY() // Описание: Поворачивает камеру по оси Y, изменяя координаты ее цели // (Исп. для поворота влево/вправо) //------------------------------------------ void SetCameraRotationY(const D3DXVECTOR3 *cam,D3DXVECTOR3 *camtarg, const D3DXVECTOR3 *upvector, const float angle) { D3DXVECTOR3 dirn; D3DXVec3Normalize(&dirn,&D3DXVECTOR3(*camtarg-*cam)); D3DXVECTOR3 u; D3DXVec3Cross(&u, &dirn, &D3DXVECTOR3(0.0f,1.0f,0.0f)); D3DXVec3Normalize(&u,&u); D3DXVECTOR3 v; D3DXVec3Cross(&v,&u,&dirn); D3DXMATRIX rotmatrix; D3DXMatrixRotationAxis(&rotmatrix,&v,angle); D3DXVec3TransformCoord(&dirn,&dirn,&rotmatrix); *camtarg=*cam+dirn; } |
Спасибо TAV за теоретические уроки.
12 октября 2009
Категории: D3DX, Direct3D, векторы
Права на документ принадлежат автору, указывайте ссылку при цитировании