|
v->push_back( osg::Vec3( -1.f, 0.f, -1.f ) );
v->push_back( osg::Vec3( 1.f, 0.f, -1.f ) );
v->push_back( osg::Vec3( 1.f, 0.f, 1.f ) );
v->push_back( osg::Vec3( -1.f, 0.f, 1.f ) );
这是一个快速入门上面第一个例子的部分代码,将其中的顶点坐标取值和OpenGL中的相应顶点取值比较可以猜测OSG的
坐标系统是X向右,Y向屏幕外,Z向上,也就是说OSG的坐标系统与OpenGL中的Y,Z互换了,不知道是不是这样的,我问一些网友说是这样的,但是我始终找不到官方的资料说这坐标问题,所以很疑惑。
今天看快速入门最后一章一个例子时又产生了疑惑,代码如下
osgViewer::Viewer viewer;
viewer.setSceneData( osgDB::readNodeFile( "cow.osg" ) );
viewer.getCamera()->setProjectionMatrixAsPerspective( 40., 1., 1., 100. );
// 创建矩阵,指定到视点的距离。
osg::Matrix trans;
trans.makeTranslate( 0., 0., -12. );
// 旋转一定角度(弧度值)。
double angle( 0. );
while (!viewer.done())
{
// 创建旋转矩阵。
osg::Matrix rot;
rot.makeRotate( angle, osg::Vec3( 1., 0., 0. ) );
angle += 0.01;
// 设置视口矩阵(旋转矩阵和平移矩阵连乘)。
viewer.getCamera()->setViewMatrix( rot * trans );
// 绘制下一帧
viewer.frame();
}
这里感到疑惑之一是trans.makeTranslate( 0., 0., -12. );
为什么这里改变Z的坐标,那么按照我上面的OSG坐标来说的话,这里是将相机向下移动了12个单位吧,为什么不是改变Y的坐标呢,难道视点不是指向Y的吗?
rot.makeRotate( angle, osg::Vec3( 1., 0., 0. ) );
这里也是,当我改为rot.makeRotate( angle, osg::Vec3( 0.,1., 0. ) );时牛不是沿Y旋转而是沿Z旋转
所以我现在得出的结论是写顶点坐标时,OSG的Y,Z坐标和OpenGL相反,而写矩阵时又和OpenGL一致,我想应该不至于这样吧,但是一直找不到相关的资料,希望高手解惑!!! |
|