查看: 1151|回复: 10

osg关于飞行控制的优化问题

[复制链接]

该用户从未签到

发表于 2014-4-25 14:19:09 | 显示全部楼层 |阅读模式
做了一个飞机在earth上飞行的东西,通过左右键控制飞机的偏航和滚转,上下键控制飞机的俯仰。

并且实现这样一个效果:当没有按键时,飞机保持平飞状态,就是俯仰角和滚转角都为0.
在更新回调中实现这个效果:当按键按下时,每一帧根据按键变化一个角度,
                                       当按键弹起时,滚转和俯仰都从飞机的当前姿态转到水平状态。
效果倒是实现了,但是变化得很生硬,滚转角和俯仰角的回滚都发生得很快,感觉像是在跳变一样,
好像是因为在一帧之内完成了回滚的动作导致。

那有没有方法让回滚在多帧完成呢,或者说让回滚的实现“脱离帧”而“依赖时间”,在几秒内实现回滚。
就像在unity3D中有一个Time.deltaTime,就能让动作依赖时间而与帧速无关。osg里有这种东西吗?

表达能力有限,也不知道上面说清楚了没有。。。

该用户从未签到

发表于 2014-4-29 15:09:44 | 显示全部楼层
能得到时间的方法很多,view->getFrameStamp()->getReferenceTime()就可以

该用户从未签到

 楼主| 发表于 2014-4-30 14:00:38 | 显示全部楼层
buaahc 发表于 2014-4-29 15:09
能得到时间的方法很多,view->getFrameStamp()->getReferenceTime()就可以

不仅仅是得到时间啊,比如当捕获到“按键弹起”这样一个事件时,让飞机绕Y轴旋转10度,
我这里的效果是:按键弹起后,飞机飞快的转了10度,就想在跳变一样。
我的想法就是让这个旋转变化不要在捕获“按键弹起”事件后的一帧内就完成,而是在这一事件后1到2秒内完成旋转,
就看起来平滑一些了。

该用户从未签到

发表于 2014-4-30 14:37:54 | 显示全部楼层
把10度改的小点即可。

该用户从未签到

发表于 2014-4-30 14:44:00 | 显示全部楼层
你的意思是 按下某个键,飞机缓慢的从10度变为0?
若是这样你就要捕获时间让1s变多少度或者多少帧变1度,实现缓慢渐变过程,一个意思

该用户从未签到

 楼主| 发表于 2014-4-30 14:54:05 | 显示全部楼层
buaahc 发表于 2014-4-30 14:44
你的意思是 按下某个键,飞机缓慢的从10度变为0?
若是这样你就要捕获时间让1s变多少度或者多少帧变1度, ...

恩,就是想实现这么一个效果,没有思路。。。

该用户从未签到

发表于 2014-4-30 15:17:17 | 显示全部楼层
可以设置一个bool变量用于控制角度变化,按下某个键置为true,控制在一定时间内从10度变化为0度,变化到0度后,bool变量自动重新置为false。

该用户从未签到

 楼主| 发表于 2014-4-30 15:20:46 | 显示全部楼层
buaahc 发表于 2014-4-30 15:17
可以设置一个bool变量用于控制角度变化,按下某个键置为true,控制在一定时间内从10度变化为0度,变化到0度 ...

我的难点就是在你说的这句“控制在一定时间内从10度变化为0度”上啊,
我在看关键帧动画有关的东西了,不知道能解决问题不

该用户从未签到

发表于 2014-4-30 16:31:50 | 显示全部楼层
在漫游器的handle()里面可以得到每一帧的时间,然后在osgGA::GUIEventAdapter::FRAME施加角度控制

该用户从未签到

发表于 2014-5-13 16:27:45 | 显示全部楼层
貌似OSG里面没有直接可用的插值,你这是在Unity3D中用Lerp用习惯了哦,自己实现这个函数功能吧,就是一个插值函数。 或者你可以看看osg:uad四元数组能不能用上。

该用户从未签到

发表于 2014-5-13 16:30:33 | 显示全部楼层
osg :: Quat   里面有个球面线性插值
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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