是否可以 select 多个对象与框 selection?

Is it possible to select multiple objects with box selection?

我知道 QObjectPicker 我可以用鼠标选择一个实体。但是如何通过在屏幕上绘制一个矩形来 select 多个对象?

我觉得这其实挺复杂的。但这是我的两分钱:


如果你只需要能够select不被遮挡的物体

(即不需要 select 遮挡)您可以将第二个帧图分支添加到现有的分支,并使用独特的颜色绘制每个对象,但绘制到屏幕外纹理。然后检索此纹理,检查哪些颜色位于绘制的矩形内并检索相应的对象和 select 它们(与 this question/answer 比较)。

我不确定它在 Qt3D 中的效果如何,因为我在使用 QRenderCapture 时总是遇到一些问题。它似乎没有影响我在帧图中添加它的地方,即总是捕获最后的状态所以即使你有多个渲染目标它也可能捕获错误的等等。Qt3D 仍然处于非常粗糙的状态我会说。

如果您需要有关如何渲染到屏幕外纹理的示例,请查看 my example on GitHub


如果你也需要能够select遮挡物体

然后它变得相当复杂。我只是在这里提供一些想法。我不知道他们是否会工作。

如果您没有那么多对象,也许您可​​以对每个对象实施上面的想法。 IE。对于每个对象,您都有一个屏幕外框架图分支,用于过滤掉所有其他对象。然后您可以检查用鼠标绘制的矩形的每个渲染纹理。但是我再次不确定它与 Qt3D 的配合情况如何,如果你有很多对象(比如在游戏中),它可能会因为许多屏幕外纹理而崩溃。

您还可以实现 "inverse" 截锥体剔除之类的功能。在视锥体剔除中,您可以忽略位于相机视锥体之外的渲染对象。您可以使用用鼠标绘制的矩形坐标来计算截锥体。查看 QFrustumCulling code。当然,您需要使用修改后的视图矩阵以不同方式计算平面。当用户绘制矩形时,计算平截头体并检查所有对象。不幸的是,这也是 selects 对象,其边界球体与平截头体相交,即使您可能看不到对象的任何部分。如果这让您感到困扰,您可以直接 select 球体完全在平截头体内的所有对象以及仅部分相交的所有对象在每个三角形的基础上进行交集计算,并尽快退出当前对象的计算三角形与平截头体相交。根据三角形的数量,这在计算方面可能非常昂贵。

我肯定会坚持只能够 select 未被遮挡的对象,尤其是因为这些天在 OpenGL 中的拾取似乎是通过用颜色绘制对象来实现的。