【问题标题】:Convert a bounding box in ECEF coordinates to ENU coordinates将 ECEF 坐标中的边界框转换为 ENU 坐标
【发布时间】:2014-08-20 16:37:03
【问题描述】:

我有一个几何图形,其顶点位于笛卡尔坐标中。这些笛卡尔坐标是 ECEF(地心地球固定)坐标。这种几何实际上存在于使用 wgs84 坐标的地球椭球模型上。笛卡尔坐标实际上是通过转换几何所在的纬度和经度集获得的,但我不再可以访问它们。我所拥有的是通过解析笛卡尔坐标获得的具有 xmax、ymax、zmax 和 xmin、ymin、zmin 的轴对齐边界框(在 xmax、ymax、zmax 或 xmin、ymin、zmin 处显然没有几何的笛卡尔点.边界框只是一个包围几何体的长方体)。

我想要做的是在概览模式下计算相机距离,使这个几何体的边界框完全适合相机平截头体。

我不太清楚这里采取的方法。想到了使用本地到世界矩阵之类的方法,但不是很清楚。

@Specktre 我参考了您关于在 3D 中移动点的建议,这使我找到了另一个改进的解决方案,但并不完美。

  1. 计算一个可以从 ECEF 传输到 ENU 的矩阵。参考这个 - http://www.navipedia.net/index.php/Transformations_between_ECEF_and_ENU_coordinates
  2. 使用此矩阵旋转原始边界框的所有八个角。
  3. 通过查找这些旋转点的 x、y、z 的最小值和最大值来计算新的边界框
  4. 计算距离
    • cameraDistance1 = ((newbb.ymax - newbb.ymin)/2)/tan(fov/2)
    • cameraDistance2 = ((newbb.xmax - newbb.xmin)/2)/(tan(fov/2)xaspectRatio)
    • cameraDistance = max(cameraDistance1, cameraDistance2)

这一次我必须使用沿 x 的纵横比,正如我之前预期的那样,因为在我的应用程序中 fov 沿 y。尽管这几乎可以正常工作,但我猜仍然存在一个小错误。我不太确定生成一个新的边界框是否是个好主意。在原始边界框中识别2个点point1(xmax,ymin,zmax)和point(xmax,ymax,zmax)可能更准确,与矩阵相乘后找到它们的值然后做(point2 - point1).length ()。同样对于 y。那会更准确吗?

【问题讨论】:

    标签: opengl math graphics coordinate-systems


    【解决方案1】:
    1. 变换矩阵

      首先要了解transform matrix代表坐标系。看这里Transform matrix anatomy 另一个例子。

      在标准 OpenGL 表示法中如果您使用 直接矩阵,那么您正在从矩阵局部空间 (LCS) 转换为世界全局空间 (GCS)。如果您使用 逆矩阵,那么您将坐标从 GCS 转换为 LCS

    2. 相机矩阵

      相机矩阵转换为相机空间,因此您需要逆矩阵。你得到这样的相机矩阵:

      camera=inverse(camera_space_matrix)
      

      现在有关如何构建您的 camera_space_matrix 使其适合边界框的信息请看这里:

      所以计算你的盒子顶部矩形的midpoint distance 作为从盒子的所有顶点计算的最大距离,所以

      camera position = midpoint + distance*midpoint_normal
      

      方向取决于您的投影矩阵。如果您使用gluPerspective,那么您将根据选择的glDepthFunc 查看-Z 或+Z。因此,将矩阵的 Z 轴设置为正常,Y,X 向量可以对齐到北/南和东/西,例如

      Y=Z x (1,0,0)
      X = Z x Y
      

      现在将位置和轴向量X,Y,Z 放入矩阵中,计算逆矩阵。

    [备注]

    不要忘记,FOV 可以有不同的 X 轴和 Y 轴角度(纵横比)。

    法线只是midpoint - 地球中心是(0,0,0),所以法线也是中点。只需将其标准化为大小1.0

    对于所有计算,使用笛卡尔世界 GCS(全球坐标系)。

    【讨论】:

    • 所以据我了解 - 1)我计算一个世界到本地矩阵 - 将我的坐标转换到本地空间 2)我使用这个矩阵移动我的轴对齐边界框的所有 8 个点,以便现在它们在我的对象空间中有值。从这里我不清楚 - 我认为我需要类似 ((boundingBox.someCorner - boundingBox.someOtherCorner)/2)/tan(fovy/2) 之类的东西。这些角在世界坐标中会是 - (bb.xmin, bb.ymin, bb.zmax) 和 (bb.xmin, bb.ymax, bb.zmax) 吗?
    • @user1783299 是的,所有角落都在 GCS 中。只需计算靠近相机的平面的中间(平均)点(它在视图中是更大的矩形),然后从该点计算法线(您将需要它来构建相机空间矩阵)然后计算到中点的距离,以便查看适合您的矩形。最后计算相机空间轴向量 X、Y、Z 和原点(都在 GCS 中)...把它放在矩阵中,计算它的逆矩阵,这就是你所需要的(只需在你的模型上乘这个倒矩阵-视图矩阵)
    • 这里 stackoverflow.com/a/25176378/2521214 是我用于 4x4 OpenGL 变换矩阵的 C++ 逆矩阵计算
    • 请检查我对帖子的编辑。当前有效(恐怕可能会失败)的解决方案似乎不正确!
    • @raveesh 取决于所使用的投影矩阵。例如gluPerspective 具有屏幕 X 轴常数和 Y 轴正在适应匹配纵横比。所以无论纵横比 X 相同,Y 都在变化。尝试调整窗口大小,您将看到沿 x 轴的视图是相同的(可以(不)缩放屏幕 X 大小的变化,但您将始终看到相同的世界空间块)沿 y 轴视图将随着纵横比或 x 或 y 屏幕尺寸的任何变化而变化。
    猜你喜欢
    • 2021-08-01
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 2022-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-01
    相关资源
    最近更新 更多