这一切的前提是你的模型以(0.0,0.0,0.0)为中心
想象你的模型被一个球包裹住了
如上图所示,从球心向外发出的半径射线能够过交模型上一点,同时交球面上一点,也就是模型上的点可以和球面上的点一一对应,只要按照球面上纹理坐标的指定方式为模型上每个点指定纹理就行了。
纹理坐标
假设上面是你的图片,那么OpenGL的纹理坐标范围是上面那种(0,0)-(1,1)的,你要把这样一个图片铺在一个球上,要为球面上的点指定纹理坐标。
glTexCoo……
好了我忘记了哪个函数了。
怎么指定球面的(u,v)纹理坐标呢?
想象你的球像经线和纬线那样
很明显,纬线上的点纹理坐标的y值是相同的,经线上的点纹理坐标的x是相同的。
先来看v
一条纬线在一个球上是圆的,上面每一个点都有(x,y,z)坐标,怎么样才能用各自的x,y,z 映射出一个从 0 - 1的纹理v呢?
北极点的位置纹理应当设为0.0,南极点设为1.0那么用下面的式子就可以了
v = 0.5*(1- z/sqrt(x^2+y^2+z^2))
这样就可以满足纹理坐标v 从北纬0度到南纬0度递增,而且范围正确。
现在到u
纹理坐标的u,上面图已经告诉你每一条经线上的u都要是一样的在模型坐标中,每一条经线上的x、y的比值是一样的!!!那么契机来了。
需要把它而分成8个部分,每个部分使用它前面那个确定了的u值加上 0.125*(以某种方式确定的从0到1的范围很明显这是可以用,模型坐标x/y或者y/x来表示)例如:0.0 - 0.125 区间的u=0.0+0.125*y/x
好了大致就是这样的,最终纹理坐标的u值使用模型坐标x,y的比值映射出来,纹理的v使用模型坐标的z/sqrt(……)映射出来