我目前正在开发一款渲染纹理球体(代表地球)的游戏,以及代表玩家模型的立方体(稍后将实施)。
当用户单击球体上的点时,立方体将从原点(0,0,0)(也是球体的中心)转换为球体表面上的点。
问题在于我希望立方体旋转,以便将其基座平放在球体表面上(而不是仅仅平移立方体)。
为了达到这个效果,最好的方法是计算每个轴的旋转矩阵?
答案 0 :(得分:2)
这与您制作“lookat”矩阵所执行的计算相同。
在这种形式中,您可以将球体上的标准化点用作一个轴(通常用作“Z”轴),然后将另外两个点作为垂直向量。通常要做到这一点,你选择一些任意的“向上”轴,它不需要与你的第一个轴平行,然后使用两个交叉产品。首先,您穿过'Z'和'向上'以形成'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
是球体和立方体的大小 - 我假设两个形状都以其局部坐标原点为中心。