THREE.js 对单个 > 500k 多边形(面)对象、与地球的线相交的光线投射非常慢

2024-02-01

在我的项目中,我让一名玩家环游世界。地球不仅仅是一个球体,它还有山脉和山谷,所以我需要改变玩家的 z 位置。为此,我从玩家的位置向单个对象(地球)投射一条光线,并得到它们相交的点并相应地改变玩家的位置。我仅在玩家移动时进行光线投射,而不是在每一帧上进行光线投射。

对于一个复杂的物体来说,它需要很长时间。对于具有约 1m 多边形(面)(1024x512 分段球体)的对象,需要约 200 毫秒。光线投射是否会投射到每一张脸上?

是否有一种传统的快速方法可以在“三”中实现此目的,例如某种加速结构(八叉树?bvh?——说实话,从我的谷歌搜索中我似乎没有找到“三”中包含这样的东西)或其他一些思考-the-box(无光线投射)方法?

        var dir = g_Game.earthPosition.clone();
        var startPoint = g_Game.cubePlayer.position.clone();
        var directionVector = dir.sub(startPoint.multiplyScalar(10));
        g_Game.raycaster.set(startPoint, directionVector.clone().normalize());
        var t1 = new Date().getTime();
        var rayIntersects = g_Game.raycaster.intersectObject(g_Game.earth, true);
        if (rayIntersects[0]) {
            var dist = rayIntersects[0].point.distanceTo(g_Game.earthPosition);
            dist = Math.round(dist * 100 + Number.EPSILON) / 100;
            g_Player.DistanceFromCenter = dist + 5;
        }
        var t2 = new Date().getTime();
        console.log(t2-t1);

先感谢您


不要使用 Three.js Raycaster。

考虑Ray.js https://github.com/mrdoob/three.js/blob/dev/src/math/Ray.js提供function intersectTriangle(a, b, c, backfaceCulling, target)

建议的优化:

  1. 如果玩家从一些已知位置开始⇒你必须知道他的初始高度,-不需要光线投射(或者只做一次全网格慢速相交)

  2. 如果玩家小步移动 ⇒ 下一个光线投射将最有可能的与之前相同的面相交。

优化 #1- 记住之前的脸,并首先对其进行光线投射。

  1. 如果玩家不跳⇒下一个光线投射将最有可能的将相邻面与玩家之前所在的面相交。

优化#2− 建立一个缓存,以便给定一个面 idx,您可以在 O(1) 时间内检索相邻面。

如果您的星球不是实时生成的,则可以从文件加载此缓存。


因此,按照我的方法,每次移动时,您都会从缓存和光线投射 1-6 个面中执行 O(1) 读取操作。

Win!

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

THREE.js 对单个 > 500k 多边形(面)对象、与地球的线相交的光线投射非常慢 的相关文章

随机推荐

  • Google Colaboratory:有关其 GPU 的误导性信息(仅 5% RAM 可供某些用户使用)

    更新 这个问题与Google Colab的 笔记本设置 硬件加速器 GPU 有关 这个问题是在添加 TPU 选项之前写的 阅读了有关 Google Colaboratory 提供免费 Tesla K80 GPU 的多个令人兴奋的公告 我尝试
  • html 标签内的正则表达式

    我想从以下 HTML 片段中解析高清价格 我只有 html 代码的片段 所以我不能为此使用 HTML 解析器 div span View In iTunes span span class price 19 99 span ul class
  • 有没有办法在 Typescript 文件中使用 svelte getContext 等 svelte 函数?

    我正在使用 getContext 与苗条简单模态 https www npmjs com package svelte simple modal对于我的项目中的模态 有没有办法在 Typescript 文件中使用 getContext 等
  • 有关编写 Debian/Ubuntu deb 软件包的资源? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在开始为 Ubuntu 服务器上的软件包准备安装脚本 我想编写一个脚本作为 deb 包 它知道必须
  • Node.js:在继续之前在循环中等待回调

    我有一个循环 里面有一个异步调用和一个回调 为了能够继续 我需要回调在整个循环中一直触发 然后显示循环的结果 我尝试过的各种控制方法都行不通 已经尝试过 Step Tame js async js 等 关于如何继续前进有什么建议吗 arra
  • 计算经过三个数组的最短路径

    我有三个数组 也可能是n个 现在让我们举三个 他们有这样的价值观 Array1 143 181 Array2 41 153 241 Array3 22 67 131 190 我想找到这三个数组中的那些元素 谁的差异最小 在本例中 143 1
  • 我在 sdk 管理器中找不到“Android SDK 文档”

    我有一个问题 它是关于找到 Android SDK 的文档 我在谷歌和这个网站中搜索 我找到了关于这个问题的解决方案topic https stackoverflow com questions 15748558 android devel
  • Java - 如何获取 JSON 数组中的对象值?

    我有一个类似于下面示例的 JSON 我正在尝试获取一些值 例如值 results shipper id results updated false notification false some data id 15989 pieces 0
  • 通过管道 $_POST 到外部命令

    我有一个程序可以读取 JSON 请求stdin 我想用 PHP 调用它 这就是我现在所拥有的 这可行 但是有没有更直接的方法将 PHP 中的字符串放入stdin 类似的东西pipe json encode POST JSON NUMERIC
  • jquery html() 去掉脚本标签

    我需要用 ajax 调用生成的 html 替换页面中 div 的内容 问题是 html 中有一些必要的脚本 并且 jquery html 函数似乎将它们删除了 我需要过滤响应并只获取特定的 div 我正在考虑一种解决方法 即从 ajax 响
  • 返回 JSON 无法正常工作

    我正在尝试从数据库返回数据并将其转换为 json 并将其发送回我的 javascript 然而它并没有按计划工作 它在 JavaScript 上作为数组返回 JavaScript function getData id ajax url s
  • 如何获得两列之间的差异

    我有一个查询生成如下内容 StartTimestamp EndTimestamp 100 450 150 500 我希望结果还包括 EndTimestamp 和 StartTimestamp 之间的差异 StartTimestamp End
  • 如何使用 Windows Installer XML 注册 COM 对象

    我遇到以下问题 在我的 WiX 设置中 我需要注册一个 COM 对象 我有一个 tlb 文件和一个 dll 文件 在我的示例中 XYCommon dll 和 XYCommon tlb 现在我想要进行设置以注册 TLB 如何在 Windows
  • 隐藏自动生成的 CTest 目标

    我在 CLion 中使用 CMake 和 CTest 令人烦恼的是 CTest 生成了大量我不关心的目标 连续的 持续构建 连续配置 持续覆盖 连续内存检查 连续启动 连续提交 连续测试 持续更新 实验性的 实验构建 实验配置 实验覆盖范围
  • 如何使用 VSCode 调试器来调试 Gunicorn 工作进程?

    我有一个在 Ubuntu 14 04 上用 Python 3 4 编写的 GUnicorn Falcon Web 服务 我想使用 VSCode 调试器来调试此服务 我目前使用命令启动该进程 usr local bin gunicorn co
  • 水平滑动手势和垂直页面滚动

    我正在构建一个移动网站 并且有一个图像幻灯片放映 允许水平滑动图像 我使用的 javascript 库是 bxslider 然而 如果用户触摸幻灯片并想要向上 向下滚动页面 则幻灯片会阻止垂直滚动 因此必须触摸网站的另一部分 有人可以告诉我
  • 错误:未知命令:木桶 ||尽管使用了多实例试验

    我已经无能为力了 我不断收到错误消息Error Unknown command cask尽管我之前已经通过此链接使用了很多不同的安装 自制木桶选项无法识别 https stackoverflow com questions 30413621
  • 如何在sass中使用循环生成多个mixin(mixin lib)

    我想保持我的 sass 代码简短 代替 mixin tg font size line height something related to font size and line height mixin h1 include tg mi
  • 在运行时创建类时,使用 exec 相对于 type() 有什么优势?

    我想在 python 中在运行时动态创建类 例如 我想复制下面的代码 gt gt gt class RefObj object def init self ParentClassName print Created RefObj with
  • THREE.js 对单个 > 500k 多边形(面)对象、与地球的线相交的光线投射非常慢

    在我的项目中 我让一名玩家环游世界 地球不仅仅是一个球体 它还有山脉和山谷 所以我需要改变玩家的 z 位置 为此 我从玩家的位置向单个对象 地球 投射一条光线 并得到它们相交的点并相应地改变玩家的位置 我仅在玩家移动时进行光线投射 而不是在