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

webgl - 在 Three.js Picking Ray 中,对象如何仅移动 X、Z?不是Y

现在对象向各个方向移动。但我想对象只移动 X 或 Z,而不是 Y。

我试试这个。但结果并不好。

在鼠标移动

我怎么解决这个问题?

0 投票
1 回答
1125 浏览

opengl - 如何在 OpenGL 中高效地实现“point-on-heightmap”拾取?

我想在世界地表上跟踪我的 OpenGL 场景中的鼠标坐标,它被建模为高度图。目前没有像硬件镶嵌这样的花哨的东西。请注意,此问题与对象拾取无关。

目前我正在做以下事情,这显然是由于回读操作而降低了性能:

  • 渲染世界(地表)
  • 读回鼠标坐标处的深度值
  • 渲染场景的其余部分
  • 交换缓冲区并渲染下一帧

回读是在两个渲染步骤之间,因为我想要地表的深度值,前面没有任何物体。使用以下命令完成:

我的应用程序将帧速率限制为每秒 60 帧。在没有回读操作的情况下渲染场景时,我的 CPU 使用率不到 5%,但是在进行回读时,它增加到大约 75%,尽管我没有做太多渲染场景或更新任何游戏模型或诸如此类的事情。

一个临时的解决方案是缓存鼠标下像素的深度值,并且仅每 5 帧或 10 帧更新一次,这会导致 CPU 使用率回落到 10% 以下。但显然不能成为问题的最佳解决方案。

如何有效地实现拾取(不是对象拾取,因为我想要表面上的(浮点)坐标)?

我已经考虑过读回前缓冲区的深度值而不是后缓冲区,但是当谷歌搜索如何这样做时,我只发现人们抱怨最好避免使用 glRead* 方法。但是我怎么能在不读东西(使用 glRead*)的情况下读东西(做挑选)?

我很困惑。其他人如何实现拣货?


一种完全不同的方法是在软件中实现世界表面拾取。从相机“进入深度”重建 3D 射线应该没什么大不了的,它表示在目标像素处渲染的空间点。然后我可以实现一个相交算法来找到表面上最前面的点。

0 投票
1 回答
1228 浏览

c++ - Picking Ray 不准确

我正在尝试通过本网站的说明来实现拾取射线。

现在我基本上只希望能够点击地面,命令我的小人向这个点走。由于我的地平面是平的、不旋转的和不平移的,所以当 y 达到 0 时,我必须找到我的拾取射线的 x 和 z 坐标。

到目前为止一切顺利,这就是我想出的:

在这一点上,我希望pos成为我的拾取射线击中我的地平面的点。然而,当我尝试它时,我得到了这样 错误 的结果:(鼠标光标没有被记录下来)因为地面没有纹理,所以很难看到,但是相机是倾斜的,就像在大多数 RTS 游戏中一样。根据我的计算,我可怜地尝试在 Blender 中模拟一个看起来很远的人,这标志着交叉点发生。

所以看起来和之间的view转换dir某处之间的转换搞砸了,我的光线最终指向了错误的方向。计算位置和实际位置之间的差距会随着鼠标远离屏幕中心的距离而增加。

我发现:

  • 高度和长度不是准确的。由于 Windows 为边框切掉了几个像素,因此使用 1006,728 作为窗口分辨率会更准确。我想这可能会造成小的差异。
  • 如果我将 fovy 从 45 增加到大约 78,我会得到相当准确的光线。所以也许我用作fovy的东西有问题。我明确地调用glm::perspective(45.f, 1.38f, 0.1f, 500.f)(分别为fovy、纵横比、fNear、fFar)。

所以这就是我迷路的地方。为了获得准确的光线,我必须做什么?

PS:我知道有一些函数和库已经实现了这个,但为了学习目的,我尽量远离这些东西。

0 投票
2 回答
3903 浏览

android - OpenGL ES 2.0 中的光线拾取

我正在尝试在 OpenGL ES 2.0 中实现光线拾取,以确定是否单击了对象。到目前为止,我只是想检查是否按下了特定的三角形。我使用这个网站作为动机http://android-raypick.blogspot.ca/2012/04/first-i-want-to-state-this-is-my-first.html

这是我到目前为止所拥有的:

和浮动是手指按下屏幕位置的 x 和 y 坐标xy该函数onClick是从MainActivity.

mMVPMatrix是模型视图矩阵。mProjectionMatrix是投影矩阵,viewport其值为 {0,0,screenhwidth,screenheight}。

我得到的输出示例是(在屏幕中间触摸):

我的问题/主题是我不知道我是否在正确的轨道上?我是否得到了正确的想法,或者我似乎误解了什么?或者还有其他方法可以实现对三角形的触摸检测吗?

感谢您的任何帮助或指导!

0 投票
1 回答
318 浏览

opengl - 光线采摘混乱

我正在使用光线拾取来找到角色的边界。这不是最佳的,但这是我能做的最好的,而且必须做的;我需要(接近)像素完美的碰撞,而且我有很多很多的物体。

但是,我没有让光线拾取正常工作。它发生了碰撞,但不是在正确的地方。我尝试调整射线的大小,但无济于事。

请原谅我的乱码,我只是把它放在一起。

0 投票
1 回答
394 浏览

c++ - 如何从 gluUnProject 重新定向近平面和远平面以考虑相机位置和角度?

我试图从屏幕上的鼠标单击将光线追踪到 3D 空间。据我了解,默认位置和方向如下所示:

胶未投影

从此代码:

我的问题是如何更改近平面和远平面的位置和角度,以使所有鼠标点击看起来都来自相机在 3D 空间中的位置和角度?

具体来说,我正在寻找一种方法将投影平面的中心定位在 Z 轴下方 65° 沿线 (0,0,1) -> (0,0,-tan(65°)) [-tan (65°) ~= -2.145],近平面和远平面都垂直于通过这些点的视线。

0 投票
1 回答
683 浏览

ios - 尝试在 iOS 的 OpenGL ES 2.0 中使用光线投射实现拾取时我哪里出错了?

我正在尝试为 iPad 应用程序在 OpenGL ES 2.0 中使用光线投射实现拾取。具体来说,我想知道用户点击了由高度不同的方形单元组成的类似我的世界地图的哪个单元。但是,我的代码没有找到与任何单元格的交集。

在我的手势识别器方法中,我首先获取点和视口尺寸

然后我翻转 x 轴,因为我的应用程序处于横向模式,并且 openGL 坐标从与窗口坐标不同的角开始

并使用 GLKitMathUnproject 对 z = 0 和 z = 1 值执行反投影,然后将结果向量传递给函数,该函数将返回用户点击的单元格的坐标作为结构 BPPoint(只有两个整数,x 和 y)。该地图目前没有任何变换,所以我假设我应该使用单位矩阵进行变换,并且投影矩阵是使用 glkmatrix4makeperspective 制作的。

这是该方法的主体。我基本上只是循环并重新生成地图每个正方形顶部的几何图形(效率低,我知道),方法与我用来将几何图形传递到 VBO 以首先绘制它的方法相同。

以及用于测试相交三角形的代码,我从这里转换为 objc ( http://www.cs.virginia.edu/~gfx/Courses/2003/ImageSynthesis/papers/Acceleration/Fast%20MinimumStorage%20RayTriangle%20Intersection .pdf)如下:

当我使用 10x10 地图运行它时,它通常会为坐标打印 10,10 而不会找到交叉点。我在哪里搞砸了概念或实施这个或两者兼而有之?

0 投票
0 回答
1632 浏览

three.js - Three.js中球体上的纬度经度

我有一个可以向任何方向旋转的threeJS 地球仪。目前,无论旋转如何,我都可以读取位于地球中心的正确经度和纬度。地球仪的方向使得 raycaster.ray.origin.x 和 raycaster.ray.origin.y 在本初子午线和赤道交叉处读取 0,0。raycaster.ray.origin.z 读取 500。

然而,我试图到达的地方是根据鼠标在地球上单击的位置确定纬度和经度。我试图根据 raycaster.ray.direction.x、y、z 计算它,但无论我是否在对象上,我都会得到读数。

如果我从原点 0,0 读取方向,我的 raycaster.ray.direction.x 和 y 都将读取 0,z 将读取 -100(我将它们乘以 100 以使用更好的数字)。在圆周上,X 将在地球的顶部和底部读取 0,从左到右读取 -40 到 40。Y 将从上到下读取 40 到 - 40,从左到右读取 0,Z 方向将在整个圆周上为 -90。然而,数字将继续增加/减少,直到屏幕边缘。

当地球朝向北极/南极时也是如此,但是,中心的 y 在圆周上是 -100/100 和 -90/90,x 将是 - 100/100 绕地球四分之一和 -90/90 围绕圆周。

是否有一种方法可以获取我单击的位置的值,它只是在对象上而不是整个屏幕上?我无法理解如何将方向与原点相关联。我觉得我到了某个地方,但然后就离开了困惑。这是我得到的一切。任何帮助将不胜感激。

0 投票
1 回答
757 浏览

android - Android Open GL 对象选择

在 open GL 中有一个术语叫做拣货。用于确定屏幕上的哪个对象被选中。有人可以向我解释在对象的每个实例中使用拾取和放置基于触摸的侦听器之间的区别。一个多维数据集类。

假设;我想要做的是在屏幕上随机展示多个立方体。我想如果我给 Cube 类一个监听器,在触摸立方体时,监听器应该为每个按下的立方体相应地触发。

这是我要添加监听器的代码。这是可能的还是需要挑选?

0 投票
2 回答
14518 浏览

opengl - 鼠标未锁定时 3D 光线拾取使用鼠标坐标

所以基本上我已经使用 OpenGL 制作了一个可以执行 3D Ray Picking 的程序。如果Camera View Direction Ray接触/相交任何东西(不是空气),那么会在相交点处呈现一个紫色的小框。

如果射线与任何“红框”相交,则与射线相交的那一次将变为绿色。地面和墙壁根本不会改变颜色或纹理。

例子:

我目前进行 3D 光线拾取的方式是获取相机的视角方向光线,然后只计算交叉点。我的计算交叉点的函数不作为布尔值返回,而是作为 3D 矢量(交叉点本身的坐标)返回

问题

所以我想要实现的是计算Picking Ray ,但在鼠标锁定到屏幕时根据鼠标。

示例- 所以在这里你可以看到紫色框在十字准线处,但如果我解锁鼠标并移动它(在屏幕顶部,像往常一样)并将它移动到绿色 X 标记的中心,我'画好了,然后我想计算从相机中心到屏幕顶部鼠标坐标的射线。

当前的测试和想法

这应该只是一个数学问题。这只是我目前用来计算光线(并尝试计算第二条光线)的简短列表

  • 相机 X、Y、Z
  • 相机俯仰偏航滚动(目前未使用滚动)
  • 相机近远(距离)
  • 相机视野
  • 相机方面
  • 鼠标 X、Y(在屏幕顶部)
  • 画面宽度、高度

鼠标 X 和 Y 原点 (0x0) 位于窗口/框架的左下角。

计算主Picking Ray本身

这就是我计算主拾取射线本身(锁定鼠标的拾取射线)的方式。我自己制作了这些类,尽管它们应该有意义(Vector3D,Ray3D等),并且这些normalize()方法完全按照它所说的那样来规范化向量。

主意

因此,当我尝试使用鼠标坐标进行计算时,我在调用之前插入了以下代码direction.normalize();,因此在创建Vector3D direction.

当鼠标没有被锁定/抓取时,这给了我一个奇怪的结果。这是有道理的,因为我只是在胡闹并尝试一些我首先想到的事情。

我猜我需要根据俯仰、偏航和滚动来翻译鼠标坐标。虽然我没有任何想法,我将如何去做。

所以我希望有人可以帮助我实现这一目标和/或给我一些资源,这样我就可以理解如何做我想做的事情。

额外的

如果您需要有关此的更多信息,请写评论,我会尽力而为。

答案 - 感谢fen

我现在最终使用了fen的方式,因为它比计算所有内容要简单得多!