查看: 5553|回复: 15

OSG 和 3Dmax

[复制链接]

该用户从未签到

发表于 2008-5-6 15:37:25 | 显示全部楼层 |阅读模式
大家好,我现在有一个在3dmax中实现的序列帧动画,然后直接导出为osg文件,我想在osg中用鼠标控制这个动画的开始和结束,就是我怎么能触发它的开始??那位高手知道,请指点一下!非常感谢!我的QQ:373205199

该用户从未签到

发表于 2008-5-6 16:22:33 | 显示全部楼层
关注

[ 本帖最后由 wontor 于 2008-5-6 16:23 编辑 ]

该用户从未签到

发表于 2008-5-6 18:52:22 | 显示全部楼层
我想在osg中用鼠标控制这个动画的开始和结束




不太明白你的意思~~~~~鼠标单击开始,再单击就结束???????


该用户从未签到

发表于 2008-5-6 22:53:13 | 显示全部楼层
您可以参考一下3dsmax导出的.osg文件格式(建议使用osgExp,下面列出的节点结构也是使用这个插件导出的),例如,最简单的让一个正方体沿X轴运动的场景,对应的.osg文件内容大致是这样的:

ROOT(MatrixTransform节点)
-- Box01(MatrixTransform节点)
------ UpdateCallbacks
---------- AnimationPathCallback(内含所有的动画控制点ControlPoint)
------ Box01-GEODE(Geode节点)
---------- Geometry对象(内含顶点和法线坐标数据)

可见,如果我们能够取得这个正方体对象的AnimationPathCallback,也就可以根据自己的意愿来自由控制物体的动画。例如,使用AnimationPathCallback::setAnimationPath 重新设置路径点,使用reset重新开始动画,使用setPause(bool)暂停或继续动画等等,或者还可以使用getAnimationPath->setLoopMode等函数来详细设置动画路径的相关属性(循环次数,速度等)
取得AnimationPathCallback的方法有很多,关键是在3dsmax中为对应的运动物体取好名字。例如我们可以在一个复杂场景中,遍历并找到名为“Box01”的对象,并使用getUpdateCallback获得其AnimationPathCallback,进而进行控制

该用户从未签到

发表于 2008-5-7 10:32:00 | 显示全部楼层

关注

谢谢王锐.我也挺关注动画控制的.

该用户从未签到

发表于 2008-5-7 12:45:33 | 显示全部楼层
osg::Node* node = osgDB::readNodeFile("model.osg");

osg::Group* group = dynamic_cast<osg::Group*>(node);//

osg::AnimationPathCallback* animPathCallback1 = new osg::AnimationPathCallback();

for (unsigned int i=0;i < (group->getNumChildren());i++)
{
if (group->getChild(i)->getName() == "Node you looking for")
{
if (dynamic_cast<osg::AnimationPathCallback*> (group->getChild(i)->getUpdateCallback()))
{
animPathCallback1 = dynamic_cast<osg::AnimationPathCallback*> (group->getChild(i)->getUpdateCallback());//取到动画属性
animPathCallback1->setPause(true);//动画暂停

}

}
}


这是我以前实现的一些代码~~~~~~~~~~~~~

该用户从未签到

发表于 2008-5-7 18:14:25 | 显示全部楼层
3DVRI公司的VRLIFE产品中有事件触发的功能,可以参考一下,他是使用LUA脚本来实现的;
还比较方便;

该用户从未签到

发表于 2008-5-14 10:26:24 | 显示全部楼层

回复 6楼 的帖子

FlySky:你的程序我试了下只能让动画暂停啊,点击播放的那段呢?

该用户从未签到

发表于 2008-5-14 10:30:41 | 显示全部楼层
回复 6楼 的帖子
FlySky:你的程序我试了下只能让动画暂停啊,点击播放的那段呢


设置setPause(false),,,就可以重新开始了

该用户从未签到

发表于 2010-11-17 22:52:56 | 显示全部楼层
4# array

但是我的文件是 Geode在updatecallback前面,如果按照

osg::Node* node = osgDB::readNodeFile("model.osg");

osg::Group* group = dynamic_cast<osg::Group*>(node);//

osg::AnimationPathCallback* animPathCallback1 = new osg::AnimationPathCallback();

for (unsigned int i=0;i < (group->getNumChildren());i++)
{
if (group->getChild(i)->getName() == "Node you looking for")
{
if (dynamic_cast<osg::AnimationPathCallback*> (group->getChild(i)->getUpdateCallback()))
{
animPathCallback1 = dynamic_cast<osg::AnimationPathCallback*> (group->getChild(i)->getUpdateCallback());//取到动画属性
animPathCallback1->setPause(true);//动画暂停

}

}
}

的读法会出错,我手动把他们的位置调整后,读是可以读了,但是texture出错了

该用户从未签到

发表于 2010-11-19 08:24:14 | 显示全部楼层
您需要确认animPathCallback1是否真的存在

该用户从未签到

发表于 2010-11-19 12:48:05 | 显示全部楼层
很有用啊~

该用户从未签到

发表于 2010-11-25 07:43:34 | 显示全部楼层
这个要打印收藏。

该用户从未签到

发表于 2010-11-25 10:17:09 | 显示全部楼层
利用OSG文件的方式保存数据,是一种很方便的策略。很好用,值得推广!

该用户从未签到

发表于 2010-12-10 11:27:49 | 显示全部楼层
有能安装在3dmax里的导出插件吗?

该用户从未签到

发表于 2010-12-13 10:32:18 | 显示全部楼层
osgExp
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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