3D世界中,在计算各个物体位置的时候是以世界坐标为主的,但是最终却是所有3D模型都需要转换到视野空间中的(view space),这样才能在屏幕中显示出来。
我们可以想象3D空间中有很多模型(人物,汽车,枪等),同时也一直都存在一个摄像头,而我们就是通过这个摄像头去看我们创造的3D世界的。
这个时候,只要我们知道摄像头在3D世界中的位置,即摄像头的世界坐标,那么就可以通过位置变换操作(Transformation)计算出一个矩阵V,表示乘以这个矩阵就可以把摄像头放到需要的位置。
这个时候,只要计算矩阵V的逆矩阵(V的负一次方)用view表示,就可以把世界空间中的所有物体的位置乘以这个矩阵view,那么就是这些物体在视野空间中(view space)的相对位置了。
原理是这样的,但是到了D3D中,要求这个view matrix是有现成的函数XMMatrixLookAtLH(...),代码如下:
float x = radius*sinf(phi)*cosf(theta);
float y = radius*sinf(phi)*sinf(theta);
float z = radius*cosf(phi);
XMVECTOR camera_pos = XMVectorSet(x, y, z, 1.0f);
XMVECTOR focus_pos = XMVectorZero();
XMVECTOR up = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);
view = XMMatrixLookAtLH(camera_pos, focus_pos, up);
这个函数是根据三个参数来计算出最终的矩阵的,分别是:摄像头的位置camera_pos, 镜头聚焦点focus_pos; 和垂直方向up,一般是垂直向上。
当然其中的数学计算过程还是挺复杂的,不过了解了原理,用起这个函数就不会觉得那么神秘了,也不过是利用数学计算出一个矩阵罢了。否则我总觉得会害怕碰这些函数的,尤其是一有错的时候,就会猜测会不会这些神秘函数的问题呢?