为广告牌四边形创建矩阵?

时间:2010-09-22 10:56:02

标签: math matrix directx sprite quad

我正在尝试提出一个合适的算法来创建一个矩阵,让四边形直接面对相机,但我遇到了困难。

我画的四边形朝下,这是我到目前为止的代码:

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 个答案:

答案 0 :(得分: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);

然后你的其余代码应该可以工作。