【发布时间】:2011-02-28 21:01:13
【问题描述】:
也许这适合 math.stackexchange.com,但由于我是在 OpenGL 中编程的,所以我会在这里问它。
我有一个宇宙飞船游戏的想法,其中世界被限制在 4-D 超球体(也称为 3 球体)的表面。因此,从内部看,它看起来像一个 3-D 世界,但通过向各个方向导航,我永远不会离开 3-sphere 的有限体积。
为了将 3-shpere 表示为“平面”3-D 空间,我使用了立体投影,它作为 GLSL 着色器实现起来非常简单,只需将输入向量除以 1 减去其 w 坐标即可。
为了表示对象的顶点,我使用了标准化的 4d 向量,例如 x²+y²+z²+w²=1,从而将它们保持在 3 球体内。
首先要解决的问题是旋转。但我很快发现普通的 3d 旋转矩阵足以在 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 中是最佳的)。我可以考虑一个骇人听闻的解决方案:对于每个顶点 V,做 V' = normalize(d*F + V),其中 d 是向前移动的距离(在某些奇怪的单位中,我不能完全精确)。这种方式只适用于较小的 d 值,d 与角度变化之间没有直接关系。
因此问题是:如何在 4-D 超球面的表面上前进(使用 4x4 矩阵变换)?
【问题讨论】:
-
您能否参考一下您的 Hypersphere 的数学描述?
-
就像我说的,它只是 x²+y²+z²+w²=1
-
@ivella 刚刚出现在您的 QA 中,请参阅 How to use 4d rotors 和 Understanding 4x4 homogenous transform matrices。翻译只是将前向向量添加到位置(矩阵原点)您可以使用 mat4 和 vec4 完成所有矩阵操作...您只需使用 vec4 添加缺少的行/列操作...
标签: opengl