Ogre角色控制

6 篇文章 0 订阅

     来源于 : http://flyingpig.isgreat.org/ogre-character-control

 

 

     最近研究了下Ogre的角色控制, 看了Ogre1.7 Character的例子, 这里对角色控制做一些总结, 写的不是很专业O(∩_∩)O~.

      一般的角色控制将全身骨骼做成一个个动画, 骨骼带动全身模型. 例如攻击的动画, 手攻击的时候身体和腿脚也会做一定的动作, 这样全身的骨骼带动整个模型来实现动画效果, 这样实现起来比较简单, 在大部分的时候效果也不错, 但是这在做角色控制的这样也带来很多问题.

      典型的问题是, 当一个动画进行的时候如果要执行另一个动画, 那么这两个动画会相互影响, 导致很别扭的现象发生, 这是因为两个动画用的同一副骨骼, 每个动画帧对骨骼影响, 两个动作相互叠加而导致.

未命名

      如上图, 1是正常的Idel动画, 2是正常的Attract动画, 3是Idel+Attract动画, 可以看到, 攻击动画明显受到影响.

      如果再不是很明显的情况下, 可以直接混用骨骼动画, 另一种是在执行一个动画的时候将上一个动画关闭, 在执行当前动画.

 

骨骼融合

      查看Ogre1.7 Character的demo, 会发现他的角色控制的比较好, 但是也会发现在跳的时候不能攻击或者拔武器, 这里对他进行简要的分析.

      查看Sinbad角色骨骼动画, 会发现他有很多动画.

111

        其中会发现有RunBase, TopBase, IdleBase, IdleTop这些动画, Base名称的动画为下半身动画, Top名称的为动画为上半身动画, 简言之就是上半身动画只会驱动上身骨骼来影响上半身, 下半身动画只会驱动下半身骨骼来影响下身模型.

      为什么要这么做? 由前面的分析我们得知: 当两个骨骼动画同时执行时会相互影响. 那么将不同的骨骼动画分开, 在执行的时候不影响其他不属于本动作的骨骼部分, 那么就会更自然.

      Ogre 1.7的例子就是这么做的, 在做某个动作的时候分别控制上半身和下半身的骨骼动画, 效果会更好. 例如在奔跑的时候, 下半身执行奔跑的动画, 如果这时候要拿出武器, 那么上半身就调用相关的骨骼动画, 而下半身依旧执行奔跑的动画, 不同部分执行不同的动画.

      这样对分别控制不同部分的动画也对程序员提出了一些要求, 为了把做出的动作更自然, 程序员需要对各种动作的衔接很熟悉, 不然会做出很别扭的动画.

      下一部分就是关于骨骼融合, 骨骼融合使不同动画的过度产生了更好的效果, 一般来说就是前一个骨骼动画淡出, 新骨骼动画淡入, 直至动画完全执行最后又淡出……

      在Ogre 1.7中, 使用了两个数组来模拟不同部分的骨骼淡入和淡出.

 

      更新骨骼的时候会调用此函数, 用来模拟淡入淡出的效果, 他检查mFadingIn[i]和mFadingOut[i]全部骨骼是否是淡入,或者淡出, 如果是那么会增加对应骨骼动画的权值(weight)骨骼动画执行的比重, 其值为(0~1) 如果是1, 那么骨骼已经完成过度, 将其置为false.1232111
      可以看到Weight是用来控制角色骨骼执行程度的.

      这里说明一下AnimationState中的几个函数.

 

TimePosition : 是指动画当前的帧数(当前动画执行的时间点), 比如0~100帧是完整的动画, 超过100可设置跳回到0执行循环.

Length : 是指动画的全部帧数(执行完毕动画所用的时间).

Weight : 如上图所示, 动画执行的程度(0~1).

      在写程序的时候,会发现调用hasEnded()来判断当前动画是否执行完毕不会执行预期的行为, 这是因为hasEnded()只在动画不执行Loop循环的时候有效,那么在Loop状态下就需要通过一个变量timer来记录当前动画执行的时间, 通过比较timer和Length来判断此次动画是否执行完毕.例如此次动画执行完毕后调用idle动画:

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值