【问题标题】:How to access min and max coordinates of a 3D object in C++?如何在 C++ 中访问 3D 对象的最小和最大坐标?
【发布时间】:2017-08-31 14:23:48
【问题描述】:

我正在使用 c++ 和 OpenGL 在 qt Creator 中创建一个游戏,并尝试将边界框添加到我的场景中以实现碰撞检测。我在我的场景中使用从 Maya 作为 .obj 导入的对象,因此它们的尺寸没有在代码中设置,只有它们的位置、旋转和缩放。我能够在每个对象周围创建一个与其位置相匹配的边界框,但我正在努力寻找一种方法来访问对象的最小和最大 x、y 和 z 值,以便将框与对象的大小相匹配。

有人对我如何访问最小和最大坐标有任何想法吗?如果我可以访问这些值,我知道如何实现代码..

【问题讨论】:

  • 如果您已经能够创建边界框,那么问题出在哪里?
  • @Vallentin - 如果您继续阅读另外 2 行,您会意识到情况并非如此。 OP 创建了一个“边界”框,它并没有真正限制几何体。
  • 我确实读过它。取所有顶点的 x、y、z 的最小值和最大值将创建一个适合的边界框。唯一不适合的情况是,如果网格稍后旋转,OP 没有提到它不适合的情况。
  • 旋转不会有问题,因为边界框只需要适应原始网格,所有应用于网格的变换也会应用于边界框。
  • AABB 还是 OBB 用于边界框?

标签: c++ qt opengl collision bounding-box


【解决方案1】:

您遇到的问题是每个对象几何体都有不同的内部存储方式和边界框的确定方式。

让我们尝试一些例子来说明这一点:

  • 假设我们有一个圆,其内部存储的绘图参数是中心坐标x_center和y_center以及半径radius。如果您尝试确定此对象的边界框,您会看到它从(x_center - radius, y_center - radius) 延伸到(x_center + radius, y_center + radius)。

  • 如果你有一个未旋转的矩形,由它的主对角线的两个点给出,边界框正好与它的形状重合,所以你只需要给出代表它的两个相同点的坐标。

  • 另一方面,如果我们有一个多边形,则边界框将由所有多边形顶点的最小和最大坐标确定。如果允许旋转多边形,则需要先旋转所有顶点坐标,然后再确定它们的最大值和最小值,以获得边界框。

  • 再举一个例子,如果我们有一个三次样条,由它的四个控制点的坐标确定,您将确定两个三次多边形的最大值和最小值,这意味着求解两个二次方程(在推导),在一般情况下。

为了处理所有这些问题,几何形状通常包括一些多态构造它的边界框的方法(它通常甚至被缓存,所以你不必计算它,只有在它的位置或比例发生旋转或变化之后) 通过一些实例方法。

当然,所有这些都取决于如何以及如何定义形状的实现方式。也许您的情况比我在这里公开的要简单,但是您没有说。如How to create a Minimal, Complete, and Verifiable example 页面中所述,您也不会显示任何代码或输入/输出数据。因此,您最好编辑您的问题并添加您的示例代码,这将显示有关您的确切问题的更多信息。

【讨论】:

    【解决方案2】:

    如果你有 obj loader 那么你就有了一个数组。

    float t[2100];
    int x = 2100;
    float xmax=-123243;
    while(x>=0)
    {
       if(xmax<t[x]) xmax=t[x];
       x-=3;
    }
    

    所以这里是对象的最大 x (?)。

    【讨论】:

      猜你喜欢
      • 2013-10-22
      • 2020-08-23
      • 2013-02-27
      • 1970-01-01
      • 2016-07-02
      • 1970-01-01
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多