3D游戏中的数学基础

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Lunar_lty/article/details/65441954



    一般的3D游戏都包括有摄像头,投影,粒子特效,动画特效,光照等技术,这里的技术大多涉及到坐标系的变换,本文就主要应用的数学知识作一个归纳总结。


0. 为什么要有转换(transform)

所谓的3D游戏并不是真实的3D游戏,其实质是将真实世界中的3D投影(projection)到2D屏幕,再投影到视网膜,被人类所感知。将3D对象投射到2D,就需要用到transform。为了计算方便,3D游戏通常用4x4的矩阵来表示这种转换。


1. model view transform

(1). 对模型的转换,最简单的莫过于沿坐标轴平移,扩大/缩小,在3D游戏里,以1x4矩阵V=[x, y, z, w]为例(w通常=1)。例如分别沿x轴平移xn个单位,沿y轴平移yn个单位,沿z轴平移zn个单位的变换矩阵M为

[ 1   0   0   0 ]

[ 0   1   0   0 ]

[ 0   0   1   0 ]

[ xn yn  zn  1 ]

变换后的坐标V' = V x M

略复杂一点的就是绕坐标轴旋转,将一个点(x,y,z)绕x轴旋转θ角度的矩阵Rx(θ):

[1  0         0        0]

[0  cosθ   sinθ   0]

[0  -sinθ   cosθ  0]

[0  0         0        1]


这个公式很好推导,这里就不详述了。另外,绕其它轴旋转的矩阵Ry(θ):

[cosθ   0      -sinθ        0]

[0         1        0             0]

[sinθ    0       cosθ        0]

[0         0             0        1]


绕z轴旋转矩阵Rz(θ) =

[cosθ   sinθ   0  0]

[-sinθ   cosθ  0  0]

[0         0        1  0]

[0         0        0  1]


(2). 比例变换矩阵

将一个点沿x,y,z分别放大Kx,Ky,Kz倍,该变换矩阵为:

[Kx  0    0    0]

[0    Ky  0    0]

[0    0    Kz  0]

[0    0    0    1]

它是一个简单的对角矩阵。


(3). 绕3D空间中的任意轴旋转

公式较前者要复杂,这里给出推导步骤。

如上图,n为经过坐标轴原点的任意单位向量,已知v和n,求v绕n旋转θ角后vector v'的表达公式

1). 将v切分为vII和v⊥,其中vII平行于n,v⊥垂直于n,然后令n,v为面S,作w垂直于S,易证n垂直于w和v⊥构成的平面P。

vector v绕n旋转θ的结果,即是v⊥在P上绕图中所标方向旋转θ。

v' = vII + v⊥',其中


v⊥= v - vII,vII即是v在n上的投影,


至于w,则是垂直于S平面,w=n x v,易知w长度和v'相等。

令p=[1,0,0],v在x的分量=p,代入上面公式可得


同理,令q=[0,1,0], r=[0,0,1],可得:


最后,合并p',q',r'得到旋转矩阵为:



2. projection transform

投影变换,简言之,就是游戏中的实体已经摄像头的位置全部设定好,现在设定可视范围以确定哪些需要投影到屏幕,例如视野180°的情况下,背对摄像头的部分是不该看到的。另外,根据肉眼成像原理,距离越远的物体看起来越小,也由projection transform来完成。

projection一般有两种:

(1). Orthographic projection 正交投影,又称parallel projection

一般用在2D游戏中很多,它不会因为距离的远近而改变实体投影的大小,下面的铁路和小树林看起来是这样子的:


(2). perspective projection

一般用在3D游戏中,它更接近于真实世界,会因为距离的远近而改变实体投影的大小。

和上图中同样的铁路和小树林,就变成了这样:



猜你喜欢

转载自blog.csdn.net/Lunar_lty/article/details/65441954