查看: 1450|回复: 13

关于节点回调的问题!求教!

[复制链接]

该用户从未签到

发表于 2010-4-13 14:05:29 | 显示全部楼层 |阅读模式
我想在空间中渲染一群粒子(sphereshape表示),在一定规则(已经定义好的类:rbmodel)下运动,这些粒子如下在空间上画出osg::Geode* createAgents()
{

osg::ref_ptr<osg::Geode> agents = new osg::Geode;

int i;

float x,y,z,r;

//////////////////////////////////////////////////////////////////////////

for (i=0;i<NumOfFlock;i++)

{

x = rbModel.m_uTemporaryAry[i].position_x;

y = rbModel.m_uTemporaryAry[i].position_y;

r = rbModel.m_uOriginalAry[i].radii;

z = r;


        osg::ref_ptr<osg::ShapeDrawable> agent = new osg::ShapeDrawable(new osg::Sphere(osg::Vec3(x, y, z),r));

agent->setColor(osg::Vec4(1.0,0.0,1.0,1.0));



agents->addDrawable(agent.get());

}

//////////////////////////////////////////////////////////////////////////



return agents.release();
}

该用户从未签到

 楼主| 发表于 2010-4-13 14:07:02 | 显示全部楼层
想利用节点更新回调来实现粒子运动,//利用节点更新回调来产生动画class AgentsCallback : public osg::NodeCallback
{
protected:

float _x,_y,_r;

float _nx,_ny,_nr;

int i;
public:

AgentsCallback() : osg::NodeCallback(),_x(0.0),_y(0.0),_r(0.0),_nx(0.0),_ny(0.0),_nr(0.0),i(0) {}

virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)

{

osg:ositionAttitudeTransform* pat = dynamic_cast<osg::PositionAttitudeTransform*>(node);



if (pat)

{


_x = rbModel.m_uTemporaryAry[i].position_x;

_y = rbModel.m_uTemporaryAry[i].position_y;

_r = rbModel.m_uTemporaryAry[i].radii;



rbModel.SetTemporaryAry(i);




if (rbModel.m_uTemporaryAry[i].position_x<300 && rbModel.m_uTemporaryAry[i].position_y<300)

{

rbModel.ResetPos(i);

}



_nx = rbModel.m_uTemporaryAry[i].position_x;

_ny = rbModel.m_uTemporaryAry[i].position_y;

_nr = rbModel.m_uTemporaryAry[i].radii;



pat->setPosition(osg::Vec3(_nx-_x,_ny-_y,0.0));



i+=1;

}


traverse(node,nv);

}
};

该用户从未签到

 楼主| 发表于 2010-4-13 14:08:48 | 显示全部楼层
主函数如下:int main(int argc,char ** argv)
{


osg::ref_ptr<osg::Group> group = new osg::Group;


.............//其他需要画上的物体加入group节点中


osg::ref_ptr<osg:ositionAttitudeTransform> pat = new osg::PositionAttitudeTransform;

pat->addChild(createAgents());


pat->setUpdateCallback(new AgentsCallback);


group->addChild(pat);


osgViewer::Viewer viewer;

viewer.setSceneData(group.get());


return viewer.run();
}

该用户从未签到

 楼主| 发表于 2010-4-13 14:15:50 | 显示全部楼层
运行之后,出现的情况是粒子群来回动了一两下就退出程序;
调试的结果是动了一下 就跳出,说是

osgFlocking.exe 中的 0x7c94aa3d 处未处理的异常: 0xC0000005: 写入位置 0x00030fdc 时发生访问冲突

有时还会跳到文件 com***viewer 什么头文件处!

求教,告急中,望赐教!!!!!

调试 提示框

调试 提示框

该用户从未签到

发表于 2010-4-13 16:00:23 | 显示全部楼层
如果您要动态地更改节点的属性,那么请设置节点为setDataVariance(DYNAMIC)

该用户从未签到

 楼主| 发表于 2010-4-13 16:44:24 | 显示全部楼层
那您的意思是说要把createAgent()的返回节点 设置DYNAMIC吗??

该用户从未签到

 楼主| 发表于 2010-4-13 16:45:03 | 显示全部楼层
就是粒子群的那个节点设置为DYNAMIC???

该用户从未签到

 楼主| 发表于 2010-4-13 16:45:35 | 显示全部楼层
我试了?还是不行啊!望能赐教

该用户从未签到

 楼主| 发表于 2010-4-13 22:31:05 | 显示全部楼层
???!!!!

该用户从未签到

发表于 2010-4-14 08:26:57 | 显示全部楼层
pat设置为DYNAMIC,这个是必须的。除此之外您的程序还可能存在别的问题,不过我没有细看
另外顺便说一句,OSG有完整的粒子动画实现方案

该用户从未签到

 楼主| 发表于 2010-4-14 13:26:21 | 显示全部楼层
恩 ,我知道,但是OSG的粒子系统是基于Billboard的,和我的需求有点偏离,恩 多谢了,呵呵

该用户从未签到

 楼主| 发表于 2010-4-14 15:08:44 | 显示全部楼层
多谢array啊!看了《OSG编程指南》的第七章 ,知道哪儿里出问题了,就是那个拣选和绘制发生冲突产生的问题!用那个setDataVariance 已经解决,多谢!现在不会产生冲突,程序不会跳出,但是那个绘制本身并没有更新啊?不知array有什么想法建议哦??!!多谢赐教!!

该用户从未签到

发表于 2010-4-14 17:10:05 | 显示全部楼层
动态绘制几何体的方案已经在我的书《OSG三维渲染引擎设计与实践》里给出,您也可以直接到本书的资源网站去免费下载相关的代码

该用户从未签到

 楼主| 发表于 2010-4-14 18:42:19 | 显示全部楼层
好的,多谢啦!呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表