这两天着手学习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();
}

  补上场景树:

大概就是这么个意思,嘿嘿!

posted on 2012-07-02 20:13  筋肉强打  阅读(1868)  评论(0编辑  收藏  举报