gpt4 book ai didi

opengl - 使用选择框选择 3D 曲面(以两种不同的方式)

转载 作者:行者123 更新时间:2023-12-02 05:05:00 28 4
gpt4 key购买 nike

我正在创建一个建模软件。我的模型都是由平面多边形组成的,它们只是我用 OpenGL 显示的一组有序顶点。我已经进行了大量搜索,但令我惊讶的是,我没有找到与我正在寻找的应用程序相关的太多信息。

我正在尝试使用矩形框来选择曲面。这听起来很简单,但我希望它的工作方式与该方法在许多程序中的工作方式相同。这些是我正在寻找的要求:

  1. 我想要一个从左侧开始向右移动的矩形,以仅选择那些完全包含在框中的对象。
  2. 从右侧开始并向左延伸的矩形应选择所触摸的任何表面(不必完全封闭。
  3. 所有位于/接触矩形的对象都应被选择。换句话说,我想选择对象,无论它们是否可见。盒子内的所有内容,即使被另一个表面覆盖,仍然应该被选择。

列表中的第三项是最重要的。首选方案 1 和方案 2,但如果事实证明实现起来过于困难,我只能选择其中一种。

我看过有关 3D 拾取的各种其他帖子,似乎大多数都建议颜色拾取或光线转换。我使用颜色选取进行正常单击选择,但因为我希望框选择包括不可见的表面,所以这不是一个选项。光线转换似乎也只适用于单个点击点,而不适用于盒子。那么还有其他方法可以相当简单地实现我的目标吗?我认为这将是一个相当常见的任务,因为它似乎存在于许多建模软件中,但不幸的是我一直无法找到适合我需要的方法。

算法的伪代码将受到赞赏,但不是必需的。至少我正在寻找一种我能够自己研究并找到一些例子的方法;我根本不知道该去哪里看。

最佳答案

在 CPU 上执行您自己的交集计算当然是一种选择。但根据我对你的要求的理解,我认为你也可以让 OpenGL 来完成这项工作,这应该更容易、更高效。

方法概述

我想到的机制是遮挡查询。它们允许您计算已渲染的像素。如果将此与剪刀测试结合起来,您可以计算选择矩形内渲染的像素。

应用到用例

用例 2 是这种方法中较为简单的一个。您将选择矩形设置为剪刀矩形,并使用每个曲面的遮挡查询来渲染所有曲面。然后检查查询结果,所有查询结果大于0的表面都有像素位于选择矩形内。

用例 1 稍微棘手一些。要知道曲面是否完全包含在矩形内,您需要两次通过。您可以像上面一样使用遮挡查询进行一次渲染,并启用剪刀测试。然后,您再次执行相同的操作,并禁用剪刀测试。如果一个表面的两次查询结果相同,则它完全位于矩形内。

实现

我不会为此提供完整的代码。一切都应该非常简单。但这里有一些指针和代码片段。显示的调用带有 C 绑定(bind)。我希望 Python 绑定(bind)的效果是显而易见的。

首先,由于您想要在选择中包含隐藏曲面,因此需要禁用深度测试:

glDisable(GL_DEPTH_TEST);

由于您并不真正需要生成输出,并且可能不想干扰视觉渲染输出,因此您可能还想禁用颜色输出:

glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);

如果您启用了背面剔除,您可能还想禁用它:

glDisable(GL_CULL_FACE);

然后,对于上面提到的您只想计算选择矩形内的像素的 channel ,设置剪刀矩形并启用剪刀测试:

glScissor(selectionLeft, selectionBottom, selectionWidth, selectionHeight);
glEnable(GL_SCISSOR_TEST);

对于使用遮挡查询进行渲染,您需要为每个表面提供一个查询对象:

GLuint queryIds[surfaceCount];
glGenQueries(surfaceCount, queryIds);

然后对于每个表面,使用k作为循环索引:

glBeginQuery(GL_SAMPLES_PASSED, queryIds[k]);
// render surface k
glEndQuery(GL_SAMPLES_PASSED);

所有surface都渲染完成后,就可以得到查询结果了:

GLint pixelCounts[surfaceCount];
// for all surfaces k
glGetQueryObjectiv(queryIds[k], GL_QUERY_RESULT, &pixelCounts[k]);

然后评估像素计数,以决定应选择哪些表面,如上一节中所述,针对每个用例。

完成后不要忘记重置所有状态,以便再次准备渲染。深度测试、颜色掩模、剪刀测试等

关于opengl - 使用选择框选择 3D 曲面(以两种不同的方式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32145609/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com