我目前正在开发一个游戏,它渲染一个带纹理的球体(代表地球)和代表玩家模型的立方体(稍后将实现)。
当用户单击球体上的一个点时,立方体会从原点 (0,0,0)(也是球体的中心)平移到球体表面上的点。
问题是我希望立方体旋转以使其底部平放在球体表面上(而不是仅仅平移立方体)。
为了达到这种效果,最好的方法是计算每个轴的旋转矩阵?
我目前正在开发一个游戏,它渲染一个带纹理的球体(代表地球)和代表玩家模型的立方体(稍后将实现)。
当用户单击球体上的一个点时,立方体会从原点 (0,0,0)(也是球体的中心)平移到球体表面上的点。
问题是我希望立方体旋转以使其底部平放在球体表面上(而不是仅仅平移立方体)。
为了达到这种效果,最好的方法是计算每个轴的旋转矩阵?
这与您为制作“lookat”矩阵所执行的计算相同。
在这种形式中,您可以使用球体上的归一化点作为一个轴(通常用作“Z”轴),然后将另外两个作为垂直向量。通常要做到这一点,你选择一些任意的“向上”轴,它不需要与你的第一个轴平行,然后使用两个叉积。首先你穿过'Z'和'Up'来制作'X'轴,然后你穿过'X'和'Z'轴来制作'Y'轴。
X、Y 和 Z 轴(标准化)形成一个旋转矩阵,它将立方体定向到球体的表面法线。然后将其转换为表面点。
GL 的基本思想是这样的:
float x_axis[3];
float y_axis[3];
float z_axis[3]; // This is the point on sphere, normalised
x_axis = cross(z_axis, up);
normalise(x_axis);
y_axis = cross(z_axis, x_axis);
DrawSphere();
float mat[16] = {
x_axis[0],x_axis[1],x_axis[2],0,
y_axis[0],y_axis[1],y_axis[2],0,
z_axis[0],z_axis[1],z_axis[2],0,
(sphereRad + cubeSize) * z_axis[0], (sphereRad + cubeSize) * z_axis[1], (sphereRad + cubeSize) * z_axis[2], 1 };
glMultMatrixf(mat);
DrawCube();
其中z_axis[]
是球体上的归一化点,x_axis[]
是该向量与任意“向上”向量y_axis[]
的归一化叉积,并且是其他两个轴的归一化叉积。sphereRad
并且cubeSize
是球体和立方体的大小 - 我假设这两个形状都以它们的局部坐标原点为中心。