先看这个例子:
#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;
}
将相机设置到世界坐标系(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度。
其他链接: