上变换立方体在OpenGL球体表面(Transform cube on to surface of

2019-10-17 15:57发布

我目前工作的一个游戏,呈现一个纹理球(代表地球)和代表球员模型的多维数据集(将在后面实现)。

当用户点击在球面上的点,立方体从原点(0,0,0)(其也是球体的中心),以球体的表面上的点转换。

问题是,我想立方体旋转,以便与它坐的基本球体表面的平坦(而不是仅仅翻译立方体)。

什么是最好的方法是,计算以达到这种效果关于每个轴的旋转矩阵?

Answer 1:

这是因为你执行做一个“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[]是其它两个轴的归一化交叉乘积。 sphereRadcubeSize是球体和立方体的大小-我假定这两种形状都集中在其本地坐标原点。



文章来源: Transform cube on to surface of sphere in openGL