最近在研究图形球面化,网上查找到的信息很少,也许大家都藏着掖着,找到一些所谓的模型得到效果都不尽人意,其中找到一个是《微型机与应用》2001年第5期《球面化算法的研究》的论文按照它映射函数得到的效果实在是不尽人意,看来还是得自己去努力了。
对一张图形的一个圆形区域进行球化处理,形成PhotoShop 滤镜->扭曲->球面化的效果
如下所示
原图:(径为R)
球面化之后:
原图点A经过球面化之后变换到了A’的位置,那么点A和点A’是怎么变换的呢?
对比分析可以看出原图点A是沿原图半径方向变换到了A’的位置,其实一个圆形球面化是将圆形内的点均匀的向外扩展成一个球形。即以圆形的边为赤道,圆心为北极点的半球体,过球面的点A,点A’,北极点,赤道的圆心(即原图的圆心)得到一个切面如下图所示:
∵原图的点均匀扩展的 (意识到这点很重要):
∴2R->πR, 即得到扩展系数k=(πR)/(2R)= π/ 2
则L = OA * k
α = L / R
OA’ = sin(α) * R = sin((π*OA)/(2*R))*R
有上面的转换公式我们可以对点A(x, y)球面化之后的新位置A’(x’,y’)进行推导了.设圆心为O(0, 0)
OA = sqrt(x *x + y*y)
OA’ =sin((π*OA)/(2*R))*R
OA , OA’与x轴的夹角β= atan(y/x)-----(注意到x <= 0的情况)
x’ = cos(β) * OA’
y’ = sin(β) * OA’
最终结果为:
x’ = cos(atan(y/x)) * sin((π*sqrt(x*x +y*y)) / (2*R)) * R
y’ = sin(atan(y/x)) * sin((π*sqrt(x*x +y*y)) / (2*R)) * R
这两个式子有木有化简的形式?忘了,有空得问问高中数学老师了。
经测试生成的图像与Photoshop的球面化滤镜效果一致,但是球面化的过程会导致像素的丢失,需要用到图形的插值算法(正在研究中------J)。
测试的代码已经上传,在我的共享资源-http://download.csdn.net/detail/xeral/3487473-旋转地球 屏保,得到效果与Photoshop效果一致,呵呵。