问题标签 [glfrustum]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
opengl - 0.00 是 OpenGL 中顶点的有效 z 值吗?
在 OpenGL 中,您的视点始终位于 [0,0,0]。假设此时您有一个顶点作为立方体或其他对象的一部分。该顶点是在相机/视点的前面还是后面?在投影之后,当 z==0 时,我总是以 w=1 结束,这也(如预期的那样)发生在 z==-1 的顶点上。所以实际上 z=0 和 z=-1 的顶点在投影后的距离相等。
在此处查看vec(2,2,0)和vec(2,2,-1)如何以相同的屏幕坐标结束:https ://jsfiddle.net/sf4dspng/1/
结果:
这是为什么?
c - 行不使用 glFrustum() 显示?
我试图在窗口上画一条线,但它没有显示glFrustum()
。我使用了相同的代码,glOrtho()
它确实显示了该行。我还需要设置什么才能让我的线路显示在设置窗口上吗?
3d - 在哪个空间进行可见表面测定以及如何进行?
可见性问题可以通过按深度对多边形进行排序(Painter 算法)来解决,并在 z 范围重叠的情况下支持 Newell 算法。Newell 算法在此处和此处进行了解释。第 3 点和第 4 点涉及将多边形 1 的每个顶点与多边形 2 的平面进行比较。
为了得到正确的结果,我们应该在裁剪后进行比较(因为裁剪后的多边形可能会从视点完全位于另一个多边形平面的另一侧)。裁剪是在投影之后完成的(因为投影矩阵定义了要裁剪的截头体),这意味着我们必须在投影之后将顶点与平面进行比较。
此外,我们必须将向量归一化,因为投影空间中的 x、y 和 z 值仅适用于它们自己的 w 上下文。
归一化后,我们不再有线性深度,这意味着如果将两个多边形靠近远平面,它们的 z 值会变得更近。在非线性深度空间中,计算法线、点平面距离或检测点位于平面哪一侧所需的任何东西都将失败。
那么,如何执行“P的所有顶点是否都比Q的平面更深”这一步呢?
c++ - OpenGL如何反向透视?
我正在寻找一种使用 OpenGL 和 C++ 进行反向透视的方法。目前,我使用 glFrustum 来获得经典视角,但我想知道此处介绍的反向视角(https://en.wikipedia.org/wiki/Reverse_perspective及以下)是否可能?如果没有,OpenGL还有其他方法可以做到这一点吗?
opengl - 是否可以只渲染 gluLookAt 看到的剪辑区域?
是否可以通过具有较小 FoV 的平截头体/走廊/孔“查看”以例如 60 度垂直 FoV 渲染的 OpenGL 场景 - 并填充生成的投影平面?
我认为这与“放大”不同。
背景:
我在这里为光学透视 AR 显示器使用 OpenGL 变换管道而苦苦挣扎。可能是我对我的设置的 OpenGL 转换管道真正需要混合的内容有所了解......我正在创建图形,当通过 AR 眼镜覆盖时,这些图形旨在正确地显示在现实世界中。眼镜在 3D 空间中被正确跟踪。为了渲染图形,我使用的是 OpenGL 的传统固定函数管道。结果很好,但我一直在努力解决注册错误,这些错误似乎源于我的组合glFrustum()
加上glLookAt()
没有正确地重新创建“透视印象”。
这些 AR 显示器通常不会填满佩戴者的整个视野,但显示区域看起来像一个漂浮在空间中的较小“窗口”,通常在用户前方约 3-6 英尺处,与头部运动有关。
在 OpenGL 中,我使用与Bourke非常相似的布局,其中(我希望我总结正确)显示器的纵横比(例如 4:3)与 windowwidth 和 windowheight 定义了垂直视野。因此,FoV 与窗口尺寸和 OpenGL 使用的“变换平截头体”形成了固定链接——而我需要结合两个平截头体(?):
我的理解是,必须使用与人眼“参数”相当的参数来渲染 OpenGL 场景才能匹配——因为 AR 眼镜允许用户看穿。假设人眼的焦距为 22 毫米(Clark, RN Notes on the Resolution and Other Details of the Human Eye. 2007.),眼睛的“传感器尺寸”为 16 毫米宽 x 13 毫米高(我的估计)。计算出的垂直 FoV 约为 33 度 - 我们将其输入 OpenGL 管道。
这种管道的输出将是我得到一个充满这个“视图”的应用程序窗口,或者我可以获得一个缩小版本的 if,这取决于我的glViewport
设置。
但是由于 AR 眼镜只需要输入人类佩戴者整个视野的一个子部分,一个“较小的窗口”,我想我需要一种方法来“查看”整体的一个较小的子区域渲染场景 - 好像我正在通过一个小洞看场景。这些具有“显示窗口”的眼镜提供了大约 20 度以下的垂直视野——但将其输入 OpenGL 管道是错误的。那么,我该如何组合这些相互冲突的 FoV?...还是我在这里走错了路?
c++ - 我如何计算 glFrustum 参数?
我有这个代码:
我必须用 glFrustum 替换 glOrtho 函数并得到相同的结果。
我阅读了关于 khronos 的 opengl 指南并理解了 glOrtho 和 glFrustum 之间的区别,但我不知道如何计算参数。
如何计算要传递给 glFrustum 函数的参数?