Создание матрицы для квадрата с билбордом? - PullRequest
0 голосов
/ 22 сентября 2010

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

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

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;

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

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

1 Ответ

1 голос
/ 22 сентября 2010

Вращение вокруг произвольной оси всегда сделает это.Сначала вы должны повернуть модель вокруг оси 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);

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

...