在OpenGL中浏览超球面

lve*_*lla 2 opengl

也许这适合math.stackexchange.com,但由于我在OpenGL中编程,我会在这里问一下.

我有一个宇宙飞船游戏的想法,世界被限制在4-D超球面(也称为3球体)的表面.因此,从内部看,它看起来像一个三维世界,但通过向各个方向导航,我永远不会离开3球的有限体积.

为了将3-shpere表示为"平坦的"3-D空间,我使用立体投影,它作为GLSL着色器实现起来非常简单,只需要将输入矢量除以1减去其w坐标.

为了表示对象的顶点,我使用归一化的4d向量,使得x 2 + y 2 + z 2 + w 2 = 1,从而将它们保持在3球内.

要解决的第一个问题是轮换.但我很快就发现普通的三维旋转矩阵足以在3d投影中围绕观察者旋转世界,因为它不会弄乱w坐标(就像围绕z轴旋转一个球体也会旋转它立体投影).

然后我发现沿着w轴旋转相当于3d投影内的平移(只是不可交换,就像"平面"空间上的普通3d平移),然后我可以通过使用简单的绕轴旋转矩阵沿着轴平移(x',y')=(x*cos a - y*sin a,x*sin a + y*cos a),但是w与另一个轴一起变化.

这是我到目前为止所得到的,根据观察者从投影所面对的位置,我无法弄清楚如何向前导航.我可以应用逆变换来导出观察者在超球面坐标中面对的标准化4-D向量(称为F),但我不知道如何通过使用4x4矩阵在该方向上导航(OpenGL中的最佳值) ).我可以考虑一个hackish解决方案:对于每个顶点V,做V'= normalize(d*F + V),其中d是向前移动的距离(在一些奇怪的单位我不能精确).这种方式仅适用于较小的d值,d与角度变化之间没有直接关系.

因此问题是:如何向前移动(使用4x4矩阵变换)在4-D超球面?

Bob*_*oss 6

事实证明,我不久前在这个领域写过一些论文.这个(四维交互式可视化方法)最适用于您的特定问题,但引用此问题的其他文档也可能对您有所帮助.在那个特定的应用程序中,我正在旋转4D中观察到的对象,而不是观察者,但数学是等效的.

关于这个具体问题:

因此问题是:如何在4-D超球面上前进(使用4x4矩阵变换)?

如果你在超球面上移动,你就不会在w中翻译.实际上,您需要围绕单位半径的大圆移动球形几何体.这意味着,如果您可以为您的参照系构建适当的轴,您可以在您所在的位置和您前进的位置之间进行球面插值.

例如,可以用于这种slerp的一种结构是使用指向正前方的单位向量(您的视线,也就是p_1维基百科方程中),一个从头顶出来的向量点(p_0)和指向右耳的矢量(制作右手坐标系).

如果您以角速度而不是线性速度跟踪球体上的速度,则可以t在维基百科中插入(经过时间)的值以找到新的角度位置.

请注意,该等式对顶点中的组件数量没有限制p.球面插值适用于任何几何体.

编辑(回复评论中的问题):

Slerp似乎不是这里的情况,因为我不希望随着时间的推移插入2个向量之间的旋转.相反,在每个时间步,我想将每个顶点移动到观察者在那一刻移动的相反方向.因此,我处于位置(0,0,0,1)并且我想要在(sqrt(2)/ 2,sqrt(2)/ 2,0,0)下一帧.

可以这样想:你在球体上(任何维度)的位置是一个向量,将你从中心移动到表面.如果你以特定的角速度移动,那么你就会在时间t1等p0和时间t0,p1等.Slerp是在特定时间计算这些位置的便捷方式.

同样,您的视线是与位移矢量成直角的矢量.视线在时间t0为v0,在时间t1为v1,依此类推.Slerp再次用于计算该向量.

如何构建对应的变换矩阵,这样每个顶点都会乘以它的倒数?

使用这两个向量,正交化为您提供第三个,现在您有了一个新的参考框架.有一个四元数,用于定义从原始参考框架到此新参考框架的旋转.这就是你要找的东西.

但是,在将世界渲染到二维屏幕之前,首先需要将其从4D渲染到3D.OpenGL(不出所料)并不直接支持这一点.

要了解原因,请查看透视投影矩阵.它假设您在3D空间中渲染同质点:x,y,z位于前三个分量中,w(缩放因子)位于第四个分量中.w = 0表示矢量,而w =其他任何表示点.w =除1之外的任何值都是非标准化点.

因此,没有办法在(0,0,0,0)的4D原点渲染点.

然而,从矩阵的构造中可以看出,制作4D到3D投影矩阵并不困难.首先将其应用于几何集,而不依赖于OpenGL的矩阵管道.然后,您可以将OpenGL标准矩阵用于3D到屏幕.