Войти
ПрограммированиеПодсказкиГрафика

Несколько полезных функций, использующих векторы.

Автор:

Эти функции довольно универсальны и вместе с тем задачи, которые они выполняют, довольно часто используемы. Среди областей их применения могу выделить следующие, в которых я сам их использовал: управление камерой клавиатурой/мышью, позиционирование 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 за теоретические уроки.

#D3DX, #Direct3D, #векторы

12 октября 2009