1,
相机开始往下朝向Z轴,可以看到相机的坐标系可能和世界坐标系一致(上面的图)。但是顺时针旋转45度之后,也可能不一样了(下面的图)。
所以事实上同时会有两个坐标系。有一个定义物体位置的世界坐标系,还有一个和相机的三个轴线(相机的目标朝向,上,右)一致的相机坐标系。
这两个坐标系叫做‘世界空间‘和‘相机/视角空间‘。
绿球位于世界空间的(0,y,z)位置,而在相机空间中它位于相机坐标系的左上方的象限内(X为负,Z为正),
我们需要找到球在相机空间的位置(世界坐标系转到相机坐标系)。
然后我们就可以不管世界空间只需要考虑在相机空间中了。在相机空间中相机位于原点并朝向Z轴的方向。可以相对于相机定义物体的位置,并使用我们学过的方法来渲染它。
事实上,相机顺时针旋转45度等同于绿球绕相机逆时针旋转45度。物体的运动总是和相机的运动相反。所以一般情况下,我们需要添加两个新的变换矩阵并把它们加入到我们的管线类中。
对于相机的旋转变换,我们需要在保持物体和相机距离不变的情况下移动物体(也就是绕相机中心在一个球面范围上移动了,相机中心位于原点),同时物体的实际移动方向和相机旋转的方向是相反的,对于相机的平移变换也一样的道理。
(1). 移动相机很简单,如果相机从原点移动到(x,y,z),那么相应物体的变换矩阵就应该是(-x,-y,-z)。原因很简单:相机从原点按照向量(x,y,z)平移,所以然后再将相机移回原点同时又保证和物体相对位置不变的话,那么物体就要按照相反的方向向量(-x-y-z)进行平移。对应的变换矩阵如下:
(2).然后是旋转相机朝向世界坐标系中定义的一些物体。我们想找到旋转后顶点在相机定义的坐标系中的位置,所以实际的问题是:我们如何将坐标从一个坐标系转换到另一个坐标系?再看下图,我们可以说世界坐标系是由三个线性独立的单位向量:(1,0,0),(0,1,0)和(0,0,1)定义的。线性独立意味着我们找不到三个不是全为0的x,y,z值使得x*(1,0,0) + y*(0,1,0) + z*(0,0,1) = (0,0,0),从集合的角度,就是说任意两个单位向量所在的平面和第三个向量垂直(平面XY和Z轴垂直等等)。可以很容易看出,图中的相机坐标系是由(1,0,-1),(0,1,0),(1,0,1)三个向量定义的。单位化这些向量之后我们得到:(0.7071,0,-0.7071),(0,1,0)和(0.7071,0,0.7071)。cos45 = 0.7071
2,
使用UVN相机系统表示相机的朝向。它使用三个相互垂直的向量来表示相机的朝向:
1) 相机注视目标方向的向量N
2) 相机的上方向向量V
3) 相机的右方向向量U
UVN来表示方向有什么好处呢?首先,我们如果想让相机跟踪某个点来拍摄的话,这种方式无疑要比每次去计算欧拉旋转角好很多。比如第三人称视角的游戏,一般都是以玩家为注视点。
为了将世界空间中的位置转换到相机空间中用UVN向量定义,我们需要将位置向量和UVN向量进行点积操作
3,
Cross:两个向量的差积计算可以得到一个和这两个向量所在平面垂直的向量。
Normalize:将向量转换成单位长度。
U = U.Cross(N)确保UN垂直
V = N.Cross(U)得到up向量。
4,
5,
//默认视角从原点朝Z轴正方向,如果worldpos.z <= 0 是被裁剪掉看不见的。
//由于相机Z轴位置设为-5,物体可以放在Z轴大于-5的区间被看见。
//所以worldpos.z也能看见了。
原文:http://www.cnblogs.com/liuhan333/p/6359787.html