osg视图VPW矩阵变换总结

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 的工作)。
上面那么一大段论述对于精通数学的您来说可能是废话,不过能够了解OpenGL 函数
gluProject 和gluUnProject 的原理(它们其实就是这样实现的,信不信由你),相信我们还是有所斩获的。好了,折腾了这么久,总算明白了VPW 矩阵的概念,那么代码中这一段也就很好理解了:

osg::Matrix masterCameraVPW =
getCamera()->getViewMatrix() * getCamera()->getProjectionMatrix();
if (getCamera()->getViewport())
{
	osg::Viewport* viewport = getCamera()->getViewport();
	masterCameraVPW *= viewport->computeWindowMatrix();
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值