如何快速发现复杂场景中某个点是否被遮挡?

2024-01-17

我有一个复杂的 3D 场景,需要根据 3D 坐标在其上显示 HTML 元素。 (我只是简单地覆盖了一个div标签放在顶部并使用 CSS 定位。)但是,当 3D 坐标被模型遮挡时(或者以另一种方式表述,当它在相机中不可见时)时,我还需要部分隐藏它(例如,使其透明) 。这些模型可能有数十万张面孔,我需要一种方法来查明它是否被遮挡,并且速度足够快,可以每秒运行多次。

目前,我使用的是Three.js的内置光线追踪器,代码如下:

// pos   = vector with (normalized) x, y coordinates on canvas
// dir   = vector from camera to target point

const raycaster = new THREE.Raycaster();
const d = dir.length(); // distance to point
let intersects = false;
raycaster.setFromCamera(pos, camera);
const intersections = raycaster.intersectObject(modelObject, true);
if (intersections.length > 0 && intersections[0].distance < d)
    intersects = true;

// if ray intersects at a point closer than d, then the target point is obscured
// otherwise it is visible

然而,这是very在这些复杂模型上速度很慢(帧速率从 50 fps 下降到 8 fps)。我一直在寻找更好的方法来做到这一点,但到目前为止,我还没有找到任何在这种情况下效果很好的方法。

是否有更好、更有效的方法来确定场景中某个点是否可见或被模型遮挡?


我不知道有什么真正快速的方法,但你确实有一些选择。我对 Three.js 的了解还不够,无法告诉您如何使用该库,但总的来说,谈论 WebGL...

如果您可以使用WebGL 2.0,则可以使用遮挡查询。这归结为

var query = gl.createQuery();
gl.beginQuery(gl.ANY_SAMPLES_PASSED, query);
// ... draw a small quad at the specified 3d position ...
gl.endQuery(gl.ANY_SAMPLES_PASSED);
// some time later, typically a few frames later (after a fraction of a second)
if (gl.getQueryParameter(query, gl.QUERY_RESULT_AVAILABLE))
{
     gl.getQueryParameter(query, gl.QUERY_RESULT);
}

但请注意,查询结果仅在几帧后可用。

如果 WebGl 2.0 不是一个选项,那么您可能应该将场景绘制到帧缓冲区,在其中附加您自己的纹理来代替普通的 z 缓冲区。有一个扩展可以使用适当的深度纹理(更多详细信息请点击这里 http://blog.tojicode.com/2012/07/using-webgldepthtexture.html),但如果这是不可能的,您总是可以使用输出每个像素深度的片段着色器来绘制场景。

然后,您可以在深度纹理上使用 gl.ReadPixels() 。再次强调,请注意 GPU->CPU 传输的延迟,这总是很重要。

话虽如此,根据您的 DOM 对象的外观,将 DOM 对象渲染为纹理并使用四边形作为 3d 场景的一部分绘制该纹理可能会更容易、更快捷。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何快速发现复杂场景中某个点是否被遮挡? 的相关文章

随机推荐

  • Node.js 安装卡在代码行上

    我的 Node js 安装进度进行到一半 但是在它开始安装所有其他包之后 在命令提示符验证部分之后 它卡在了线上Created a UnelevatedInstallerTelemetryDecorator我应该让它继续运行还是直接杀死它
  • 在 dockerfile 中运行可执行文件

    我是 Docker 新手 正在阅读 Turnbull 的 The Docker Book 本质上 我掌握了容器如何工作以及图像在传输协议和虚拟化操作系统中如何工作的术语和流程 但是 我的 dockerfile 没有运行本地可执行文件 并且我
  • 在 CMake 的构建工具模式下传递参数

    我有一组小的 C 程序要用来编译Nmake 我启动构建过程 cmake G NMake Makefiles cmake build buildDir and Nmake开始编译 问题是构建过程在出现第一个编译错误时停止 我想构建所有可以编译
  • 错误“条件长度 > 1 并且仅使用第一个元素”是什么意思? [复制]

    这个问题在这里已经有答案了 这是我的数据集 FullName lt c Jimmy John Cephus Frank Chester Hank Chester Brody Buck Clyde Merle Rufus Roscoe Jed
  • 根据使用 JavaScript 单击的按钮传递隐藏字段值

    我有一个带有两个按钮的表单 每个按钮都有 onclick this form submit 我的表单中有一个隐藏字段 我希望该字段的值根据单击的按钮而有所不同 最好的方法是什么 另外 在有人说出答案之前 在这种情况下 jQuery 不是一个
  • 使用默认搜索建议适配器时是否有办法限制显示建议的数量?

    如所述使用默认搜索建议适配器时 有没有办法限制显示建议的数量here https developer android com guide topics search adding recent query suggestions html
  • Git 克隆详细输出?

    我必须在 Dockerfile 中克隆几个大型存储库 克隆一个存储库确实需要一个小时 我想查看标准 Git 进度输出以了解发生了什么 但是 当从 Dockerfile 启动 Git 时 我看不到任何 git clone 输出 打印到控制台的
  • 如何阻止 Emacs“污染”剪贴板?

    Emacs 总是将终止 删除的内容复制到剪贴板 我经常需要将内容复制并粘贴到 Emacs 中 但是当我在粘贴之前从 Emacs 中删除现有内容时 我想要粘贴的内容就会丢失 我发现的唯一解决方案是使用 setq save interprogr
  • XML 和 XSLT 保留 CDATA

    我正在开发一个项目 其中包括在 xml 上应用一些 xslt 我的输入 xml 在任何 xml 节点中都包含 CDATA 现在我想要的是如果它有输入 它应该保留 CDATA 我尝试了很多解决方案 例如禁用输出转义和 cdata sectio
  • 在 `Row` 内渲染 ListTile 时出现错误 `Failedassertion: line 1687 pos 12: 'hasSize'`

    我在颤动中有以下代码 Widget build BuildContext context return Center child Card child Column mainAxisSize MainAxisSize min childre
  • 当返回类型不重要时,是否有更优雅的方法来合并可观察量?

    我有一个类似 ReactiveUI 的视图模型 它具有多种不同类型的属性 可以激发NotifyPropertyChanged事件 我想订阅一个在触发任何事件时将被调用的方法 但我对实际值不感兴趣 我当前的代码有点难看 由于不透明true选择
  • 从分叉的上游原点拉取时忽略特定文件

    在 git 中 从上游源 即原始项目 拉取时如何免除某些文件 我正在开发一个项目 该项目最初是从一个非常活跃的存储库中分叉出来的 我已将原始版本添加为名为 upstream 的远程版本 以便可以运行 git pull upstream 并将
  • CouchDB 只写数据库

    我正在尝试设置一个可公开写入且只能由 管理员 角色读取的 CouchDB 数据库 我怎样才能做到这一点 有没有类似的validate doc update访问文档的函数 查看这一页 http wiki apache org couchdb
  • Silverlight Windows Phone 7:手势事件?

    我正在 Expression Blend 中模拟 wp7 应用程序 并寻找设置事件处理程序来响应某些手势 一些 Bing ing 显示一些人建议使用 点击时 或其他东西并检查自己点击之间的时间 但似乎应该有一种更简单的方法 Silverli
  • PHP 生成 RGB

    我面临着这种情况 我有一个来自数据库的 ID 因此它可以是 1 100 1000 并且我需要生成随机颜色 但是相同的 ID 应该会产生相同的颜色 关于如何实现这一目标有什么建议吗 Thanks 使用加密哈希并剪切不需要的字节 functio
  • Laravel Homestead - 在哪里运行 npm(虚拟机与 Windows 10 主机)

    我正在 Windows 10 主机上运行 Laravel Homestead Vagrant 盒子 目前 我正在编译资产 运行npm run dev 在虚拟机内 有时它非常慢 而且我通常会遇到符号链接 运行观察程序等问题 简而言之 需要更多
  • 你能用 css 设置 html 表单按钮的样式吗?

    我不喜欢默认的按钮样式 真的很无聊 我在用
  • 如何修复“python 版本始终返回 2.7 而不是 3.7”

    我下载了 Python 3 7 3 但 Python 2 7 10 已经存在 Now python version返回 2 7 10 我怎样才能解决这个问题 如果您在 Linux 上工作 您可以随时输入python3 version检查它是
  • 从 select 标签内 ng-change 中的选项获取 $index

    我发现有很多与此类似的问题 但我找不到任何完全需要我所拥有的问题 ngRepeat 在选项标签内 选择标签内的 ngChange 我需要获取所选选项的索引 这是我的代码
  • 如何快速发现复杂场景中某个点是否被遮挡?

    我有一个复杂的 3D 场景 需要根据 3D 坐标在其上显示 HTML 元素 我只是简单地覆盖了一个div标签放在顶部并使用 CSS 定位 但是 当 3D 坐标被模型遮挡时 或者以另一种方式表述 当它在相机中不可见时 时 我还需要部分隐藏它