|
各位OSG前辈:
我想在osg中在模型(比如一个正方体)的表面添加一个Text,Text的内容可以在其他函数中不断的改变。为此,定义了一个矩阵操作的更新回调。
具体的程序如下:
/***************************************************************************************
#include <osgViewer/Viewer>
#include <osg/Node>
#include <osg/Group>
#include <osgText/Text>
#include <osgText/Font>
#include <osgDB/ReadFile>
#include <osg/MatrixTransform>
#include <sstream>
#include <osg/Geode>
#include <osg/NodeCallBack>
#include <osg/Vec3f>
#include <osg/NodeVisitor>
using namespace std;
//////////////////////////////////////////////////////////////////////////////////////////////////////
osg::ref_ptr<osgText::Text> text=new osgText::Text;
osg::Vec3 position;
class MyTransformCallback : public osg::NodeCallback
{
public:
//nodevisitor可以判断出哪个是需要的结点
virtual void operator() (osg::Node* node, osg::NodeVisitor* nv)
{
//验证得到的结点是不是MatrixTransform
osg::MatrixTransform* transform = dynamic_cast<osg::MatrixTransform*>(node);
std::string gdlist="";
std:stringstream os;
position[0]=position[0]+20;
os<<"osition X: "<<position[0]; //<<" Y: "<<position[1]<<" Z: "<<position[2] ;
gdlist += os.str();
text->setText(gdlist);
//向下遍历node,以便找到transform
traverse(node,nv);
}
};
osg::Node* createHud(osgText::Text *Text)
{
osg::Group* node=new osg::Group;
osg::Geode* geode=new osg::Geode;
osg::StateSet* stateset=new osg::StateSet();
stateset->setMode(GL_LIGHTING,osg::StateAttribute::OFF); //close Light
stateset->setMode(GL_DEPTH_TEST,osg::StateAttribute::OFF); // close depth
geode->addDrawable(Text);
Text->setFont("fonts/SIMYOU.TTF");
Text->setCharacterSize(3.0f);
Text->setPosition(osg::Vec3(-20.0,-17.0,15.0));
Text->setAxisAlignment(osgText::Text::XZ_PLANE);
Text->setBackdropColor(osg::Vec4(0.5,1.0,0.7,1.0));
Text->setColor(osg::Vec4(0.0,1.0,1.0,1.0));
Text->setBackdropOffset(0.05);
Text->setCharacterSizeMode(osgText::Text::OBJECT_COORDS);
node->addChild(geode);
return node;
}
int main(int ,char**)
{
osgViewer::Viewer viewer;
osg::ref_ptr<osg::Group> root=new osg::Group;
osg::Node* node=osgDB::readNodeFile("sunSensor3.3DS");
osg::Node* node2=createHud(text.get());
root->addChild(node);
osg::MatrixTransform* mat=new osg::MatrixTransform();
mat->setUpdateCallback(new MyTransformCallback);
mat->addChild(node2);
root->addChild(mat);
viewer.setSceneData(root.get());
viewer.realize();
viewer.run();
return 0;
}
***************************************************************************************/
在1.2的平台上,这个程序是可以运行的,在模型sunSensor3.3ds的表面上Text是在不停改变的。达到了效果。
但是在2.4的平台上,编译通过,执行后,运行不了几步,就会出现错误,提示“Vs8”中的“xtree”出现了错误,“set/Map iterator incrementable”.
于是单步调试,走到回调函数virtual void operator() (osg::Node* node, osg::NodeVisitor* nv)中,走过3到5遍之后,会在 traverse(node,nv); 执行后出现这个错误,把模型换成教程里的ceep.ive,执行后没有问题。于是怀疑是不是我的模型的问题,但是发现,几乎(我)所有的3ds文件加载进去都是会有这样的问题,osg安装包内的许多osg模型也是会出现这样的问题。查baidu,认为是遍历器的问题,但是查找的时候,发现traverse是层层调用,找不到问题的所在。
那么,为什么在osg1.2中没有这样的问题,而在osg2.4中会有这样的问题呢?百思不得其解,愿论坛朋友看看。 |
-
-
test.rar
26.81 KB, 下载次数: 154, 下载积分: 威望 1
问题工程
|