原文地址:http://www.cnblogs.com/xiaocainiao2hao/p/5619944.html
1、世界坐标
世界坐标系描述的是整个场景中所有的对象,可以理解为绝对坐标系,所有对象的位置都是绝对坐标。从整体上考虑,它为所有对象的位置提供一个绝对的参考标准,从而避免了物体之间由于独立的物体坐标系而导致的坐标系混乱。
2、物体坐标系
每一个物体都有自己的坐标系,当物体发生交换时,实际上是它本身的坐标系相对于世界坐标系发生变换的过程。
物体坐标系通常描述的问题是特定物体的内部对象,主要包括物体的顶点,物体的法向量和物体的方向。
3、摄像机坐标系
摄像机坐标系与屏幕坐标系类似,只不过摄像机坐标系位于3D空间,而屏幕坐标系位于2D空间。
OSG的坐标系:X正方向向右,Y正方向朝里,Z正方向朝上。
*****坐标系变换*****
物体坐标系->世界坐标系
世界坐标系->物理坐标系
屏幕坐标系->世界坐标系
osgUtil::SceneView::projectWindowIntoObject
//或者自己运算
Matrix VPW = camera->getViewMatrix() * camera->getProjectionMatrix() * camera->getViewport()->computeWindowMatrix();
Matrix inverseVPW = Matrix::inverse(VPW);
Vec3d world = window * inverseVPW;
世界坐标系->屏幕坐标系
osgUtil::SceneView::projectObjectIntoWindow
//或者自己运算
Matrix VPW = camera->getViewMatrix() * camera->getProjectionMatrix() * camera->getViewport()->computeWindowMatrix();
Vec3 window = world * VPW;
OSG中有多个坐标系,我们通过鼠标点击获得的只是屏幕坐标,我们往往需要在场景中添加东西时,都需要得到某个点的世界坐标才能比较好操作:
但是在我们知道是哪个节点的情况下,我们可以根据:
geode->getBound().center() * osg::computeLocalToWorld(geode->getParentalNodePaths()[0])
来获得节点geode的世界坐标。
浙公网安备 33010602011771号