- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
也许这适合 math.stackexchange.com,但由于我是在 OpenGL 中编程的,所以我会在这里问。
我有一个宇宙飞船游戏的想法,其中世界被限制在 4-D 超球体(也称为 3 球体)的表面。因此,从内部看它就像一个 3 维世界,但通过向各个方向导航,我永远不会离开 3 维球体的有限体积。
为了将 3-shpere 表示为“平坦”的 3-D 空间,我使用了立体投影,作为 GLSL 着色器实现起来非常简单,只需将输入向量除以其 w 坐标即可。
为了表示对象的顶点,我使用标准化的 4d 向量,使得 x²+y²+z²+w²=1,从而将它们保持在 3 维球内。
首先要解决的问题是旋转。但我很快发现普通的 3d 旋转矩阵足以在 3d 投影中围绕观察者旋转世界,因为它不会弄乱 w 坐标(很像围绕 z 轴旋转球体也会旋转它的立体投影)。
然后我发现沿 w 轴旋转等同于 3d 投影内的平移(只是不可交换,作为“平坦”空间上的普通 3d 平移),然后我可以通过使用简单的 around 沿轴平移轴旋转矩阵 (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 矩阵变换)?
最佳答案
原来前段时间写了一些这方面的论文。这个 ( Interactive Visualization Methods For Four Dimensions ) 最适合您的特定问题,但引用这个的其他文档也可能对您有所帮助。在那个特定的应用程序中,我在 4D 中旋转被观察的对象,而不是观察者,但数学是等价的。
关于这个具体问题:
Thus the question is: how to move forward (using a 4x4 matrix transform) being in the surface of an 4-D hypersphere?
如果您在超球体的表面上四处移动,您并不是在翻译w。您实际上需要在球形几何体中围绕单位半径的大圆移动。这意味着,如果您可以为您的参照系构建适当的轴,您可以 spherically interpolate在你所处的位置和你要去的地方之间。
例如,可用于此类 slerp 的一种构造是使用指向正前方的单位向量(您的视线,在维基百科方程中又名 p_1
),向量指向顶部你的头部 ( p_0
) 和一个指向你右耳的向量(以形成右手坐标系)。
如果您随后以角速度而不是线性速度跟踪球体上的速度,则只需插入一个值 t
(耗时)在维基百科中找到您的新角度位置。
请注意,该等式对顶点 p
中的分量数量没有限制。 .球面插值适用于任何几何形状。
编辑(回答评论中的问题):
Slerp seems not to be the case here, because I do not want to interpolate a rotation between 2 vectors over time. Instead, at each time step, I want to move every vertex into the opposite direction the viewer is moving at that moment. Thus, I am at position (0, 0, 0, 1) and I want to be at (sqrt(2)/2, sqrt(2)/2, 0, 0) next frame.
这样想:您在球体(任意维度)上的位置是一个矢量,它将您从中心移到表面。如果您以特定角速度四处移动,那么您在 p0 和时间 t0,p1 在时间 t1,等等。Slerp 是计算特定时间这些位置的便捷方法。
同样,您的视线是与位移矢量成直角的矢量。视线在时间 t0 时为 v0,在时间 t1 时为 v1,依此类推。 Slerp 再次可用于计算该向量。
How can I build the correspondent transformation matrix, so every vertex will be multiplied by the inverse of it?
使用这两个向量,orthogonalization给你第三个,你现在有了一个新的引用系。有一个single quaternion that defines the rotation从你原来的引用系到这个新的引用系。这就是您要找的。
但是,在将您的世界渲染到二维屏幕上之前,您首先需要将其从 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 显示到屏幕上。
关于opengl - 在 OpenGL 中通过超球面导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5147526/
在 OpenGL/ES 中,在实现渲染到纹理功能时,您必须小心,不要引起反馈循环(从正在写入的同一纹理中读取像素)。由于显而易见的原因,当您读取和写入纹理的相同像素时,行为是未定义的。但是,如果您正在
正如我们最终都知道的那样,规范是一回事,实现是另一回事。大多数错误是我们自己造成的,但有时情况并非如此。 我相信列出以下内容会很有用: GPU 驱动程序中当前已知的与最新版本的 OpenGL 和 GL
很难说出这里问的是什么。这个问题是模棱两可的、模糊的、不完整的、过于宽泛的或修辞的,无法以目前的形式得到合理的回答。为了帮助澄清这个问题以便可以重新打开它,visit the help center
我正在学习 OpenGL,非常想知道与显卡的交互如何。 我觉得了解它是如何在图形驱动程序中实现的,会让我了解 opengl 的完整内部结构(通过这个我可以知道哪些阶段/因素影响我对 opengl 性能
我正在尝试绘制到大于屏幕尺寸(即 320x480)的渲染缓冲区 (512x512)。 执行 glReadPixels 后,图像看起来是正确的,除非图像的尺寸超过屏幕尺寸——在本例中,超过 320 水平
我正在 Windows 中制作一个 3D 小行星游戏(使用 OpenGL 和 GLUT),您可以在其中穿过一堆障碍物在太空中移动并生存下来。我正在寻找一种方法来针对无聊的 bg 颜色选项设置图像背景。
如果我想要一个包含 100 个 10*10 像素 Sprite 的 Sprite 表,是否可以将它们全部排成一排来制作 1,000*10 像素纹理?还是 GPU 对不那么窄的纹理表现更好?这对性能有什
这个问题在这里已经有了答案: Rendering 2D sprites in a 3D world? (7 个答案) 关闭 6 年前。 我如何概念化让图像始终面对相机。我尝试将三角函数与 arcta
是否可以在 OpenGL 中增加缓冲区? 假设我想使用实例化渲染。每次在世界上生成一个新对象时,我都必须用实例化数据更新缓冲区。 在这种情况下,我有一个 3 个 float 的缓冲区 std::v
有人可以向我解释为什么下面的代码没有绘制任何东西,但如果我使用 GL_LINE_LOOP 它确实形成了一个闭环吗? glBegin(GL_POLYGON); for(int i = 0; i <= N
正如标题所说,OpenGL 中的渲染目标是什么?我对 OpenGL 很陌生,我看到的所有网站都让我很困惑。 它只是一个缓冲区,我在其中放置稍后将用于渲染的东西吗? 如果您能提供一个很好的引用来阅读它,
当使用 OpenGL 1.4 固定功能多纹理时,每个纹理阶段的输出在传递到下一个阶段之前是否都固定在 [0, 1]? spec说(第 153 页): If the value of TEXTURE_E
我比较了 2 个函数 openGL ES 和 openGL gvec4 texelFetchOffset(gsampler2DArray sampler, ivec3 P, int lod, ivec
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 6年前关闭。 Improve this qu
那么当你调用opengl函数时,比如glDraw或者gLBufferData,是否会导致程序线程停止等待GL完成调用呢? 如果不是,那么 GL 如何处理调用像 glDraw 这样的重要函数,然后立即更
我正在尝试实现级联阴影贴图,当我想访问我的视锥体的每个分区的相应深度纹理时,我遇到了一个错误。 更具体地说,当我想选择正确的阴影纹理时会出现我的问题,如果我尝试下面的代码,我会得到一个像 this 中
我想为OpenGL ES和OpenGL(Windows)使用相同的着色器源。为此,我想定义自定义数据类型并仅使用OpenGL ES函数。 一种方法是定义: #define highp #define
我尝试用 6 个位图映射立方体以实现天空盒效果。我的问题是一个纹理映射到立方体的每个面。我已经检查了 gDEBugger,在立方体纹理内存中我只有一个 图像(因为我尝试加载六个图像)。 代码准备纹理:
在 OpenGL 中偏移深度的最佳方法是什么?我目前每个多边形都有索引顶点属性,我将其传递给 OpenGL 中的顶点着色器。我的目标是在深度上偏移多边形,其中最高索引始终位于较低索引的前面。我目前有这
我是一名优秀的程序员,十分优秀!