openGL中立方体到球面的变换

openGL中立方体到球面的变换,opengl,geometry,rendering,transformation,Opengl,Geometry,Rendering,Transformation,我目前正在制作一个游戏,它渲染一个纹理球体(代表地球)和一个代表玩家模型的立方体(稍后将实现) 当用户单击球体上的点时,立方体将从原点(0,0,0)(也是球体的中心)转换到球体表面上的点 问题是,我希望立方体旋转,使其底部平放在球体的表面上(而不仅仅是平移立方体) 为了达到这一效果,最好的方法是计算绕每个轴的旋转矩阵是什么?这与生成“注视”矩阵的计算相同 在这种形式中,您将使用球体上的归一化点作为一个轴(通常用作“Z”轴),然后将其他两个作为与该轴垂直的向量。通常,要做到这一点,您需要选择一些任

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

当用户单击球体上的点时,立方体将从原点(0,0,0)(也是球体的中心)转换到球体表面上的点

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


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

这与生成“注视”矩阵的计算相同

在这种形式中,您将使用球体上的归一化点作为一个轴(通常用作“Z”轴),然后将其他两个作为与该轴垂直的向量。通常,要做到这一点,您需要选择一些任意的“向上”轴,该轴不需要与第一个轴平行,然后使用两个叉积。首先,将“Z”和“Up”交叉,形成“X”轴,然后将“X”和“Z”交叉,形成“Y”轴

X、Y和Z轴(归一化)形成旋转矩阵,该矩阵将立方体定向到球体的曲面法线。然后将其平移到曲面点

德国劳埃德船级社的基本理念是:

浮动x_轴[3];
浮动y_轴[3];
浮动z_轴[3];//这是球体上的点,已归一化
x_轴=交叉(z_轴,向上);
正常化(x_轴);
y_轴=交叉(z_轴,x_轴);
DrawSphere();
浮垫[16]={
x_轴[0],x_轴[1],x_轴[2],0,
y_轴[0],y_轴[1],y_轴[2],0,
z_轴[0],z_轴[1],z_轴[2],0,
(sphereRad+cubeSize)*z_轴[0],(sphereRad+cubeSize)*z_轴[1],(sphereRad+cubeSize)*z_轴[2],1};
glMultMatrixf(mat);
DrawCube();

其中
z_轴[]
是球体上的归一化点,
x_轴[]
是该向量与任意“向上”向量的归一化叉积,
y_轴[]
是其他两个轴的归一化叉积
sphereRad
cubeSize
是球体和立方体的大小-我假设这两种形状都以其局部坐标原点为中心。

感谢您的快速详细响应!我知道你现在是如何生成X,Y和Z轴的,但我不知道它们是如何形成旋转矩阵的?我们是否需要计算从原始“向上”向量到新轴的角度,然后应用相同的逻辑计算其他旋转,或者是生成一个矩阵来为您实现这一点?请您给出一个以曲面上的一个点为向量的快速示例,并演示如何导出最终旋转矩阵?@user2033614您根本不需要计算任何角度,只需要基本的向量运算。我添加了一些伪代码。非常感谢!现在更清楚了(我会投票,但你显然需要15个声誉-我相信其他人会的!)。好的,我现在在球体上有了正确的方向-唯一的问题是它使立方体“变平”,我不知道为什么。旋转矩阵可能有问题吗?