4

我们有 5 颗地球静止卫星,分布在赤道周围(不是等距,而是几乎),每天都在拍摄地球照片。每张照片的输出是 - 惊喜!- 从很远的地方拍摄的球体照片。

我需要将这些照片重新组合成一个纹理映射球体,我不确定如何最好地做到这一点。关键问题:

  1. 这些照片 - 显然 - 距离中心越远,就会严重扭曲,因为它们正在看一个球体
  2. 在一天中的不同时间拍摄了数百张 5 张照片的“组”。任何解决方案都必须是程序化的——我不能只用手来做:(
  3. 输出平台是 iPad3:Open GL ES 2,纹理高达 4096x4096 - 但不如桌面 GPU 强大。我对着色器不是很好(虽然我已经做了很多 OpenGL 预着色器)
  4. 照片本身是高分辨率的,我不确定我是否可以同时加载所有 5 个纹理。我还为行星表面加载了非常高分辨率的纹理(在卫星照片下方)。

我已经有了:映射到球体上的单个矩形纹理(我的球体是包裹在球体中的标准网格,顶点均匀分布在表面上),所以......我尝试将 5 张球体照片转换为单个矩形地图(但到目前为止没有成功;尽管有人指出我在做一个“极地罪恶扭曲”,看起来它可能会更好)。

我还想过做一些时髦的事情,用 5 张照片制作立方体贴图,并巧妙地决定要读取给定像素的哪些照片,但我并不完全相信。

有没有更好的办法?我忽略了什么?或者有没有人有实现上述目标的具体方法?

4

1 回答 1

0

我会用它做一个矩形纹理。

您将需要 2 x 2D纹理/数组,一个用于r,g,b颜色求和avg,一个用于 count cnt。此外,我不相信我会使用OpenGL/GLSL,在我看来,C/C++ 会更好。

我会这样做:

  1. 空白目标纹理 ( avg[][]=0, cnt[][]=0)
  2. 获取卫星位置/方向、时间

    从位置和方向创建变换矩阵,以与照片相同的方式投影地球。然后从时间确定旋转移位。

  3. 循环穿过整个地球表面

    只有两个嵌套循环a- 旋转和 `b - 到赤道的距离。

  4. 获取x,y,za,b变换矩阵+旋转移位(a-axis)

    也可以倒着做,a,b,z = f(x,y)但它更棘手但更快更准确。您还可以x,y,z在相邻的(pixels/areas)[a][b]

  5. 添加像素

    如果x,y,z在正面(z>0z<0取决于相机Z方向)然后

    avg[a][b]+=image[x][y]; cnt[a][b]++;
    
  6. 从点 #3 结束嵌套循环。

  7. 转到 #2 下一张照片
  8. 循环遍历整个avg纹理以恢复平均颜色

    if (cnt[a][b]) avg[a][b]/=cnt[a][b];
    

[笔记]

  1. 可以测试复制的像素是否为:

    在白天或晚上获得(仅使用您想要的,不要将两者混合在一起!!!)也可以确定云(我认为灰色/白色不是雪)并忽略它们。

  2. 不要溢出颜色

    可以使用 3 个单独的纹理r[][],g[][],b[][]avg避免这种情况

  3. 可以忽略地球边缘附近的区域以避免扭曲

  4. 可以应用照明校正

    来自timea,b坐标以标准化照明

希望能帮助到你 ...

[Edit1]正交投影

所以这里很清楚我所说的正交投影是什么意思:

卫星照片纹理(EUMETSAT)

这是使用的纹理(在网络上找不到更合适和免费的)并且想要使用真实的卫星图像而不是一些渲染......

正交投影

这是我的正交投影应用程序

  • 红、绿、蓝线是地球坐标系(x,y,z轴)
  • (红、绿、蓝)白线是卫星投影坐标系(x,y,z轴)

关键是将地球顶点坐标转换(vx,vy,vz)为卫星坐标(x,y,z),如果z >= 0它是处理纹理的有效顶点,那么直接从x,y没有任何透视(正交)的情况下计算纹理坐标。

例如tx=0.5*(+x+1);......如果x被缩放到<-1,+1>并且可用的纹理是tx <0,1>相同的y轴:ty=0.5*(-y+1);......如果y被缩放到<-1,+1>并且可用的纹理是ty <0,1>(我的相机具有y相对于纹理矩阵的倒置坐标系,因此y轴上的倒置符号)

如果z < 0您正在处理超出纹理范围的顶点,请忽略它...正如您在图像上看到的那样,纹理的外边界被扭曲,因此您也应该只使用内部(例如地球图像区域的 70%)可以根据与纹理中点的距离进行某种纹理坐标校正。完成此操作后,只需将所有卫星图像投影合并为一张图像即可。

[Edit2]好吧,我玩了一下,发现了这一点:

  • 反向投影校正根本不适用于我的纹理我认为这可能是后期处理的图像......
  • 基于中点距离的校正似乎不错,但使用的比例系数很奇怪,不知道为什么在应该是 4 时乘以 6 我认为......

    tx=0.5*(+(asin(x)*6.0/M_PI)+1); 
    ty=0.5*(-(asin(y)*6.0/M_PI)+1); 
    

校正的非线性投影

  • 校正的非线性投影(由 asin 提供)

校正非线性投影边缘缩放

  • 校正非线性投影边缘缩放
  • asin与没有纹理坐标校正的情况相比,失真要小得多
于 2014-01-08T11:04:47.973 回答