2013-02-01 38 views
1

我目前正在制作一个呈现纹理球体(代表地球)和代表球员模型(将在稍后实施)的立方体的游戏。将立方体转换为openGL中的球体表面

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

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

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

回答

2

这与您制作“查看”矩阵的计算方法相同。

在这种形式中,将使用的归一化点在球体上作为一个轴(通常用作“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是球体和立方体的大小 - 我假设两个形状都以它们的本地坐标原点为中心。

+0

感谢您的快速和详细的反应! 我明白你现在如何生成X,Y和Z轴,但我不确定我是否理解它们是如何形成旋转矩阵的?我们是否需要计算从原来的'向上'向量到新轴的角度,然后应用相同的逻辑来计算其他旋转,还是生成一个矩阵来为您做这些? – mds91

+0

请你能举一个简单的例子,将表面上的一个点作为一个向量,并展示如何导出最终的旋转矩阵? – mds91

+0

@ user2033614根本不需要计算任何角度,只需要基本的矢量操作。我添加了一些伪代码。 – JasonD