我会用它做一个矩形纹理。
您将需要 2 x 2D纹理/数组,一个用于r,g,b
颜色求和avg,一个用于 count 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>0
或z<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
避免这种情况
可以忽略地球边缘附近的区域以避免扭曲
可以应用照明校正
来自time
和a,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]好吧,我玩了一下,发现了这一点:
- 校正非线性投影边缘缩放
asin
与没有纹理坐标校正的情况相比,失真要小得多