问题标签 [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.
c# - OpenTK“挑选”没有按预期工作
我试图在我的游戏中实现拾取,但我确信我遗漏了一些东西,因为拾取的颜色总是返回 255,255,255,255 或 255,0,0,0。这两种颜色似乎是随机发生的,甚至在我多次单击同一个块时会发生变化。我不知道我做错了什么,但我真的希望 stackoverflow 的神能帮助我找到解决方案。
这是一张演示输出的图片:
这是我的 GameClient 类:(我为混乱的代码道歉,我还没有时间整理它)
opengl - 从鼠标坐标创建射线以进行 3D 拾取
我的问题
有人可以链接一篇好文章/教程/任何东西,或者甚至解释如何正确地从鼠标坐标投射光线以选择 3D 对象吗?
我已经有了射线和相交的作品,现在我只需要通过鼠标点击来创建射线。
我只是想要一些我知道实际上应该起作用的东西,这就是为什么我在这里问专业人士,而不是我一开始就不确定它是否正确的东西。
现在状态
我有一个射线类,如果我将原点和方向设置为与相机相同,它实际上可以工作并检测相交,所以当我移动相机时,它实际上选择了正确的东西。
现在我想用鼠标实际进行 3D 拾取,而不是相机移动。
我已经阅读了很多关于此的其他问题,2 个教程,尤其是许多不同的数学内容,因为我真的不擅长它。
但这对我没有多大帮助,因为那里的人经常使用一些“unproject”功能,这些功能似乎实际上已被弃用,我不知道如何使用也无权访问。
现在我将光线原点设置为相机位置,然后尝试从本教程中的计算中获取光线的方向。
它有点作用,这意味着当相机指向对象时选择起作用,有时也沿着整个 y 轴,我不知道发生了什么。
如果有人想立即查看我的代码:
opengl - 通过 2 个 gluUnproject 调用在世界坐标中获取鼠标以创建射线
我尝试使用许多人似乎找到的好方法,我用不同的 z 值调用 gluUnproject 2 次,然后尝试从这两个向量计算射线的方向向量。
我阅读了这个问题并尝试将那里的结构用于我自己的代码:
但这只会返回同质剪辑坐标(我相信),因为它们在每个轴上的范围仅从 -1 到 1。
如何实际获取可以创建射线的坐标?
编辑:这就是我构造矩阵的方式:
编辑2:
这是函数现在的样子:
}
我正在尝试使用我自己的投影和视图矩阵,但这似乎只会给出更奇怪的结果。
使用 GlGet... 的东西,我在右上角点击一下:
开始:(0.97333336,-0.98,-1.0)
结束:(0.97333336,-0.98,1.0)
当我使用自己的东西时,我会得到相同的位置:
开始:(-2.4399707,-0.55425626,-14.202201)
结束:(-2.4399707,-0.55425626,-16.198204)
现在我实际上需要一个模型视图矩阵而不仅仅是视图矩阵,但我不知道我应该如何获得它,因为它在每个对象的每个显示调用中都被更改并重新创建。
但这真的是问题吗?在本教程中,他说“通常,要从眼睛空间进入剪辑空间,我们将向量乘以投影矩阵。我们可以通过乘以该矩阵的逆矩阵来向后退。” 在下一步中,他再次乘以视图矩阵的倒数,所以我认为这就是我应该做的?
编辑 3:
在这里我尝试了 user42813 的建议:
但是现在方向和原点值始终相同:
原点:(-0.04557252,-0.0020000197,-0.9989586)
方向:(-0.04557252,-0.0020000197,-0.9989586)
c++ - 当涉及旋转时,将鼠标坐标转换为 OpenGL 中的模型坐标
在 Qt 论坛中,我发现了这个问题并激发了我的好奇心。
我在 Qt 中找到了一个非常简单的示例来显示一个立方体,并修改了立方体逻辑以创建一个边长为 1 个单位的立方体。
然后我尝试点击模型并显示我点击的区域的坐标。
当不涉及旋转时,似乎采摘工作正常。但!如果我取消注释旋转(或其中一个),paintGL
我最终会得到“错误”的值。
例如:
- 没有旋转,几乎点击了立方体的最左边的边框:
gluUnProject
方法说我点击了点{ -0.49075, 0.234, 0.5 }
,这似乎没问题。
- 启用旋转并几乎单击多维数据集的最左侧边框:我收到了 point
{ -0.501456, 0.157555, -0.482942 }
,这似乎是错误的。坐标不在其x
范围内-0.5, 0.5
。
我认为坐标转换是可以的。我一直在通过谷歌进行研究,人们总是使用相同的代码。此外,像素的颜色信息与我点击的面部颜色相匹配。
那么,谁能告诉我为什么当涉及旋转时我得到错误的坐标?我认为我在一些基本的 3D 理解方面失败了,但我无法意识到它在哪里。
这是代码:
主.cpp:
GLCube.h
GLCube.cpp:
笔记:
我在 Windows 8.1 64 位、Qt 4.8 和 MinGW 中运行它。
此外,两者都没有错误glReadPixels
地gluUnProject
退出(错误代码= GL_NO_ERROR
)
并且glut
不可用。只有什么OpenGL
,QtOpenGL
和/或glu
提供。
c - 为什么我在挑选时总是放大?(OpenGL)
我有以下代码:
原谅我的长度。我试图让挑选工作,以便我可以一次选择一个对象来做事。根据我的打印输出,它的功能与我预期的一样,除了一个障碍:当你选择一个物体时,你最终会被放大到非常大,基本上在选定的形状内。我已经梳理了我的代码,并进行了一些更改/调试,但我找不到问题所在。谁能指出我正确的方向,为什么采摘会产生这种奇怪的行为?
javascript - 如何使用 Three.js 鼠标拾取
我想在此代码中添加对象拾取:
我怎样才能以最简单的方式做到这一点?
ps 只有用“loadCastle”方法加载的城堡网格,我希望能够选择它们。
编辑:
我尝试了这样的 AlmazVildanov 建议:
但是当我点击模型时没有任何反应,控制台中没有消息。
编辑 2:对象拾取工作正常。解决了。
c# - GLControl 拣货问题
我再次在选择 OpenGL/OpenTK 时遇到了一点问题。这一次,与我不久前开始的线程不同,它实际上正在工作。唯一的问题是没有正确选择“瓷砖”。我的意思是,如果我单击网格上的某个位置,它会直接选择它旁边的网格图块。但是,如果我稍微移动鼠标,它将正确选择网格图块。这很难解释,所以我将上传两张图片、代码和可执行文件本身。
这是我的看法:
这是一个基本的网格选择系统。它有效。但是,选择例程似乎有点偏离。
这是底层视图的图片,用户实际上并没有看到。当用户点击时,场景被绘制到后台缓冲区,这只是为了帮助揭示拾取系统的实际外观。
红色圆圈和 x 表示我刚刚单击但未正确注册的位置;该位置的集合中没有添加任何体素。但是,如果我将鼠标稍微向右移动,或者更靠近图块的中心,则会为该位置正确添加一个体素。
这是代码的主要部分;我会添加任何其他必要的内容。哦,很抱歉它有多乱,我还没来得及清理它。
这是可执行文件本身的下载链接,这样你们就可以直接看到问题,而不是通过我模糊的、不充分的口头描述。
编辑/更新
我想我刚刚发现了这个问题。在调整大小期间,控件本身正在返回(宽度 518,高度 537)。但是,我在 GIMP 中对此进行了测量,发现我只获得了 (518,512) 的可视区域,这意味着该控件被相邻的工具条部分覆盖,并且显示条控件较低。考虑到这种情况,我试图将拾取例程的 y 值偏移 -25(其中一个控件的高度),它神奇地开始工作得更好。我认为这实际上解决了问题,我只需要更好地定位控件并将 opengl 上下文放在前面。这应该解决它;如果是这种情况,我将很快在下面提供答案。
c++ - OpenGL获取最近世界3D点到当前鼠标位置的3D坐标
在 OpenGL 上下文中,我已经看到可以将鼠标坐标转换为 3D 世界坐标(例如,使用 Opengl 的 MFC 从鼠标的 2d 坐标获取 3d 坐标)。但是,当我只有一组 s 和大量空白空间时,这不起作用GLPoint
:当我将鼠标悬停在空白空间上时,3D 坐标没有意义。
如何获得离鼠标位置最近的 3D 点的坐标?
qt4 - 检索鼠标下的纹理坐标
我正在使用Qt 4.8
它的OpenGL
模块,使用固定的管道,并且我有一个立方体映射的球体,每个立方体面的 tex 坐标由OpenGL
via glTexGenf
(R、S 和 T 坐标)自动生成。
在场景中单击时,我通过glReadPixels
和检索鼠标光标下的顶点坐标gluUnProject
。
我现在正在寻找的是一种检索 texture coordinate
与该位置相关联的方法。我没有找到有关此主题的任何内容,所以我想知道是否有办法实现这一目标。
opengl - 如何使用多样本帧缓冲区在 OpenGL 中选择几何图形?
(编辑)我使用帧缓冲区进行了工作几何选择。我的目标是在一次绘制调用中绘制巨大的场景,但我需要绘制到多重采样颜色纹理附件 (GL_COLOR_ATTACHMENT0)
并绘制到(编辑的)非多重采样纹理附件 (GL_COLOR_ATTACHMENT1)
。问题是如果我使用多重采样纹理来挑选,由于多重采样,挑选会被破坏。
我将几何 ID 写入片段着色器,如下所示:
(该代码的要点是使用 RGB 空间存储几何 ID,然后读回用于更改立方体颜色的使用)
当我将光标向左移动一个像素时会发生这种情况:
由于立方体像素的 alpha 值:
没有多重采样效果很好。但是多重采样将我的输出颜色相乘,然后几何 id 被破坏,因此它选择具有相乘值的随机立方体。
(编辑)我不能将一个多重采样纹理目标附加到 color0 并将非多重采样纹理目标附加到 color1,它不受支持。我怎样才能在一个draw call中做到这一点?
多重采样不是我的朋友我不确定我是否理解得很好(整个帧缓冲)。无论如何,这种选择几何形状的方式对我来说看起来很糟糕(我的意思是计算 ID 到颜色)。我做得好吗?如何解决多样本问题?有没有更好的办法?
PS:抱歉英语低。:)
谢谢。