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