osg 相机坐标系

来源:互联网 发布:蓝牙聊天软件 编辑:程序博客网 时间:2024/05/18 04:57

先看这个例子:


#include <Windows.h>#include <osgViewer/Viewer>#include <osgDB/ReadFile>#include <osg/Node>int main(int argc,char** argv){osgViewer::Viewer view;view.setSceneData(osgDB::readNodeFile("cow.osg"));view.getCamera()->setProjectionMatrixAsPerspective(40.,1.,1.,100.);osg::Matrix trans;trans.makeTranslate(0.,0.,-12.);double angle(0.0);while (!view.done()){osg::Matrix rot;rot.makeRotate(angle,osg::Vec3(1.0,0.,0.));angle+=0.01;view.getCamera()->setViewMatrix(rot*trans);view.frame();}return 0;}


1、程序执行结果:
将相机设置到世界坐标系(0,0,12)的位置,向下看牛。同时,牛绕着x轴自传。

2、解说:
相机坐标系,和OpenGL的相机坐标系一致,+x:向右,+y:向上,+z:向前(向屏幕内部),

执行trans.makeTranslate(0.,0.,-12.);相当于讲像机从(0,0,0)移到(0,0,12)位置

(其实,也可以理解为:视图矩阵,就是相机在三维世界中,从原点变换到观察点所经过的变换矩阵的逆矩阵,

这样完全不用考虑相机坐标系,其实也不存在这一说法,说相机坐标系,只是为了便于理解),

这样正好可以看到牛。

3、为何效果是俯瞰牛呢,因为osg的世界坐标系是使用+z向上建模的。

执行rot.makeRotate(angle,osg::Vec3(1.0,0.,0.));相当说牛处在世界坐标系原来的位置(0,0,0),
相机自己绕着(1,0,0)轴,以12单位长度进行圆周旋转运动。

4、关于osg的坐标系,指的是世界坐标系,而此处操作的是视图坐标系(相机坐标系,是世界坐标系的逆)

5、不要将相机问题同以下概念混淆:OSG坐标相当于OpenGL坐标系绕X轴正向逆时针旋转90度。

其他链接:

1、http://blog.csdn.net/cccstudyer/article/details/44994883