Создавать матрицу для рекламного квадроцикла?

Я пытаюсь придумать правильный алгоритм для создания матрицы, которая заставляет квадроцикл смотреть прямо в камеру, но у меня возникают трудности.

Четырехугольник, который я рисую, обращен вниз, вот код, который у меня есть:

D3DXVECTOR3 pos;
pos = D3DXVECTOR3(-2.0f, 6.0f, 0.1f);
D3DXMATRIX transform;
D3DXMatrixTranslation(&transform, pos.x, pos.y, pos.z);

D3DXVECTOR3 axis = D3DXVECTOR3(0, -1, 0);
D3DXVECTOR3 quadtocam = pos - EmCameraManager::Get().GetPosition();

D3DXVec3Normalize(&quadtocam,&quadtocam);

D3DXVECTOR3 ortho;
D3DXVec3Cross(&ortho, &axis, &quadtocam);

float rotAngle = acos(D3DXVec3Dot(&axis,&quadtocam));
D3DXMATRIX rot;
D3DXMatrixRotationAxis(&rot,&ortho,rotAngle);

transform = rot*transform;

Это работает, когда дело доходит до поворота квадроцикла к камере, однако он не остается в правильном положении, если смотреть на него со всех сторон.

На этом снимке экрана: https://imgur.com/hFmzc.png Слева четырехугольник если смотреть прямо (вектор равен 0,0,1), в другом - под произвольным углом.

Оба раза он обращен к камере, однако, когда под произвольным углом наклоняется вдоль своей локальной оси z. Я не уверен, как это исправить, и мне было интересно, каким будет следующий шаг?


person meds    schedule 22.09.2010    source источник


Ответы (1)


Вращение вокруг произвольной оси всегда будет делать это. Вы должны сначала повернуть свою модель вокруг оси Y, чтобы она указывала (вектор вверх) на вашу камеру, а затем повернуть ее вокруг своей орто-оси, которая будет выровнена с правильным вектором модели.

Предполагая, что ось z выходит за пределы экрана, вот некоторый код:

D3DXVECTOR3 Zaxis = D3DXVECTOR3(0, 1, 0);
D3DXVECTOR3 flattenedQuadtocam = quadtocam;
flattenedQuadtocam.y = 0;
float firstRotAngle = acos(D3DXVec3Dot(&Zaxis,&flattenedQuadtocam));

D3DXMATRIX firstRot;
D3DXMatrixRotationAxis(&firstRot,&Zaxis,firstRotAngle);

transform = firstRot*transform;

Это должно быть помещено сразу после этой строки:

D3DXVec3Normalize(&quadtocam,&quadtocam);

Тогда остальная часть вашего кода должна работать.

person Eric Fortin    schedule 22.09.2010
comment
Хм, я не могу поместить код, который вы предоставили, под строкой нормализации, потому что 'rotAngle' еще не объявлен. - person meds; 22.09.2010
comment
Моя ошибка, rotAngle должен был быть первым RotAngle. Теперь это исправлено. - person Eric Fortin; 22.09.2010