代码之家  ›  专栏  ›  技术社区  ›  meds

为一个有广告牌的四边形创建一个矩阵?

  •  0
  • meds  · 技术社区  · 14 年前

    我正试图想出一个合适的算法来创建一个矩阵,它使四元直接面对摄像机,但我有困难。

    我画的四边形是朝下的,这是我迄今为止的代码:

    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),在另一个四元正被从任意角度观察。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Eric Fortin    14 年前

    绕着任意轴旋转总是可以做到这一点。您应该首先围绕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);
    

    那么剩下的代码就可以工作了。