将ECEF坐标中的边界框转换为ENU坐标

时间:2014-08-20 16:37:03

标签: opengl math graphics coordinate-systems

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

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

我不太清楚采取这种做法。我想到了一种使用局部到世界矩阵的方法,但不是很清楚。enter image description here

@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)
  5. 这次我不得不沿着x使用宽高比,因为我之前的预期是因为在我的应用程序中fov是y。虽然这几乎准确,但我猜仍然有一个小错误。我不太确定生成一个新的边界框是否是个好主意。可能更准确地在原始边界框中识别2点point1(xmax,ymin,zmax)和点(xmax,ymax,zmax),在与矩阵相乘之后找到它们的值然后执行(point2-point1).length ()。同样的y。那会更准确吗?

1 个答案:

答案 0 :(得分:0)

  1. 转换矩阵

    • 首先要了解变换矩阵代表坐标系
    • 看这里Transform matrix anatomy
    • 如果您使用直接矩阵,那么您正在转换
    • 从矩阵局部空间(LCS)到世界全球空间(GCS)
    • 如果使用逆矩阵,则将坐标从GCS转换为LCS
  2. 相机矩阵

    • 相机矩阵转换为相机空间,因此您需要逆矩阵
    • 你得到这样的相机矩阵:
    • camera=inverse(camera_space_matrix)
    • 现在如何构建你的camera_space_matrix以使其适合边界框
    • 看这里Frustrum distance computation
    • 所以计算你方框顶部矩形的中点
    • 将相机距离计算为从所有顶点ob box计算的最大距离
    • 相机位置为中点+距离*中点正常
    • 方向取决于您的投影矩阵
    • 如果您使用gluPerspective,则根据所选的glDepthFunc
    • 查看-Z或+ Z
    • 使矩阵的Z轴正常
    • 和Y,X向量可以与北/南和东/西对齐
    • 例如Y=Z x (1,0,0)X = Z x Y
    • 现在将位置和轴向量X,Y,Z放在矩阵
    • 计算逆矩阵
    • 并且它是
  3. camera space

    [注释]

    • 不要忘记FOV对于X轴和Y轴(纵横比)可以有不同的角度
    • 法线正好是中点 - 地球中心是(0,0,0)所以正常也是中点
    • 将其标准化为1.0
    • 对于所有计算使用笛卡尔世界GCS(全球坐标系)