问题标签 [frustum]
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.
3d - 计算 3D 空间中的视锥体
我已经绘制了一个又一个图表,说明如何计算三维空间中视锥体的边界点。首先,我有两组数据,每组包含三个值:相机的 xyz 坐标和围绕 x、y 和 z 轴的旋转。给定一定的视距,应该可以计算 6 个平面中每个平面的边界点。我一直在使用这些方程式来计算远平面的宽度和高度:
hfar 是远平面的高度, wfar 是宽度, ratio 是视口宽度除以高度的比率。我一直在使用下图来尝试弄清楚:
我需要找到由 (?,?,?) 注释的点。几天来我一直在尝试计算这些值,但无济于事。任何帮助,将不胜感激。
此外,可以在此处和此处找到一些提供有关该主题的信息的好资源。
编辑:我掀起的另一张图像显示了通过 y 轴的单个切片,俯视 x 轴。它显示了与上图相同的信息,但也显示了我的问题:我无法为远平面的每个边界点计算正确的 z 轴值。
请记住,可以通过 x 轴进行相同的切割,以显示相同的过程,但具有玩家向上或向下看的角度。
vector - 向量说明
我一直在关注这篇关于平截头体剔除的文章,我需要一些帮助来理解它背后的向量数学。更具体地说,他所说的“向上”和“正确”的向量是什么?他们持有什么价值观?很抱歉这个简短而令人兴奋的问题,但我真的坚持这一点。任何帮助表示赞赏!谢谢
matrix - 计算平截头体中心
如果我有一个列主要(opengl)矩阵,它是投影矩阵乘以模型视图矩阵的结果。如何计算该矩阵的中心点?我问的原因是因为我只能访问结果矩阵,我需要找到视图中心的位置?
谢谢你。
opengl - Frustum Culling 的“雷达方法”:第一次简单测试失败?
尝试至少让Lighthouse3D 雷达截锥体剔除教程的非常简单 的第 1 部分工作......并且我什至无法在我的渲染器中使该部分工作,这让我感到非常困惑。
所以第一步是:你测试一个点是在近平面前面还是在远平面后面,如果是这样,就提前剔除。(如果没有,您将执行进一步的测试,但我只停留在第一部分。)
我使用 2x2 立方体的世界空间中心 (x1y2z3) 并有一个可以自由移动和旋转的相机。我所有的向量和矩阵的东西都必须相当坚固,否则渲染器工作得很好。所以这是我对第一部分的看法(在 Go 中),简单的“Z vs near-or-far”测试:
现在为什么我要反转 ref 的 Z?因为在教程中他们写道:“请注意,图中的引用不是右手系统(如在 OpenGL 中),因为 Z 的方向已反转以使教程更直观”——嗯,在 GL 教程中当然,这会产生相反的效果......
好吧,如果像上面那样反转 Z,它会在大约 50% 的时间里剔除更多;如果我不这样做,那么它大约有 98% 的时间会“过度剔除”..
我错过了什么?
xna - 如何仅绘制模型“镜头前”全部或部分显示 - XNA
我正在开发一款 XNA 风格的“MinecraftGame”小游戏。
因为有很多立方体要绘制。我创建了一个函数,只允许你在相机前绘制立方体!但问题是,如果一个立方体在我的视野中没有完全充满,它就不会被绘制出来。正如您在下面的“屏幕截图”中看到的那样。不绘制位于边缘的立方体。如何绘制完全和部分显示在镜头前的立方体?而且不仅完全。
非常感谢
这是我检查 Frustum 是否包含模型的代码:
截图:
opengl - 平铺渲染 glFrustum 剪裁平面计算
我试图让一个平铺渲染器工作(这个想法是通过将它分解成块并单独渲染来渲染一个大视图平截头体)。
我有代码可以将具有视角的标准透视投影转换为左、右、上和下剪切平面,然后可以将其传递给 glFrustum。
我被困在正确地打破这一点。
matrix - 使用视图矩阵进行截锥剔除
在 GLSL 着色器中,我需要省略一些曲面细分补丁以显着提高性能。这些补丁是三角形,每个顶点都有给定的世界坐标。但是,当我将这些坐标转换为视锥体剔除的视图空间时,存在误差。
这是原始地形。
这就是错误在顶部影响它的方式。
这是一个有污垢的部分的特写镜头。
这些错误不仅发生在屏幕顶部,还发生在侧面和底部。这是我用来确定是否应该排除三角形的代码(在 GLSL 中)。
我将不胜感激任何帮助!贝希米斯
c++ - 用于桌面 VR 的 OpenGL 非对称截锥体
我正在制作一个 OpenGL c++ 应用程序来跟踪用户相对于屏幕的位置,然后将渲染场景更新为用户的视角。这被称为“桌面 VR”,或者您可以将屏幕视为立体模型或鱼缸。我对 OpenGL 相当陌生,到目前为止只定义了一个非常简单的场景,只是一个立方体,并且最初是正确渲染的。
问题是当我开始移动并想要重新渲染立方体场景时,投影平面似乎被平移了,我看不到我认为我应该看到的内容。我想把这架飞机修好。如果我正在编写光线追踪器,我的窗口将始终是固定的,但我的眼睛可以随意移动。有人可以向我解释如何在让我的相机/眼睛在非原点坐标处徘徊的同时达到我想要的效果(固定观察窗)吗?
我发现的所有示例都要求相机/眼睛位于原点,但这在概念上对我来说并不方便。另外,因为这是一个“鱼缸”,我将我的 d_near 设置为 xy 平面,其中 z = 0。
在屏幕/世界空间中,我将屏幕中心分配给 (0,0,0) 并将其 4 个角分配给:TL(-44.25, 25, 0) TR( 44.25, 25, 0) BR( 44.25,-25 , 0) BL(-44.25,-25, 0) 对于 16x9 显示器,这些值以厘米为单位。
然后,我使用 POSIT 计算用户的眼睛(实际上是我脸上的网络摄像头),通常在 (+/-40, +/-40, 40-250) 的范围内。我的 POSIT 方法是准确的。
我正在为透视和查看变换以及使用着色器定义自己的矩阵。
我初始化如下:
根据我在网上收集的信息,我的 view_dir 及以上内容将保持不变。这意味着我只需要更新 d_near 和 d_far 以及 d_x、d_y 和 d_y?我在我的 glutIdleFunc(idle);
这是我的着色器代码:
好的,我对代码进行了一些更改,但没有成功。当我在顶点着色器中使用 V 代替 MV 时,一切看起来都如我所愿,透视正确且对象大小合适,但是,场景是通过相机的位移来平移的。
当使用 C 和 V 获得 MV 时,我的场景是从观察者的角度直接渲染的,渲染的场景会按应有的方式填充窗口,但眼睛/相机的视角会丢失。
真的,我想要的是通过眼睛/相机的适当 x 和 y 值来平移 2D 像素,投影平面,以便将对象的中心(其 xy 中心为(0,0))保持在渲染图像的中心。我以教科书“交互式计算机图形学:基于着色器的 OpenGL(第 6 版)的自顶向下方法”中的示例为指导。使用网络上免费提供的与本书配对的文件,我将继续使用行主要方法。
以下图像是在不使用矩阵 C 创建 MV 时拍摄的。当我确实使用 C 创建 MV 时,所有场景看起来都像下面的第一张图片。我不希望在 z 中进行翻译,所以我将其保留为 0。
因为投影平面和我的相机平面是平行的,所以从一个坐标系到另一个坐标系的转换只是简单的平移和inv(T) ~ -T。
这是我在 (0,0,50) 处的眼睛图像:
这是我在 (56,-16,50) 的眼睛图像:
c# - 获取在特定 z 坐标处可见的平面边界
使用 OpenTK,我创建了一个垂直 FOV 为 90° 的窗口 (800x600)。我想制作一个背景图像适合整个屏幕的 2D 游戏。我想要的是可变z坐标处的平面作为RectangleF。
目前我的代码是:
由此计算的矩形总是有点小,这种影响似乎随着z的增加而减小。希望有人会发现我的错误。
c++ - OpenGL的归一化坐标
我试图通过限制查看音量来在我的屏幕上剪辑图像glFrustum
。在 的官方文档中Glfrustum
,提到 是left, right, top, bottom, near, far
剪切的坐标。我认为它们是屏幕坐标并尝试这样做:
以上没有在屏幕上向我显示任何内容。所以,我只是在某处查找并看到一些代码如下(但为什么这些坐标是负数?):
我使用 excat 相同的东西并开始在屏幕上显示图像的某些部分。随后,我尝试摆弄坐标near
并注意到观看量的变化。
以上所有内容都在屏幕上向我提供了相同的图像输出。但是在我观察到使用 glFrustum 的大多数地方,我注意到在某处使用的值[-1,1]
(例如这里)和人们谈论标准化范围内的计算。为什么要根据归一化值计算left, right, bottom, top, near, far
重要的(近和远也包括在归一化值中?)?是否也可以使用屏幕坐标中的值执行相同的操作?