我目前工作的一个游戏,呈现一个纹理球(代表地球)和代表球员模型的多维数据集(将在后面实现)。
当用户点击在球面上的点,立方体从原点(0,0,0)(其也是球体的中心),以球体的表面上的点转换。
问题是,我想立方体旋转,以便与它坐的基本球体表面的平坦(而不是仅仅翻译立方体)。
什么是最好的方法是,计算以达到这种效果关于每个轴的旋转矩阵?
我目前工作的一个游戏,呈现一个纹理球(代表地球)和代表球员模型的多维数据集(将在后面实现)。
当用户点击在球面上的点,立方体从原点(0,0,0)(其也是球体的中心),以球体的表面上的点转换。
问题是,我想立方体旋转,以便与它坐的基本球体表面的平坦(而不是仅仅翻译立方体)。
什么是最好的方法是,计算以达到这种效果关于每个轴的旋转矩阵?
这是因为你执行做一个“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
是球体和立方体的大小-我假定这两种形状都集中在其本地坐标原点。