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

0 投票
1 回答
331 浏览

sfml - 截锥体剔除在调试中降低了帧率,但在发布时提高了它

我正在用 SFML 制作一个基于瓦片的游戏,并决定实现一个简单的边界框平截头体剔除,只绘制相机视口中的瓦片。结果是成功的,因为它使我的帧率增加了两倍!但是,有一个缓存。在调试中运行游戏时,帧速率反而会因实施的截锥体剔除而降低。它在调试时从 90 fps 变为 30 fps,而在发布时它从 100 fps 变为大约 350 fps。

剔除只是检查每个图块矩形,它是否与视口的矩形相交。如果是,则绘制。游戏为分屏渲染了几个视图,代码如下所示:

……

……

当我删除矩形的相交调用时,帧速率恢复到 90 fps。我很困惑为什么会这样。

0 投票
1 回答
366 浏览

javascript - 计算螺旋半径,使螺旋中的模型位于截锥体内

我正在构建一个应用程序,在其中我呈现一些带有纹理的平面。但是,我想根据平截头体宽度和相机位置动态计算螺旋的半径(我在计算中使用它来创建螺旋)。

螺旋线位于屏幕中心 x=0, y=0, z=0。

我希望这考虑到屏幕方向(横向/纵向)。到目前为止,这是我拥有的代码,但似乎我遗漏了一些东西,因为左侧和右侧的平面不在视口内。

我做错了什么,为什么屏幕边缘的飞机不在里面?

这里也供参考的是代码getAbsPointsDistance3D

更新

我尝试减小 dist 参数,但结果并不一致...

0 投票
1 回答
35 浏览

opengl - 在原点具有角度“theta”的视锥体的 8 个坐标的值是多少?

剪裁平面附近的距离为“n”个单位。远剪裁平面距离原点有 'f' 个单位。z 轴指向屏幕右侧,y 轴指向上方,x 轴指向屏幕外部。假设纵横比为 1。

0 投票
1 回答
2510 浏览

javascript - 从 obj 文件加载 3d 对象并使用 Three.Js 将其放入相机中

我正在尝试使用 THREE.OBJLoader 加载(动态)对象文件并将它们放置在场景(或画布)的中心,以便整个对象可以在相机中可见。对象是动态的,所以我没有固定的高度或宽度数据。

我得到了什么: 在此处输入图像描述

我想要的是: 在此处输入图像描述

我所指的是达到这一点:

  1. Three.js 缩放以适应对象的宽度(忽略高度)
  2. 如何使相机适合对象

  3. 在three.js中导入模型后的智能居中和缩放

  4. 为可见的 Three.js 形状调整相机

  5. 计算对象所需的相机变焦以适应屏幕高度

  6. 移动相机以适应 3D 场景

  7. Three.js 计算填满屏幕所需的物距

  8. 如何计算相机的 z 距离以在 3D 空间中以 100% 的原始比例查看图像

代码:

我使用的死池对象来自这里:http ://tf3dm.com/3d-model/deadpool-42722.html 。我不知道我是否一直在阅读正确的问题。如果有人能指出我正确的方向,我会很高兴。提前致谢。

PS:我不擅长 3D 数学。

编辑:我已经尝试过给出的解决方案:How to Fit Camera to Object,但它并没有解决我的问题。事实上,它把我的对象颠倒过来了。我正在尝试将对象定位到相机的中心。


编辑2:我已经部分解决了这个问题。现在对象在相机平截头体内并且完全可见。现在我需要找到一种方法来使其居中。我更改了下面的整个代码scene.add(object);

0 投票
1 回答
2022 浏览

graphics - 球体/平截头体重叠测试的选择

我正在尝试理解一些可能比我现在想的要容易得多的东西,所以希望有人能够帮助我理解我在下面描述的内容。

我知道如果球体完全位于 3D 中的六个平截头体平面中的至少一个之后(左、右、下、上、近远),则球体在视锥体之外。下例中以 c2 为中心的圆也是如此,它完全在左平面之外。重叠测试的简单方法是将球体的中心坐标插入平面方程,得到中心到平面的距离,然后将其与球体的半径进行比较。

但是,在中心为 c1 的球体上使用这种方法会给我们一个误报,因为测试会告诉我们球体在右侧和远平面内(如果从上方看)。然后,解决方案是通过确定球体中心到最接近它的视锥角的距离来使用更精确的重叠测试。如果该距离大于半径,则球体在截锥体之外等。

球体和视锥体

我不明白的是,如果我们使用第二种方法,在一个像中心 c3 的球体上看角而不是平面,会发生什么。测试是否会告诉我们距球体中心的距离减去半径大于 0 并因此超出观察体积?

因此,如果给定一组正交视图体积规则,即 0 ≤ x ≤ 20、-5 ≤ 15、-5 ≤ z ≤ 18 和 x,y,z 坐标 + 球体半径,并告诉确定球体是在里面还是外面。我如何选择使用什么方法才能真正获得正确的答案?

0 投票
0 回答
461 浏览

opengl - 如何从正交矩阵中提取截锥平面?

在这个主页的帮助下,我从透视矩阵中提取了截锥平面。

我可以对正交矩阵使用相同的方程吗?

************************更新************************

我正在使用具有 4 个级联的级联阴影映射 (CSM),因此需要从灯光的角度剔除不同级联中的对象。使用这种方法计算 6 个平截头体平面会非常昂贵:

在每个级联之前:

  1. 从 finalMatrix = lightOrthoMatrix * lightViewMatrix 计算逆矩阵。
  2. 使用逆最终矩阵并将其与 8 个平截头体 NDC 角相乘,以获得世界空间中的最终平截头体角。
  3. 使用这些角最终计算出 6 个平截头体平面。

我今天发现,您可以使用相同的“廉价”方法通过从最终矩阵中提取 6 个平截头体平面来计算它们。看到这个主页。我们使用透视投影还是正交投影都没有关系。

0 投票
1 回答
515 浏览

java - 如何实现截锥体剔除?(渲染许多块时的延迟)

我正在创建一个游戏,当我渲染许多块时。fps严重下降,一切都滞后。我知道它为什么会滞后,因为同时渲染了许多对象,但我不知道如何为我的游戏创建和实现截锥体剔除或任何类型的剔除类。

注意:我正在使用 VBO。

我只是在网上找不到;请帮忙。

这是我的一些代码:

平面类:我渲染块的地方

如果您想了解更多信息,例如课程或整个项目,请发表评论并通知我。

0 投票
1 回答
403 浏览

opengl - 如何设置OpenGL透视校正?

我正在处理一个实验设置,其中向基因修饰的苍蝇显示一张简单的图片。画面被投射到与那只苍蝇有一定距离的屏幕上。

现在轮到我设置透视校正,以便显示的图像(例如水平条)在距离苍蝇视点较远的地方显得更宽(实验设置)。代码现在如下所示:

这些值是几年前有人输入的,我们发现它们不再准确。但是,我很困惑要输入或更改哪些值才能使投影正常工作,因为正如您在实验设置中看到的那样,苍蝇的视野有点倾斜。

我想到了这些价值观:

  • fovy = a 和 c 之间的角度
  • 在投影屏幕上测量宽度和高度
  • 但什么是 zNear?我应该测量从苍蝇到屏幕顶部还是底部的距离?我不明白为什么有人进入 0.1f,因为这对我来说似乎太近了。
  • 我如何知道 zFar 的价值?它是物体到苍蝇的最大距离吗?

我从以下网址获得了有关 glPerspective 的信息:https ://www.ntu.edu.sg/home/ehchua/programming/opengl/CG_BasicsTheory.html 我还检查了设置 3D OpenGL 透视投影的最简单方法,但这篇文章没有不要对待我的实验设置,这是我困惑的根源。

感谢您的任何帮助!

0 投票
3 回答
1681 浏览

java - 如何在基于 2d 瓦片的游戏中实现截锥剔除?(在正交视图中)

我正在制作一个 2d 平铺基础游戏,当我渲染许多平铺时,fps 会急剧下降。我知道为什么会发生这种情况,这是因为同时渲染了许多对象。我需要在正交视图中实现截锥剔除,但我不知道如何实现。

我浏览了许多网站,整天搜索。但我仍然找不到如何在 2d 游戏中实现截锥剔除。

注意:我正在使用 VBO。

0 投票
1 回答
3952 浏览

c++ - 确定点是否在平截头体中

我正在尝试找出确定一个点是否在截锥体内的最佳方法。我有一些工作,但不确定它是否太麻烦,也许有一种更优雅/更有效的方式我应该这样做。

假设我想知道点“x”是否在截锥体内:

平截头体示例

一旦我有了平截头体的 8 个点(4 个近点,4 个远点)的位置,我将根据由三个点组成的三角形计算平截头体每个平面的法线。例如(如上图),对于右侧,我从三个点制作两个向量:

然后我在这两个向量之间进行叉积,确保缠绕顺序对于指向截锥体内的法线是正确的,在这种情况下V x U会给出正确的法线。

一旦我有了每个平面的法线,我就会通过从 x 到平面的一个点绘制一个向量来检查点 x 是在平面的前面还是后面:

然后我在这个向量和法线之间做点积并测试答案是否是肯定的,确认点 x 是否是平截头体平面的正确边:

如果 x 对于所有平面都是正数,则它在截锥体内。

所以这似乎可行,但我只是想知道我是否以愚蠢的方式这样做。直到昨天我才知道“交叉产品”是什么意思,所以这对我来说是全新的,我可能正在做一些相当愚蠢的事情。