博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
全景图转局部平面视图原理详解
阅读量:4354 次
发布时间:2019-06-07

本文共 982 字,大约阅读时间需要 3 分钟。

前面两篇博客主要讲了如何从全景图转到小行星、水晶球视图。今天来说下如何从全景图中取一块儿平面视图出来。

当然最简单的是直接从全景图里画一个ROI,然后扣一块儿区域出来。但是很多时候这样的操作并不方便,如果要是截取的区域跨越了拼接缝的话就麻烦了。

一劳永逸的方法当然还是将全景图贴到球面去做,假设观察者(比如我)在球内部贴着球面观看,只能看到球的一部分区域。那我不断转动这个球,我就能看到这个球不同位置的局部区域图,因为我贴的很近,我真是闲得慌。

依然使用下面这张风景秀丽的全景图:

 

1.  还是将全景图贴到球面,经纬展开法应该是老方法了。建立球面坐标系,x轴向右,y轴垂直向内,z轴向上,符合右手坐标系。

2. 仍然采用反向映射的方法,首先在球的南极点放置一张与南极点相切的平面(也就是我们要获取的局部平面图)。

3.设定视场角FOV,设定要获取的局部平面图的大小(W,H)。我们可以粗略计算出一个归一化的焦距f = (0.5*W)/tan(fov *0.5)。

4.局部视图上的坐标(u,v),转换到球面坐标系坐标为(x,y,z):

  其中x = u - W*0.5,    y = H*0.5 - v,     z =f

5. 得到(x, y, z)后就好办了,转换到球坐标(theta, fi):

   theta = acos( z/sqrt(x*x+y*y+z*z) ) 

   fi = acos( x/sqrt(x*x+y*y) )   if (y<0)    fi=2*pi - fi

6.  得到球坐标后就可以获取全景图的坐标(U, V),如果全景图的尺寸是(panoW, panoH):

 U = fi * panoW/ (2 * pi);

 V = theta * panoH / pi;

7. 老样子,双线性插值,从(U,V)周围四个点插值得到(u,v)。

这样就获取了南极点一小片区域的平面图。那如果我需要观看其他位置,我又懒地跑过去贴上去,我只用转动球就行。也就是在第5步中,对x, y, z施加一个旋转矩阵R,得到新的X, Y, Z 后再投影即可。

 

利用上述方法再也不担心跨越拼接缝的问题了,想看哪里看哪里。生成一段环视赤道的局部平面图,fov为75度,如下图所示,头好晕:

 

 

转载于:https://www.cnblogs.com/riddick/p/10258216.html

你可能感兴趣的文章
Beanutils
查看>>
FastJson
查看>>
excel4j
查看>>
Thread
查看>>
HtmlEmail
查看>>
ThreadLocal
查看>>
线程池
查看>>
XMAL 中x名称控件的Auttribute
查看>>
java笔记11-内部类
查看>>
基本数据类型
查看>>
BZOJ 1004 [HNOI2008]Cards
查看>>
[POJ 2689] Prime Distance
查看>>
[ 原创 ] Linux下查找指定类型文件以及删除
查看>>
win10环境下jdk1.8+Android Developer Tools Build: v22.3.0-887826的问题
查看>>
对于测试流程的阶段性总结
查看>>
python redis使用
查看>>
sql时间日期函数格式转换
查看>>
正则--两个匹配值相等
查看>>
跟刺猬哥一起学习设计模式【Singleton模式】
查看>>
webkit开源项目
查看>>