VR播放器的简单原理
一个VR视频如果不使用特殊的播放器,那么播放出来的效果看上去是一个拉伸的长条形图片拼成的视频。
之所以Vr视频能让人有身处其中的感觉,是因为观看时人的视角处于VR视频空间中,而不是看到一个二维平面,因此就需要将本身的全景二维图,投影到一个立体的空间——立方体or球形。
简单球面纹理映射讲解
实现球面纹理映射有两种方法,一种是使用顶点的法向量来生成纹理坐标,另一个是使用顶点的位置向量来生成纹理坐标。
想象一个球体,球面上每一个点的法向量,可以是从球心起到该点的线段距离。球上每一点都可以视作一个无限小的平面。
Ps:法向量——垂直于平面的向量,叫做该平面的法向量
问题的本质是根据球面上每个点的法向量坐标生成对应的纹理坐标,请看下图,下图中外部的方框表示二维纹理坐标,其范围是(u,v)min = (0,0)
, (u,v)max = (1,1)
,中间的圆形表示球面法向量坐标,其x,y分量的范围是(x,y)min = (-1,-1), (x,y)max = (1,1)
。
所以问题的本质变成了两组坐标的映射,也即将区间(x,y)min - (x,y)max
映射到区间(u,v)min - (u,v)max
。这里我们使用反正弦函数y = acrsin(x)
来实现。先看一下它的函数图象。
由这个图象知,它的定义域x = (-1,1)
,值域是y = (-pi / 2, pi / 2)
。我们稍作变型,得到下面两个公式。正好完成了由(-1, 1)到(0, 1)的映射。这里tu表示纹理的x坐标,tv表示纹理的y坐标,Nx表示顶点法向量的x轴分量,Ny表示顶点法向量的y轴分量。
1 | tu = arcsin(Nx) / PI + 0.5 |