在OpenGL中浏览超球面

时间:2011-02-28 21:01:14

标签: opengl

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

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

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

要表示对象的顶点,我使用的是标准化的4d向量,这样x²+y²+z²+w²= 1,从而将它们保持在3球内。

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

然后我发现沿着w轴旋转相当于三维投影内的平移(只是不可交换,就像“平面”空间上的普通三维平移一样),然后我可以通过使用简单的周围沿着轴平移轴旋转矩阵(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与角度变化之间没有直接关系。

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

3 个答案:

答案 0 :(得分:6)

事实证明我前段时间在这方面写过一些论文。这一个(Interactive Visualization Methods For Four Dimensions)最适用于您的特定问题,但引用此问题的其他文档也可能对您有所帮助。在那个特定的应用程序中,我正在旋转4D中观察到的对象,而不是观察者,但数学是等效的。

关于这个具体问题:

  

因此问题是:如何移动   前进(使用4x4矩阵变换)   处于4-D的表面   超球面?

如果您在超球面上移动,则不会在 w 中进行翻译。实际上,您需要围绕单位半径的大圆移动球形几何体。这意味着,如果您可以为您的参考框架构建适当的轴,您可以spherically interpolate在您所在的位置和您前往的位置之间。

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

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

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

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

  

Slerp似乎并非如此,   因为我不想插入一个   2个向量随时间的旋转。   相反,在每个时间步,我想   将每个顶点移动到相反的位置   观众正朝这个方向前进   时刻。因此,我在位置(0,0,   0,1)我希望在(sqrt(2)/ 2,   sqrt(2)/ 2,0,0)下一帧。

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

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

  

我如何建立通讯员   变换矩阵,所以每个顶点   将乘以倒数   它?

使用这两个向量,orthogonalization为您提供第三个向量,您现在有了一个新的参考框架。从原始参考框架到这个新参考框架有一个single quaternion that defines the rotation。这就是你要找的东西。

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

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

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

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

答案 1 :(得分:1)

你可能需要5x5矩阵,因为你在4空间运行。同质坐标的思想是通过应用线性算子引入一个额外的维度来表示加法运算。

我真的很喜欢你的想法,但出于好奇:为什么不简单地定义一个循环的3空间,即在给定值处包裹坐标。使用几何着色器,您可以复制包裹的基元的顶点(您必须剪切,并将剪切的顶点与引入的辅助顶点一起移向空间的另一端)。这会产生一种镜子效果,所以你也要引入某种视野。

答案 2 :(得分:1)

我在math.stackexchange.com上问了同样的问题,因为这个问题与数学有关,我可能会在那里得到更好的答案。如果您对我实际使用的原始答案感兴趣,请查看here

在4D中,没有一个矢量垂直于任何旋转,但实际上是垂直矢量的整个平面,这让我感到困惑。

另外,在OpenGL中,我很快发现我可以简化给定解决方案的计算,因为我总是可以假设我处于4D投影原点(0,0,0,-1),始终面向(0 ,0,-1,0),然后沿z和w平移给定角度,并将其乘以前一帧已经累积的GL_MODELVIEW_MATRIX。所以我做了MODELVIEW <= M x MODELVIEW而不是MODELVIEW <= MODELVIEW x M如果我只是致电glMultMatrix(M)我会得到。{/ p>