ipad - 将地球的卫星照片转换为球体上的纹理贴图(OpenGL ES)

标签 ipad 3d opengl-es-2.0

我们有5颗对地静止卫星,它们在赤道周围分布(间隔不相等,但几乎相等),每天为地球拍照。每张照片的输出是-惊喜! -从远处拍摄的球形照片。

我需要将这些照片重新组合到一个纹理贴图的球体中,我不确定如何做到最好。关键问题:

  • 显然,这些照片在您从中心到远处时会严重扭曲,因为它们正在观察球体
  • 在一天中的不同时间拍摄的数百张5张照片“套”。任何解决方案都必须是编程的-我不能只手工完成此操作:(
  • 输出平台是iPad3:Open GL ES 2,纹理最高可达4096x4096-但不如桌面GPU强大。我对着色器不太满意(尽管我做了很多OpenGL预着色器)
  • 照片本身是高分辨率的,我不确定是否可以同时加载所有5个纹理。我还为行星表面加载了非常高分辨率的纹理(在卫星照片下面)。

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

    我还考虑过用5张照片制作一个立方体贴图来做一些时髦的事情,并聪明地决定要为给定像素读取哪些照片,但是我并不完全相信。

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

    最佳答案

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

    您将需要2 x 2D 纹理/阵列,一个用于r,g,b颜色求和 avg ,一个用于计数 cnt 。我也不相信我会使用 OpenGL / GLSL 来实现,因为在我看来C / C++会更好。

    我会这样:

  • 将目标纹理(avg[][]=0, cnt[][]=0)留空
  • 获取卫星位置/方向,时间

    从位置和方向创建变换矩阵,该矩阵以与在照片上相同的方式投影地球。然后从时间确定旋转位移。
  • 遍历整个地球表面

    只有两个嵌套循环a-旋转和`b-距赤道的距离。
  • x,y,z获取a,b并变换矩阵+旋转移位(a -axis)

    也可以向后a,b,z = f(x,y)做到这一点,但它比较棘手,但速度更快,更准确。您也可以在相邻的x,y,z
  • 之间插值(pixels/areas)[a][b]
  • 添加像素

    如果x,y,z位于正面(z>0z<0取决于相机的Z方向),则
    avg[a][b]+=image[x][y]; cnt[a][b]++;
    
  • 从#3点开始的嵌套循环的结尾。
  • 转到#2,带有下一张照片
  • 遍历整个avg纹理以恢复平均颜色
    if (cnt[a][b]) avg[a][b]/=cnt[a][b];
    

  • [说明]
  • 可以测试复制的像素是否为:

    在白天或晚上获得的图像(仅使用所需的图像,不要将两者混合在一起!!!)也可以确定云(我认为灰色/白色的颜色不会下雪)而忽略它们。
  • 不会溢出颜色

    可以使用3个单独的纹理r[][],g[][],b[][]代替avg来避免
  • 可以忽略地球边缘附近的区域,以避免变形
  • 可以应用照明校正

    timea,b坐标来规范照明

  • 希望能帮助到你 ...

    [Edit1]正交投影

    所以这很清楚,这就是我所说的正交投影:

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

    这是我的正交投影应用
  • 红,绿,蓝线是地球坐标系(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纹理坐标校正的情况要小得多
  • 关于ipad - 将地球的卫星照片转换为球体上的纹理贴图(OpenGL ES),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11180015/

    相关文章:

    ios - 使用 UIWebView 显示 PDF 不起作用

    math - 求截锥体/截棱锥横截面的边长

    ios - iPad 应用程序以横向模式启动

    iphone - 如何在横向处理 UIImagePickerController 覆盖旋转?

    JavaScript Three.js 3D引擎: how to make object bigger by 20%?

    algorithm - 3D 平面多边形之间的交集

    java - 如何渲染令人信服的天穹?

    ios - 颜色在 OpenGL ES 中不能正确混合

    android - OpenGL ES 2 - 一个大纹理图集与多个小纹理图集。什么是更好的性能明智?

    ios - 是否可以维护 iOS 应用程序的 'compatible' 版本