问题标签 [mouse-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 回答
1375 浏览

c++ - OpenGL 中的射线球相交

我正在尝试使用射线球交叉点在 OpenGL 中执行鼠标拾取。我在网上找到了一些公式,我尝试的最后一个是 Stack Exchange 上的用户建议的一个:

射线-球体相交

根据我对这个答案的理解,我正在检查二次方程是否有正根。我真的不在乎相交发生在哪里,只要光线与球体相交即可。我的代码如下,但似乎不起作用。

我的 C++ 技能相当生疏,所以如果这是一种可怕的做法,我深表歉意。此方法采用三个浮点数的两个向量、相机的位置以及我的场景 1 单元中相机前面的一个点的坐标(我称之为这个方向)。

当我面对一个对象并按下一个键时,我想获取对象的位置和它的半径,但是只有当我站在场景中的一个对象上,或者我站在靠近另一个大型对象时,我才会得到输出目的。很明显我的计算有问题(或者更糟糕的是,我的代码),但我无法弄清楚那是什么。:(

如果您需要更多代码,或者有任何不清楚的地方,请告诉我。这是我对 SO 的第一个问题,所以如果这个问题措辞不当,我很抱歉。

编辑:我不应该使用鼠标坐标作为我的射线上的一个点。稍微编辑了我的问题。

0 投票
1 回答
239 浏览

c# - 当我从地上捡起一个物体时,我的脚本做了一些意想不到的事情

我目前正在编写一个脚本,该脚本可以拾取一个项目,然后单击鼠标左键将其放下。我还计划在我执行其中一项操作时添加一个项目和一些图标来显示。

我目前对此很陌生,所以我可能会陷入困境。但我想试试。

这是我的代码:

}

到目前为止,它的工作原理.. 我拿起我的对象有些麻烦,它并不总是让我。在它真正抓住对象之前,我必须单击几次。当它发生时,由于一些我不明白的奇怪原因,物体开始向上飞行。我仍然握着它,我仍然可以带着它四处走动,只要我一松手,它就会掉下来。

0 投票
1 回答
121 浏览

opengl - 着色器不为按 id 选择写任何东西

我正在尝试通过 int id 实现拾取,但看起来我的着色器没有写任何东西,尽管我可以正确读取清晰的颜色。

vs,我完全跳过了任何矩阵进行调试:

fs,目前的硬编码值,输出为 0 ( FRAG_COLOR),也尝试了 1 但没有:

初始化阶段,我有一个名为 的 fbo,RESOLVE有 3 个附件,一个深度,一个浮点颜色在 0 上,一个整数在 1 上拾取。Fbo 完成:

并渲染和阅读,也添加了,glFlush但什么也没有:glFinishglPixelStorei

正如我所说,如果我用 10 清除,我会读取 10,所以这是可行的,唯一有问题的是我的着色器..

兄弟们,你能发现错误吗?

编辑:尝试调试,我正在检查颜色 1 的附件类型

我得到:

5890 是GL_TEXTURE,名称看起来正确

尝试使用glFramebufferTexture2D,但我仍然得到GL_TEXTURE类型GL_TEXTURE_2D

编辑 2:尝试读取深度分量,始终为 0

0 投票
1 回答
4664 浏览

3d - View Space 和 NDC 是什么关系?

我想在 DirectX 11 中将拾取射线从屏幕空间坐标转换为视图空间,以进行拾取。

下面是解释这种转换的一部分(来自 Frank D. Luna 的“DirectX 11 3D 游戏编程简介”)。

我不明白红色部分:据我所知,我们将顶点乘以投影矩阵,以将它们从视图空间转换为齐次剪辑空间。然后硬件做透视划分,转化为NDC空间。那么我们如何仅通过将 x 坐标乘以纵横比r来反转这种变换呢?

一般使用 XMVector3Unproject() 来实现这个变换,就是反转视口变换,然后乘以(逆投影 * 逆视图 * 逆世界)矩阵。

有人可以解释(为什么?)这种使用纵横比的“方法”是如何工作的吗?

解释屏幕空间到视图空间转换的摘录

编辑:我在下面添加了引用的 5.6.3.3 部分:

在此处输入图像描述

0 投票
1 回答
89 浏览

android - OpenGL ES 1.0。世界坐标到屏幕坐标

对于 3d-picking,我计划这样做:

- 获取触摸坐标(x,y)

- 从我的模型的顶点缓冲区中选择顶点(xM,yM,zM)。

- 然后用我自己的双手(xM,yM,zM)在屏幕坐标上投影

(xM, yM, zM) ---> (xP, yP, ...)

然后检查匹配(例如 sqrt((x - xP)^2 + (y - yP)^2) < SOME_EPS)

对于投影,我将 Frustum Matrix 保存在mProjectionMatrix中:

并将变换坐标保存在mAccRotation中:

所以测试功能变成了这样:(TESTIFY_VERT 是我模型中的一个)

所以我尝试使用Resulted[0], Resulted[1]作为 (xP, yP)

并尝试使用(Resulted[0] + 1) * ( WIDTH / 2.0f ), (-Resulted[1] + 1) * ( HEIGHT / 2.0f )

这是行不通的。为什么?你能给个建议吗?

PS我见过所有这样的问题,他们没有回答我的问题。

0 投票
2 回答
559 浏览

python - 在 python 2.7 中等待 matplotlib 事件

我在 StackOverflow 上找到了这段代码,并做了一些修改。

我想知道如何停止/等待程序,直到我单击该图。

因为正如我在调用 mpl_connect 时所写的那样,我可以单击该图,但在单击步骤后我立即获得了输出 x1 = 0 而不是正确的值。

如何解决它以获得正确的值?

太感谢了,

卢卡

0 投票
1 回答
1455 浏览

c++ - 在 OpenGL 中使用透视 VS 正交投影时的光线投射(鼠标选择)

我正在努力了解如何使用透视投影和正交投影更改我的算法以处理光线投射(用于 MousePicking)。

目前,我有一个带有 AxisAligned 边界框的 3D 对象的场景。

在使用透视投影(使用 glm::perspective 创建)渲染场景时,我可以成功地使用光线投射和鼠标“挑选”场景中的不同对象。这是一个演示

如果我渲染相同的场景,但使用正交投影,并将相机定位在面朝下的上方(向下看 Y 轴,想象一下游戏的关卡编辑器),我无法从用户点击的位置正确投射屏幕,这样我就可以在使用正交投影进行渲染时让 MousePicking 工作。这是它不起作用的演示

我的高级算法:

在透视模式下,我们将光线投射到场景中,并查看它是否与对象周围的立方体相交。

在正交模式下,我从屏幕投射两条光线(一条在 z=0,另一条在 z=1)并在这两点之间创建一条光线。我将光线起点设置为鼠标指针所在的位置(z=0),并使用刚刚计算的光线方向作为相同 ray_cube_intersection 算法的输入。

我的问题是这个

由于 MousePicking 使用 Perspective 投影,但不使用 Orthographic 投影:

  1. 假设透视/正交投影可以使用相同的 ray_cube 相交算法是否合理?
  2. 我对在正交情况下设置 ray_start 和 ray_dir 变量的想法是否正确?

是正在使用的光线/立方体碰撞算法的来源

编辑:我正在使用的数学空间转换函数:

0 投票
0 回答
211 浏览

javascript - 如何在threejs中执行表面选择

对于我的项目,我必须选择一个区域(一组三角形)并且在鼠标悬停事件中,我必须更改颜色。作为输入,我有一个区域列表和一组三角形 ID。我使用索引缓冲几何。我还设置了一个颜色属性以更改面部颜色。 在此处输入图像描述

红色框是我的目标区域,但是当我更改那些顶点的所有颜色时,它会对另一个邻居产生影响。可能是什么原因?

已编辑

我现在正在使用非索引缓冲几何。我不认为顶点着色有点奇怪,如下图所示。 在此处输入图像描述

我可以使用 geometry.groups 来分离一个表面以使其与一种材料相匹配吗?

解决

结果是由于我的错误,因为我不认为颜色数组是每个顶点的 rgb 值。

0 投票
0 回答
315 浏览

c++ - OpenGL用鼠标移动顶点

我正在使用旧版 OpenGL 并尝试用鼠标移动顶点。为了测试一个顶点是否被点击,我循环遍历所有顶点,并在除以 w 值之前将它们乘以模型和投影矩阵。这工作正常,如下所示:

然后,当我移动鼠标时,我尝试向后工作,首先将当前鼠标坐标乘以与第一步相同的 W 值,然后乘以投影矩阵和模型矩阵的倒数。这会移动顶点,但不会移动到鼠标所在的位置。

我目前只尝试更改 X 坐标。

0 投票
0 回答
320 浏览

c++ - 如何检查鼠标是否点击了OpenGL中的多边形?

我正在尝试在 OpenGL 中制作颜色选择器工具。它可以工作,您可以使用下面的代码。但是有一个明显的问题,如果你测试程序你会发现如果你点击黑色背景,选择的颜色会变成黑色。所以我的问题是如何更改代码以使其识别我单击了哪个多边形或识别出我单击了某物或多边形。