1

我目前正在开发一个游戏,它渲染一个带纹理的球体(代表地球)和代表玩家模型的立方体(稍后将实现)。

当用户单击球体上的一个点时,立方体会从原点 (0,0,0)(也是球体的中心)平移到球体表面上的点。

问题是我希望立方体旋转以使其底部平放在球体表面上(而不是仅仅平移立方体)。

为了达到这种效果,最好的方法是计算每个轴的旋转矩阵?

4

1 回答 1

2

这与您为制作“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是球体和立方体的大小 - 我假设这两个形状都以它们的局部坐标原点为中心。

于 2013-02-01T20:22:28.040 回答