|
本帖最后由 libei278214081 于 2014-5-29 16:46 编辑
Array每次都能回答我的问题,希望也能帮我解决下面的问题,有点长,谢谢了
还是那个问题:
问题描述:我想画一个圆柱把人的骨架给包围住,人动的时候圆柱和跟着动。
于是:
我在person这个类的构造函数中,初始化了一个group节点,下面挂接14个matrixtransform节点,每个matrixtransform节点下面再挂接了1个geode节点,每个geode节点下面各自挂接了osg里带的圆柱体:
for ( int i = 0 ; i < 14 ; i++ )
{
osg::ref_ptr <osg::Cylinder> cylinder = new osg::Cylinder(osg::Vec3(0.0,0.0,0.0),0.01,0.5);
osg::ref_ptr <osg::ShapeDrawable> dcylinder = new osg::ShapeDrawable(cylinder);
mdpt_geode->addDrawable(dcylinder);
//接着下面是把节点addchild到上一级节点
}
然后我写了一个更新的矩阵的方法,是在回调函数调用的,每次求得变换矩阵,就调用更新的操作
osg::MatrixTransform *u_mt = dynamic_cast<osg::MatrixTransform *>(mPerson -> getChild(i));
u_mt -> setMatrix(u_m);
}
updatePerson(mPerson,h0); //更新操作
接下来是更新,我想变化圆柱体的参数,于是我从新求了一次它的中点和两个相连节点的距离,然后通过set方法重新设置了参数
for ( int i = 0 ; i < 14 ; i++ )
{
((osg::Cylinder*)(mOSG->getNodeByName(mPerson,geoname)-> asGeode()
-> getDrawable(0) -> getShape()))->set(middlePoint,0.1,distance);
}
现在有2个问题:
1、不知道上面的步骤有没有错,听Array大神说在更新操作里加dirtybound?
2、第二个关键问题是,为了不想初始化时候让别人看到圆柱,等有新数据,我才显示数据。于是,构造函数里,我根节点设置了setnodemask(0),这样确实是调用了更新操作,但是结果不对,大小可以变,长度可以变,但是中心点不对,难道是因为setnodemask(0)不应该放在构造函数里吗,如果我setnodemask(1)的话,结果是只调用了构造函数的初始化的圆柱体,而修改的圆柱体是不改变的,包括大小,中心点,距离啊。
怎么求解。。。 |
|