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

opengl - 在opengl中的对象中分配给定的ID

我正在开发一个多代理应用程序。在模拟过程中,我会显示在任何时间步出现的代理。该代理有自己的特定 ID。

我想通过使用拾取来识别这些对象并与之交互。我的挑选方法有效,但我无法获得代理的 ID(我只获得与代理之一不相关的几何图形的 ID)。因此,我需要找到将代理的相应 ID 分配给任何新绘制的几何图形的方法。

当你绘制一个对象(可能在 glBegin() 和 glEnd() 之间)时,opengl 有没有办法分配一个 id ?

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 投票
1 回答
1874 浏览

opengl - 应用了基于顶点着色器的几何变形的 3D 场景的通用拾取解决方案

我正在尝试实现 3D 场景的导航技术(在带有 OpenGL 的 OpenSceneGraph 中)。除其他外,用户应该能够点击屏幕上的场景对象以向其移动。

导航技术应该集成到另一个项目中,该项目使用顶点着色器将全局变形应用于场景几何体。这就是问题所在:由于使用顶点着色器对几何体进行了变形,因此将鼠标光标位置取消投影到用户实际选择的点的世界坐标并不是直接的。但我需要这些坐标来在我的导航技术中执行正确的相机移动。

执行此非投影的一种方法是修改顶点着色器(用于变形),使其还将顶点的原始位置和法线存储在单独的纹理中。之后可以在鼠标位置读取这些纹理以获得所需的值。

现在,正如我所说,顶点着色器属于我实际上不想接触的另一个项目。我的导航技术的一个目标是尽可能通用,以便轻松集成到其他项目中。

所以这里有一个问题:OpenSceneGraph 或 OpenGL 中是否有我迄今为止没有考虑过的任何功能?任何可以让我独立于顶点着色器编码器获取片段的世界坐标的东西?

0 投票
0 回答
932 浏览

c++ - OpenGL 颜色选择 RGBA 与 RGB

我想通过这三种方法实现颜色选择/选择:

它们基本上将无符号整数(32 位)打包成 4 个字节 R、G、B、A。与 GL_SELECT 相比,它简单且非常快。

问题是它有时不起作用。它不适用于带有 NVIDIA 9800 显卡的 Windows。它适用于 Mac/Windows 中的 ATI Radeon 4670。

我当时认为问题出在 alpha 通道中,所以我尝试了这个实现:

现在在显卡和操作系统上都可以选择,但有时会选择错误的顶点(在选择矩形之外)。

这怎么可能发生?有没有更好的方法来实现颜色选择,它在各种显卡上是健壮的并且总是正确的?

0 投票
1 回答
559 浏览

django - Django cache.set() 在具有 GenericForeignKey 的类上失败,可能是什么原因?

我有一个带有GenericForeignKey. 调用cache.set(key, trac_obj)时,失败。我想知道GenericForeignKey是不是罪魁祸首?

这是错误消息:

0 投票
2 回答
1458 浏览

opengl - OpenGL 3D 拾取

我阅读了许多关于 opengl 拾取的示例代码。几乎所有这些都使用 gluPerspective 函数进行投影。我使用 glOrtho 而不是 gluPerspective 函数。

我的选择函数如下(DrawBuffer 是我的绘制代码):

但它不起作用,我无法弄清楚原因?另一个问题是:当我使用 glDrawArrays 函数绘制多条线时,如何调用 glLoadName 来标记每条线?

我的光线追踪器算法如下:

0 投票
5 回答
2356 浏览

3d - webgl 和 glsl 采摘

我从头开始实施 webgl 拾取,并决定沿着 GLSL 路线走,与光线相交测试相反。

所以我将整个场景渲染到一个单独的帧缓冲区中,为每个对象分配一个唯一的颜色,该颜色作为统一变量传递给片段着色器。当渲染场景时,我 gl.readPixels() 缓冲区,并在单击坐标处获取颜色值(我反转坐标系统以说明 GL 与浏览器坐标系统不同)。

我遇到的问题是着色器表示传递给 gl_FragColor 着色器输出的颜色,因为 vec4 浮动,每个颜色通道的范围为 0.0-1.0,而 gl.readPixels() 将颜色通道返回为 0-255 范围内的整数......做这个翻译失去一些精度,并且可能会产生拾取错误(如果场景中有很多对象(超过 255 个),或者如果整数到浮点舍入大于区分不同对象 ID 所需的粒度)。

有谁知道如何解决这个问题,或者指出我正确的方向?readPixels() 可以返回 0.0-1.0 范围内颜色通道的浮点值吗?我可以打包分布在多个通道上的单个对象 ID(这样我就不仅限于单个通道并且只能选择 255 个对象吗?)

谢谢您的帮助

0 投票
1 回答
3380 浏览

android - Draw to backbuffer using OpenGL ES 2.0 on Android

I want to implement simple picking for a 2D Application using color codes. So far I render my objects with a call to GLES20.glDrawElements() and I only render on request.

Now, I have read numerous tutorials for OpenGL on this topic, but I could not find a single one for OpenGL ES and I also fail to convert/transfer these.

So, I have two questions. How to enable double buffering? Because as far as I know I would only have one buffer without. Will these buffers automatically be swapped? I guess not, since these is a method for it. How to render exclusively to the backbuffer? I only need to do it once, so it would be a waste to do it whenever I render a new frame.

This is my first time asking on stackoverflow after I have been finding answers to all of my questions for almost 4 years now, so please be gentle :)

0 投票
2 回答
1026 浏览

android - OpenGL ES 2.0 中 Android 上的颜色选择

我已经实现了一种颜色选择方法,它也有效;有时。问题是当我在方法中调用我的onSurfaceChanged方法时,它确实读回了正确的像素。但是当我在 GLSurfaceView 中调用我的方法时onTouchevent,它只读回零。在我的方法中,我创建了一个framebuffer object并附加了两个renderbuffer objects。我的渲染器设置为RENDERMODE_WHEN_DIRTYglGetError()返回 0。问题到底出在哪里?我不确定这是否是我的方法,或者我是否根本无法在onTouchevent. 这是我在渲染器中的选取方法的源代码:

由于它可能是相关的,这是我的onDrawFrame方法:

我读过 onDrawFrame 方法在单独的线程中运行,但我不认为这是问题所在,因为我在RENDERMODE_WHEN_DIRTY...

0 投票
2 回答
475 浏览

c++ - 询问D3DXIntersect函数:(

这是我挑选的示例源代码。我有个问题。

如果我创建三个 3D 对象。所以挑选第三个对象。第一个,第二个对象不起作用。

如果我只创建一个对象。采摘效果很好!

如果我创建两个对象。拾取不是第一个对象,而是第二个对象。

只有创建最后一个对象才能很好地工作。

我不明白为什么会出现这个问题。

请给我一些建议。