在Cesium渲染帧

时间:2015-11-05 15:02:50

标签: graphics camera registration affinetransform cesium

我有一张从飞机上拍摄的照片。我知道拍摄照片时的飞机位置(纬度高度,航向俯仰偏航和摄像机fov)。 假设我希望Cesium能够像拍摄图像一样向地球展示。我可以通过以下方式实现:

  1. 将Cesium容器div设置为与图像中的宽度/高度相同。
  2. 将camera.frustum.fov设置为适当的值。
  3. 将camera.setView与positionCartographic和angles一起使用。
  4. 它的注册数据不准确,因此图像有准确的registrator产生的额外数据( Edit3:注意我没有询问这样的registrator,我已经有registrator输出) 。数据是应该应用于图像的固定公式。该公式表示为应该应用于图像的仿射矩阵(2d,3x3矩阵,其中最后一行为0 0 1)。

    要在Cesium上获得此修复,我应该在Cesium相机上应用类似于仿射变换的东西。最好的方法是什么?

    编辑2:我在下面建议的方式不起作用。我需要找到一种方法来应用仿真转换 之后的任何世界到屏幕的计算和之前任何屏幕到世界的计算。这是Cesium核心中的纯粹技术问题。我该怎么办?我担心这样的转换是在代码中的很多地方进行的......

    [ 对于它可能关心的人,有一些原因,我在下面的方式不起作用。以下是一些直观的解释,数学解释如下:

    1. 仿射变换转换没有可以应用于相机的等效操作。通过moveLeft移动相机并不等效,例如,如果我在扫描仪的左侧有一座山,当我将相机向右移动时,它将隐藏更大的区域,并且在渲染帧上应用的仿射变换中不会发生这种情况。使用rotateLeft也不相同 - 尝试使用相机的近和远平面在3D中绘制它,您将很容易理解。
    2. 溶液忽略了基质的剪切成分。剪切实际上可以像我一样被分解为旋转 - 缩放 - 旋转,但旋转后的缩放不等于仅在水平和垂直fov不相等时改变fov - 这正是执行剪切所需的。 / LI>

      更多的数学直觉是:应用于帧的一般仿射2x2变换等效(我认为)对摄像机的4x4矩阵变换应用一些变换,但是一般矩阵不能转换为相机参数。相机模型有8个自由度(3个位置坐标,3个欧拉角和1个或2个fov,取决于是否存在纵横比自由度),但3d到2d透视变换有12个分量(11个自由度因为w可以归一化)。 ]

      我首先考虑将矩阵分解为4个矩阵:平移,旋转,缩放和另一个旋转。假设我知道如何做到这一点,我应该在相机上应用四个矩阵。

      • 通过twistLeft轻松完成旋转变换。
      • 应用翻译比较棘手,我可以通过moveLeft和moveUp移动相机,但是我不知道在给定的像素数量下我应该传递多少量? (矩阵是根据图像像素给出的,可以很容易地转换成屏幕像素编辑:我认为我应该使用rotateUp和rotateLeft来获得仿射翻译的效果,但是我不确定它是否等同于在删除建议中建议的翻译.moveLeft和moveUp,因为相机的翻译不等同于图像的翻译。例如,如果我在scane的左侧有一座山,它将会当我将相机向右移动时,隐藏更大的区域。此示例说明了相机无法移动的原因。)
      • 我不确定如何应用比例转换。我考虑过向前移动相机或减少fov,但我不确定是否:a。它相当于图像上的线性刻度吗?湾我应该传递多少钱来移动或如何计算新的fov?编辑:我应该减少fov。移动相机是错误的,正如前一篇关于翻译的内容中提到的那样)

      最后,如果我成功完成上述所有工作,我想处理水平刻度和垂直刻度不相等的情况。在Cesium中有可能吗?

      老实说,我宁愿将仿射变换与内部摄像机矩阵相乘,但我在API中找不到这样的功能。无论如何,我也考虑改变Cesium源代码,但这是现在最不喜欢的选项。

1 个答案:

答案 0 :(得分:0)

似乎你在问什么是正射校正,因此在Cesium中不能轻易完成。这是一项复杂的任务,这里是关于姐妹网站的讨论,您可以在这里了解更多信息。也试着在那里问这个问题。

https://gis.stackexchange.com/questions/9334/free-gis-software-that-can-orthorectify