问题标签 [ray-picking]

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 投票
0 回答
251 浏览

3d - LIBGDX 3D:无法准确确定相机光线击中哪个网格三角形

我正在学习使用 LIBGDX 创建一个类似我的世界的世界,由纹理块(立方体)创建。我已经渲染了 3D 世界,并且玩家的运动完美无缺(通过 3D 世界的结果和运动体验感觉符合预期)。

我现在的目标是从第一人称视角检测相机指向块的哪一侧/哪一面。使用Intersector.intersectRayBoundsI 设法确定指向哪个块。我在找到的块周围画了一个边界框以获得视觉效果。

下一步是在视觉上标记块(立方体)的确切侧面/面。我试图通过使用Intersector.intersectRayTrianglesafter 遍历找到的块的网格部分列表并检索网格的索引/顶点来实现这一点。

目前的结果是我能够标记指向立方体的侧面/面,但是,它是不准确的。只有当“指向”特定角落的块时,它才会产生正相交 - 好像我只能测试三角形的一个子集而不是全部。

确定指向哪个块(立方体)的代码示例:

这部分代码产生一个找到的块mBlockPointed

在下一个代码部分中,我尝试确定指向的块的确切侧面/面:

我在这个代码部分背后的想法是:

  • 遍历模型实例的所有节点(目前只涉及一个节点)
  • 迭代模型实例的节点的所有节点部分(每个块侧/面 6 个)
  • 获取节点的网格并根据找到的指向的块变换网格(以获取世界位置、旋转和缩放)。
  • 根据当前网格部分的索引缓冲区中的偏移量获取索引
  • 根据顶点的数量和使用的顶点的大小获取网格的所有顶点
  • 对给定的射线和当前网格部分的索引/顶点执行相交三角形测试

结果是,当我移动(透视)相机时,只有当相机指向街区的一个角落区域时,我才会得到肯定的结果。我想不出这个问题的原因,如果我能够的话,可以让我朝着解决这个问题的方向前进。

编辑 - 使用后ModelInstance.Renderer.worldTransform的工作代码而不是ModelInstance.transform

还用一些内联注释和优化更新了我的代码。

0 投票
1 回答
182 浏览

opengl - 无法用鼠标选择在帧缓冲区中渲染的四边形

努力用鼠标选择一个点/四边形。我相信我要么在错误的空间中使用坐标,要么可能没有考虑帧缓冲区的位置/大小(它是主窗口的子窗口)。

尝试转换为各种不同的坐标空间并反转模型矩阵。目前在世界空间中投影一条射线(希望是正确的)并尝试将其与点的(四边形)位置进行比较。该点在本地空间中指定,但实体在原点(0f,0f,0f)呈现,因此我认为它在世界空间中应该没有什么不同?

要在世界空间中获取鼠标射线:

当悬停在一个点 (11.25, -0.75) 上时,射线坐标为 (0.32847548, 0.05527423)。我尝试标准化该点的位置,但仍然不匹配。

感觉好像我错过了/忽略了某些东西,或者只是错误地操纵了坐标系。任何见解将不胜感激,谢谢。

编辑更多信息:

四边形的顶点是: (-0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, 0.5f, -0.5f)

将矩阵加载到着色器:

在顶点着色器中计算 gl_Position:

gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 0.0, 1.0);

编辑 2:根据 Rabbid 的评论阅读更多材料后修改了我的代码。不确定我是否需要在视口大小中除以 2(我有一个视网膜 MacBook 显示器)。

0 投票
1 回答
263 浏览

javascript - GPU Picking 跨设备不一致

我正在尝试使用我从本文后半部分修改的代码https://threejsfundamentals.org/threejs/lessons/threejs-picking.html使用 Points 实现 GPU 拾取

它在桌面上对我来说一直很好,但我开始测试不同的浏览器和设备,但它并不能始终如一地工作。我制作了一个 Codepen 来说明https://codepen.io/deklanw/pen/OJVVmEd?editors=1111

如果您单击(或点击)节点,它们的 ID 应该会在控制台中弹出。在某些设备上,我只得到 0,就像选择背景一样。

有谁知道为什么?

此外,如果有一种方法可以在这种情况下(通过 ShaderMaterial 具有可变大小点的点网格)使用一种仍然有效的更简单的方法,我很好奇如何

编辑:

我删除了 1x1 渲染目标优化,它似乎已经修复了它。现在我想知道那个优化会导致什么问题..