代码之家  ›  专栏  ›  技术社区  ›  Karel Petranek

旋转球体使其极点朝向摄影机

  •  1
  • Karel Petranek  · 技术社区  · 14 年前

    我有一个球体,它的北极在(0,0,1),中心在(0,0,0)。我也有一个相机任意放置在场景中,并看着(0,0,0)。我想旋转球体,使其北极位于从(0,0,0)到相机位置的直线上。我正在顶点着色器中执行此任务,我希望它尽可能简单,以避免FPS下降。有人知道如何计算旋转矩阵的简单方法,甚至知道如何执行球体顶点旋转的简单方法吗?

    2 回复  |  直到 14 年前
        1
  •  3
  •   Goz    14 年前

    旋转矩阵很容易实现。

    如果你认为一个矩阵由4行组成。

    边向量 上方向向量 正向向量 职位

    计算从0,0,0到相机的向量。这很简单(camX,camY,camZ)(其计算为相机位置-对象原点)。

    从那里你得到了你的前向向量。首先使其正常化。

    假设上方向向量是0,1,0。

    你可以简单地交叉积这个上方向向量和正规化的前向向量。这就得到了边向量。最后将边向量和前向量交叉积,得到一个真上向量。矩阵的前三行。在您的示例中,最后一行将是0,0,0,1。

    所以使用D3DX,你可以计算如下:

     D3DXVECTOR3 toCam = camPos - spherePos;
     D3DXVECTOR3 fwdVector;
     D3DXVec3Normalize( &fwdVector, &toCam );
    
     D3DXVECTOR3 upVector( 0.0f, 1.0f, 0.0f );
     D3DXVECTOR3 sideVector;
     D3DXVec3CrossProduct( &sideVector, &upVector, &fwdVector );
     D3DXVec3CrossProduct( &upVector, &sideVector, &fwdVector );
    
     D3DXVec3Normalize( &upVector, &toCam );
     D3DXVec3Normalize( &sideVector, &toCam );
    
     D3DXMATRIX orientation( sideVector.x, sideVector.y, sideVector.z, 0.0f,
                             upVector.x,   upVector.y,   upVector.z,   0.0f,
                             fwdVector.x,  fwdVector.y,  fwdVector.z,  0.0f,
                             spherePos.x,  spherePos.y,  spherePos.z,  1.0f );
    
        2
  •  1
  •   Beta    14 年前

    如果你想要最简单的 旋转矩阵 ,这是您所能做的最好的:

    ρ=sqrt(x +是的 )
    r=sqrt(x +是的 +z轴 )

    
    M =  x/ρ        -y/ρ     x/r
         y z/(r ρ)   x/ρ     y/r
        -ρ/r         0     z/r
    
    最简单的 旋转 实际上需要一个更复杂的矩阵。