我们有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>0
或z<0
取决于相机的Z
方向),则avg[a][b]+=image[x][y]; cnt[a][b]++;
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] 好吧,我玩了一点,发现了这一点:
tx=0.5*(+(asin(x)*6.0/M_PI)+1);
ty=0.5*(-(asin(y)*6.0/M_PI)+1);
asin
纹理坐标校正的情况要小得多关于ipad - 将地球的卫星照片转换为球体上的纹理贴图(OpenGL ES),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11180015/