VPM矩阵
1、V 表示摄像机的观察矩阵(View Matrix),它的作用是把对象从世界坐标系变换到摄像机坐标系。因此,对于世界坐标系下的坐标值 worldCoord(x0, y0, z0),如果希望使用观察矩阵 VM 将其变换为摄像机相对坐标系下的坐标值 localCoord(x’, y’, z’),则有:
localCoord = worldCoord * VM
此外,观察矩阵可以理解为“摄像机在世界坐标系下的变换矩阵的逆矩阵”,因此 Camera类也专门提供了 getInverseViewMatrix 这样一个函数,它的实际意义是表示摄像机在世界坐标系下的位置。
2、P 表示投影矩阵(Projection Matrix),当我们使用 setProjectionMatrixAsPerspective之类的函数设置摄像机的投影矩阵时,我们相当于创建了一个视截锥体,并尝试把包含在其中的场景对象投影到镜头平面上来。如果投影矩阵为 PM,而得到的投影坐标为 projCoord(x”,y”, 0)的话,那么:
projCoord = localCoord * PM
3、W 表示视口矩阵(Window Matrix),它负责把投影坐标变换到指定的二维视口中去,对于视口矩阵 WM,通过下面的公式可以得到最终的窗口坐标 windowCoord(x, y, 0):
windowCoord = projCoord * WM
将所有的公式整合之后,得到:
windowCoord = worldCoord * VM * PM * WM
而这个所谓的窗口坐标 windowCoord,实际上也就是世界坐标系下的坐标值 worldCoord在指定的摄像机视口中(也就是我们的屏幕上)对应的平面位置。怎么样,不知不觉中,我们已经实现了 gluProject 函数所完成的功能了,而反转这三个步骤就可以得到视口中指定位置所对应的世界坐标了(也就是 gluUnProject 的工作)。
CheckEvent与takeEvents
上一节我们遗漏了GraphicsWindowWin32::checkEvents和osgGA::EventQueue::takeEvents的关系。我们现在来讲解一下。先看一下checkEvents函数,这个函数的内容对于熟悉 Win32 SDK 编程的朋友一定非常熟