Несколько полезных функций, использующих векторы.
Автор: 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