1.一种三维应用程序中的凸面镜效果的模拟方法,其特征在于包括如下步骤:
(1)过观察位置向镜平面引一条垂线,并延长,在延长线的另一端找到和观察位置与平面距离间距相同的点,计算得到观察位置关于镜平面的对称位置,已知:观察位置C的坐标为(xc,yc,zc),镜平面m方程为Ax+By+Cz+D=0,C关于m的对称点位置C′通过下式计算:
其中,A,B,C,D是平面方程的四个参数;
(2)在上述镜象对称位置的基础上产生了与原视景体参数完全相同新的镜像视景体,通过该镜像视景体就能将场景图象映射到观察平面成为场景图像,镜像视景体和原视景体关于镜平面对称;
(3)通过上述镜像视景体渲染整个场景,根据上述镜像视景体的设置参数计算出对应的投影矩阵,渲染结果是将场景物体上的点投影到观察平面上,这过程中还会在剪裁窗口对投影结果进行剪裁,剪裁结果作为结果图像,用于下一步的纹理映射;通过上述镜像视景体进行渲染的过程中利用裁减窗口进行裁减时,若上述镜像视景体不是对称视景体,则裁减窗口也不是对称的;
(4)再根据镜面范围将应该出现在镜面中的场景图像通过纹理映射到镜面上,首先在镜像视点C′基础上计算出新的模型视点矩阵MModelView,然后计算出与镜像视景体对应的投影变换矩阵Mpers,已知一个对称的视景体的参数如下:视点距观察平面的距离为-zvp、剪裁窗口的长宽,投影变换矩阵Mpers表示为
其中sz,tz是对z坐标投影值进行规范化的比例和平移因子,投影变换在以镜像观察位置为原点,镜像观察方向为z轴正方向的标准坐标系下进行,计算得到的投影变换矩阵形式只和镜像观察位置与镜像观察平面的距离有关,长宽对投影变换矩阵没有影响,用于限制剪裁窗口的范围,再将上述两个矩阵相乘合并得到反射变换矩阵Mreflect:
Mreflect=Mpers·MModelView 3
接下来,利用反射变换矩阵可以计算出镜面上任意一点户P(x,y,z,l)在观察平面上的坐标通过首先对户点做透视变换得到P′(x,y,z,h):
P′=Mreflect·P 4
再对P′做透视除:
UV=P′(x,y)/h 5
其中h是P′的齐次坐标项,UV是初步的纹理坐标。当镜面位于视景体中时,镜面上点经过上述反射变换之后一定会出现在剪裁窗口中,按照剪裁窗口的大小规范化后成为0~1之间的数,再利用凸面镜的表面法线对纹理坐标进行修正:
其中UVfinal是最终的纹理坐标值,f是二维向量(x,y),其中x,y均为-1~1之间的浮点数,为镜面上一点的表面法线,当镜面为平面时
(5)已知表面曲面方程f(x,y),上述步骤所述凸面镜表面法线的计算通过下式进行:
其中,x,y∈D,D是二维区域,在该二维区域基础上将表面划分为网格,逐网格点计算出对应的法向量,所述凸面镜表面法线的计算是通过脚本离线而不是实时进行的,对所有上述网格点,将其x,y坐标代入式7,计算得到与该网格点对应的表面法线,结果保存在文件中供驾驶模拟机或三维应用程序使用。