问题标签 [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.

0 投票
1 回答
543 浏览

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/

结果:

这是为什么?

0 投票
0 回答
116 浏览

android - OpenGL ES(Android)按z近和远切割的缩放球体

我有一个可以通过平移旋转的 OpenGL ES 1.0 纹理球体:

领域

如您所见,我的视口是屏幕最大边大小的正方形(这是我想要的)。球体的半径为 1,因此它填充了最大的一侧(同样,这就是我想要的)。

现在我希望能够放大/缩小。我通过使用 gl.glScalef(x, y, z) 来做到这一点。它可以工作,但在某些时候,球体变得太大并且正在被切割,我猜默认的 z 近/远平面:

在此处输入图像描述

是否可以增加这些默认值,还是需要使用 glFrustumf?

使用 glFrustumf 时,球体在放大/缩小时不再被切割,但图像很奇怪:

在此处输入图像描述

缩小时:

在此处输入图像描述

知道发生了什么吗?

以下是我正在使用的代码的相关部分:

0 投票
1 回答
119 浏览

c - 行不使用 glFrustum() 显示?

我试图在窗口上画一条线,但它没有显示glFrustum()。我使用了相同的代码,glOrtho()它确实显示了该行。我还需要设置什么才能让我的线路显示在设置窗口上吗?

0 投票
1 回答
231 浏览

opengl - 如果我使用 glFrustum,为什么这个对象会有所不同?

我正在为我的计算机图形类做这个 OpenGL 项目,我在其中显示一个对象并旋转它和其他东西,事情是在我们使用的项目开始时glOrtho()它看起来非常棒。

glOrthoOBJ

但是现在老师说我们必须使用glFrustum()透视,如果我使用那个函数,对象是这样绘制的,我真的不知道为什么会这样:

glFrustumOBJ

这是我init()在一切都发生变化的函数中的代码:

我会很感激你的帮助。

编辑:如果我使用 glFrustum(-100, 100, -100, 100, 20, 200) 它看起来像这样,就像我越来越近了,但是 left、right、top 和 bottom 参数呢?他们同意这些价值观吗?

在此处输入图像描述

0 投票
1 回答
74 浏览

3d - 在哪个空间进行可见表面测定以及如何进行?

可见性问题可以通过按深度对多边形进行排序(Painter 算法)来解决,并在 z 范围重叠的情况下支持 Newell 算法。Newell 算法在此处此处进行了解释。第 3 点和第 4 点涉及将多边形 1 的每个顶点与多边形 2 的平面进行比较。

为了得到正确的结果,我们应该在裁剪后进行比较(因为裁剪后的多边形可能会从视点完全位于另一个多边形平面的另一侧)。裁剪是在投影之后完成的(因为投影矩阵定义了要裁剪的截头体),这意味着我们必须在投影之后将顶点与平面进行比较。

此外,我们必须将向量归一化,因为投影空间中的 x、y 和 z 值仅适用于它们自己的 w 上下文。

归一化后,我们不再有线性深度,这意味着如果将两个多边形靠近远平面,它们的 z 值会变得更近。在非线性深度空间中,计算法线、点平面距离或检测点位于平面哪一侧所需的任何东西都将失败。

那么,如何执行“P的所有顶点是否都比Q的平面更深”这一步呢?

0 投票
2 回答
389 浏览

c++ - OpenGL 似乎正在使用(过于激进)截锥体剔除,我看不到如何修改

我正在尝试让 OpenGL 应用程序在 c++ 中工作。OpenGL 似乎正在剔除远近对象。

在此处输入图像描述

屏幕截图应该是一堆方形图块,但距离相机太近或太远一定距离的方块不会被渲染。这意味着实际上只渲染了一条狭窄的正方形(在我认为是近平面和远平面之间)。

我没有使用平截头体剔除,我启用的唯一剔除是背面剔除。默认情况下,OpenGL 是否有某种截锥体剔除?是否需要启用 glEnable 才能让我的所有三角形实际渲染?启用 GL_DEPTH_TEST 绝对会停止渲染所有内容,无论我之后是否调用 glFrustum(...) 。

谢谢。

0 投票
1 回答
434 浏览

c++ - OpenGL如何反向透视?

我正在寻找一种使用 OpenGL 和 C++ 进行反向透视的方法。目前,我使用 glFrustum 来获得经典视角,但我想知道此处介绍的反向视角(https://en.wikipedia.org/wiki/Reverse_perspective及以下)是否可能?如果没有,OpenGL还有其他方法可以做到这一点吗?

在此处输入图像描述

0 投票
1 回答
357 浏览

opengl - 使用 glFrustum 在 OpenGL 中绘制透视图

我正在尝试以橱柜的视角绘制一个立方体。这是中的立方体glOrtho

立方体

其他面:背面 - 青色,左侧 - 洋红色,向下 - 蓝色

这就是我得到的

这就是我想要实现的

我的代码:

我在这里做错了什么?我在对象上尝试了一些旋转,但得到了一些倾斜的结果(如果需要,我可以发布更多图像)。

0 投票
0 回答
59 浏览

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?...还是我在这里走错了路?

0 投票
2 回答
188 浏览

c++ - 我如何计算 glFrustum 参数?

我有这个代码:

我必须用 glFrustum 替换 glOrtho 函数并得到相同的结果。

我阅读了关于 khronos 的 opengl 指南并理解了 glOrtho 和 glFrustum 之间的区别,但我不知道如何计算参数。

如何计算要传递给 glFrustum 函数的参数?