这两天着手学习OSG,因为看过一些VP的资料,所以看起来还好,不是很费力,但很多地方还是不得要领,今天想把这两天看的东西做个小的demo出来,结果撞了一下午的墙,主要还是在坐标系上出了问题。我的参考资料主要是《OpenSceneGraph 三维渲染引擎编程指南》 。好吧,下面是我的想法,我想在一个Terrain上添加一个cow,但是cow是浮在空中的,虽然我知道应该是地形的世界坐标出了问题,但是我想到了这样一个问题,在使用Vega prime 的时候,它的坐标是相对的,也即是说, 如果cow是Terrain的子节点,那么cow的坐标是相对与Terrain的,在OSG是否也是这样呢?进行了下验证,果然如我所料,虽然在这个过程中出了不少的问题,都是自己粗心,谨记谨记!上代码:
#include "stdafx.h" #include <osgDB/ReadFile> #include <osgViewer/Viewer> #include <osg/Node> #include <osg/MatrixTransform> void main() { osgViewer::Viewer viewer; osg::ref_ptr<osg::Group> root = new osg::Group; osg::ref_ptr<osg::Node> cow = new osg::Node; osg::ref_ptr<osg::Node> terrain = new osg::Node; osg::ref_ptr<osg::MatrixTransform> cowPos = new osg::MatrixTransform; osg::ref_ptr<osg::MatrixTransform> terrainPos = new osg::MatrixTransform; /* osg::Matrix t; t.makeTranslate(osg::Vec3(0,0,0)); trans2->setMatrix(t); trans->setMatrix(t); terrain = osgDB::readNodeFile("LZ.OSG"); trans2->addChild(terrain);*/ osg::Matrix t1; t1.makeTranslate(osg::Vec3(0,0,200)); cowPos->setMatrix(t1); osg::Matrix t2; t2.makeTranslate(osg::Vec3(0,0,0)); cowPos->setMatrix(t1); terrain = osgDB::readNodeFile("LZ.OSG"); cow = osgDB::readNodeFile("cow.osg"); cowPos->addChild(cow); terrainPos->setMatrix(t2); terrainPos->addChild(terrain); terrainPos->addChild(cowPos); //root->addChild(trans); root->addChild(terrainPos); viewer.setSceneData(root.get()); //viewer.addEventHandler(new UseEventHandler(trans)); viewer.realize(); viewer.run(); }
补上场景树:
大概就是这么个意思,嘿嘿!