您的位置:首页 > 运维架构

OpenSceneGraph几个重要功能节点练习

2010-12-26 02:11 411 查看
一. 空间变换节点

空间变换中最重要的是坐标系和矩阵运算了。OSG坐标系中使用右手系,Z轴垂直向上,X轴水平向右,Y轴垂直屏幕向里,与OpenGL和DirectX都不同。
相关缩放、旋转和平移主要由osg::Matrix, osg::Vec3, osg::Quat几个类来完成。
局部坐标系向世界坐标系转换规则是:设在局部坐标系下顶点 V 转换成世界坐标系坐标 V':
    V' = V * Mn* Mn-1*……* M3* M2* M1* M0

其中M0到Mn一次为各个矩阵变换。从世界坐标系坐标下顶点 V' 转换成局部坐标系 V:
    V = V' * M0-1 * M1-1 * M2-1 * M3-1 *……* Mn-1-1 * Mn-1

对于空间变换而言,无论是OpenGL,DirectX还是OSG,一般都会遵守SRT(Scale/Rotate/Translate)的运算顺序来完成符合矩阵的构建:
其公式为:

    M =Ms * Mr * Mt

osg::MatrixTransform, osg::PositionAttitudeTransform, osg::AutoTransform 示例:

代码

[code] #include <osg/ProxyNode>
#include <osgDB/ReadFile>
#include <osg/ArgumentParser>
#include <osgViewer/Viewer>
#include <osg/Notify>
#include <iostream>

#pragma comment(lib, "osgd.lib")
#pragma comment(lib, "osgDBd.lib")
#pragma comment(lib, "osgViewerd.lib")

int main(int argc, char** argv)
{
osg::ArgumentParser argument(&argc, argv);
osg::ref_ptr<osg::ProxyNode> pn = new osg::ProxyNode();
unsigned int num = 0;

for(int i = 1; i < argument.argc(); i++)
{
if( argument.isString(i) )
{
std::cout << num << ":  " << argument[i] << "\n" ;
pn->setFileName( num++, argument[i] );
}
}
if( !pn->getNumFileNames() )
pn->setFileName(0, "cow.osg" );

osgViewer::Viewer viewer;
viewer.setSceneData( pn.get() );
return viewer.run();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: