旋转球体,使其杆朝向相机

时间:2010-11-21 12:45:13

标签: directx direct3d 3d

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

2 个答案:

答案 0 :(得分:3)

旋转矩阵非常容易执行。

如果您将矩阵视为由4行组成。

侧向量 向量 前向矢量 位置

您计算从0,0,0到摄像机的矢量。这只是(camX,camY,camZ)(它计算为摄像机位置 - 对象原点)。

从那里你现在有你的前锋矢量。首先将其标准化。

因此,我们假设向上矢量为0,1,0。

您可以简单地交叉产生此向上矢量和标准化的前向矢量。这为您提供了侧向量。最后交叉产生侧向和向前矢量以给出TRUE向上矢量。并且你有前三行的矩阵。在你的例子中,最后一行将是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 );

答案 1 :(得分:1)

如果您想要最简单的旋转矩阵,这是您可以做的最好的事情:

ρ= sqrt(x 2 + y 2
r = sqrt(x 2 + y 2 + z 2


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