问题标签 [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 投票
2 回答
532 浏览

opengl - 如何从 2D 屏幕鼠标单击 OpenGL 中的大型对象获得准确的 3D 深度?

我正在通过 2D 屏幕鼠标单击计算 3D 坐标。然后我在计算的 3D 坐标处绘制点。代码没有错,方法没有错,一切正常。但是有一个问题与深度有关。

如果对象大小在 (1000, 1000, 1000) 左右,我会得到完整的深度,即对象面元的精确 3D 坐标。但是当我加载大小为(20000、20000、20000)的对象时,我没有得到准确的(深度)3D 坐标。我从表面得到一些偏移。该点与表面有一些偏移。所以我的第一个问题是为什么会这样?第二个问题是如何获得超大型物体的完整深度和准确的 3D 坐标?

我画了一个 3D 点

并使用

0 投票
1 回答
619 浏览

android - 使用 min3d android 通过触摸获取 3d 对象名称

我需要添加我的 android 项目的功能,以获取 3d 对象的每个名称。对象是不规则的,可以根据用户的手势进行旋转。我有很多关于 openGL 光线拾取的阅读,但仍然无法弄清楚如何使其工作。我正在使用 3d min 加载 .obj 文件。感谢提前。

0 投票
1 回答
655 浏览

java - Open GL 2D Android中用户触摸对象的光线拾取

我一直在尝试让我的游戏能够处理 OpenGL 中的用户交互。我有一个圆圈,我希望能够检测到用户的按压。我知道我需要使用Ray Picking,我已经按照这本书OpenGl 2 for Android并按照教程在 3D 空间中创建空气曲棍球游戏并检测用户点击事件。

现在我希望利用我的知识从 2D 游戏开始,但是遵循教程并应用我目前的知识并不能帮助我实现能够检测到用户点击我的对象。

我假设我做错了什么,为 3D 和 2D 做这件事略有不同。

我有一个几何类如下:

我有一个表面视图 onTouchEvent 覆盖如下:

最后我有一个渲染器如下:

据我目前的知识和那本书中的教程,我链接这应该是正确的。

0 投票
4 回答
1033 浏览

algorithm - 射线和三角形边缘如何相交?

我正面临与三角形边缘相交的问题。实际上,我正在尝试使用鼠标选择/相交网格的三角形、顶点、边缘。所以我从鼠标当前位置制作了射线,然后我将它与三角形/多边形、顶点、边缘等网格元素相交以使用它。基本上,3D建模的东西。与三角形相交既简单又有趣。顶点部分很棘手。

但是现在,我不知道如何与三角形边缘相交/拾取。我的意思是当与鼠标射线相交时我如何对待它们?首先,我认为可以将它们视为 3D 线。但最终未能做到 Ray 和 Line 相交。在互联网上搜索但没有找到任何有用的信息。虽然我发现一些开源项目正在使用 OpenGL 内置的拾取功能来拾取/与 Edge 相交。但就我而言,我不能使用它。:(

我当前的边缘拾取代码结构如下所示:

所以我被困在这里,真的需要一些帮助。非常感谢任何想法、算法或小帮助。

0 投票
1 回答
433 浏览

c# - 旋转模型后,SharpDX 中的命中测试不起作用

在我想用来演示我的问题的示例中,我有一个涡轮机模型和一个小电网,如下图所示。模型的边界框显示为红色框。我尝试检查绿色网格中的哪些节点位于涡轮机边界框上方。如果一个节点位于边界框之上,我将它向下移动一点,这样我就可以清楚地看到哪些节点在边界框之上,哪些不在边界框之上。

正如您在第一张图片中看到的那样,它非常适合我的非旋转模型。但是,如果我将模型旋转 -90°,所有命中测试都会失败。我不明白为什么会这样!在为“挑选”进行命中测试时,我遇到了同样的问题。

在此处输入图像描述

在此处输入图像描述

这是我用来检查节点是否在任何边界框上方的小函数。对于这个任务,我为每个节点创建了一条指向底部的射线。然后,我检查这条射线与我所有模型的所有位置的交点。(如果我有多个涡轮机,我只会有涡轮机模型,但它有多个位置。这使得在 GPU 上渲染速度更快。)

如前所述,每个模型可以在场景中出现多次,因此我只存储每个模型一次并计算其每个位置的变换。因此,模型的每个位置都有一个边界框。

我用于命中测试的“GeometricBoundingBox”是SharpDX.BoundingBox类型。当我向我的模型添加一个新位置时,我通过检查模型的所有顶点的最小值和最大值来创建一个新的边界框。

当第一次创建边界框或父位置的世界矩阵发生变化时,我计算我的“GeometricBoundingBox”如下:

用于将模型转换为位置的世界矩阵也用于计算边界框,如上所示。我这样计算:

在两个模型中,边界框都非常适合我的涡轮机模型。虽然模型在 GPU 上针对每个位置进行转换,但边界框由上面显示的代码进行转换。由于模型和边界拟合,我相信计算它们是有效的。

但我不明白为什么我的命中测试适用于非旋转对象,但我不适用于旋转对象。

你有什么想法?

0 投票
1 回答
183 浏览

c++ - 如何获取我在世界坐标中单击屏幕的位置的光线方向(DX11,C++)

我正在尝试转换我在屏幕上单击的点以获取我单击的位置的光线方向。最终,这将用于某种交集。我现在的方向似乎产生了奇怪的结果,我不知道为什么。

这在某个角度似乎可以正常工作,但是一旦达到某个点,它就会停止旋转并产生“意外”的结果。也许问题在于 Z 值,因为这是我无法面对的方向?

在视频示例中,我让相机查看方向(仅围绕世界 Y 轴旋转),并且方向基于鼠标移动。如您所见,它似乎在一个区域上运行良好,但一旦达到某一点,它将开始向后移动并停止跟随鼠标。

https://i.gyazo.com/c0e1cd6bc5c36a7a488ba81928061104.mp4

有谁知道是什么原因造成的?

编辑:已解决,问题是我使用 acos 旋转相机,它给了我 0-180 度的自由度,而不是 atan 0-360

0 投票
1 回答
175 浏览

opengl - 相机移动时无法在我的 3D 场景中进行光线拾取

我有自己的围绕 OpenGL (C++) 的 3D 引擎实现,并且在过去几年中它在所有方面都运行良好。

但是今天我偶然发现了一个问题。我有这个带有球体的场景(围绕太阳的行星,轨道环和类似的东西,非常非常简单),我想用鼠标来选择它们。

只要相机/视图矩阵是恒等的,挑选就可以了。当相机旋转然后移动时,拾取完全失控。我一直在寻找解决方案一段时间,所以现在我问你们。

这是代码(为此问题总结):

因此,当我为 mCamera 使用身份时,一切正常,即使我只为 mCamera 使用旋转,它也可以正常工作。当我开始使用翻译时,它完全出错了。有人知道我哪里出错了吗?

0 投票
1 回答
74 浏览

android - android中的光线拾取 - 如何管理不同的形状

我很困惑。我已经阅读了很多与光线拾取相关的不同教程。但每次这些例子都是基于一些简单的形状,正方形或三角形。在每个形状的每个示例中,都有一个检查这个特定形状的函数。没有它应该如何管理?我有不同且不自然的形状,如何管理?

0 投票
1 回答
109 浏览

android - 使用纸板(GVR)的opengl光线拾取/跟踪

为了演示,我做了一个小应用程序,它绘制了三个随机大小和随机位置的正方形。绘制正方形:

我还使用正交投影在屏幕中央显示光标(白色小方块):

为了在立体模式的可见区域中心清晰,我画了红点。查看光标如何偏离屏幕中心。

它在立体声模式下的外观。如何查看从屏幕中心移动的白色光标: 它在立体声模式下的显示方式

如果我禁用了立体声模式,那么一切正常。我使用一种方法来确定屏幕中心的哪个对象正在为 screenWidth/2 和 screenHeight/2 坐标生成光线跟踪:

但是如果我打开立体声模式,光标不会显示在屏幕中央。而对于左眼是从左眼可见区域的中心向左移动,对于右眼是适当的向右移动。在这种情况下,我不明白如何获取光标的真实屏幕坐标以便它可以产生光线追踪?我会很高兴收到任何提示;)

您可以从 github 获得完整的工作示例: https ://github.com/Anton111111/AndroidGVRRayPickingSample

并将所有内容放在一个文件中以便于阅读: https ://github.com/Anton111111/AndroidGVRRayPickingSample/blob/master/app/src/main/java/com/anton111111/ray_picking/MainActivity.java

Ps 请,如果您想为我的问题设置减号,请添加评论以解释我的问题有什么问题。

0 投票
2 回答
2082 浏览

opengl - 具有高多边形网格的 OpenGL 3D 光线拾取

如何使用包含高多边形网格的模型在 3d 场景中实现 3d 光线拾取?

迭代所有三角形以执行三角形线相交测试需要太多时间。我知道存在诸如八叉树等方法,并且应该可以将这些方法用于场景中的模型,但我不知道应该如何在网格级别使用这些概念。但是,如果您在网格级别使用八叉树,应该如何解决超出八叉树体积边界的多边形问题?

对于实时 OpenGl 应用程序的高多边形模型的 3d 射线交叉点,您有什么建议吗?