zoukankan      html  css  js  c++  java
  • AWay3D 动画位置变化的问题

    AWay3D 动画位置变化的问题

      无意中发现away3d中骨骼动画在播放时模型的位置会增量移动,也就是如果某个动作root骨骼第一帧和最后一帧位置不一致的话,播放这个动画的模型就会一直累加这两帧的位置差。 还有就算是第一帧和最后一帧的位置相同,但在动画未播放完时切换到另一个动画,如果此时root的位置有改变,那么模型的位置也会移动。

      断点调试,发现AnimatorBase这个类中有一个函数applyPositionDelta()

    private function applyPositionDelta() : void

    {

       var delta : Vector3D = _activeState.positionDelta;

       var dist : Number = delta.length;

       var len : uint;

       if (dist > 0) {

          len = _owners.length;

          for (var i : uint = 0; i < len; ++i)

          _owners[i].translateLocal(delta, dist);

       }

    }


    里面调用了_owners[i].translateLocal(delta, dist); 就是它导致了模型的移动。于是乎果断给它注释掉。结果可想而知,动画播放有问题。问题表现为:动画的root骨骼没有位移变化。所以可以猜想是away3d在计算动画插值时动了手脚,有了这个思路后继续断点查找,在SkeletonClipState类里发现了updateSkeletonPose方法,

    private function updateSkeletonPose(skeleton:Skeleton) : void

    {

        .....

        .....

     for (var i : uint = 0; i < numJoints; ++i) {

       .....

       .....

        if (i > 0) {          // 这里导致root骨骼没有计算位置插值

            tr = endPose.translation;

            tr.x = p1.x + _blendWeight*(p2.x - p1.x);

            tr.y = p1.y + _blendWeight*(p2.y - p1.y);

            tr.z = p1.z + _blendWeight*(p2.z - p1.z);

        }

    }

    }


    它在计算位置时加了一个条件 i > 0,也就是root没有计算。于是再一次果断去掉这个条件。呵呵,暂时就一切正常了。(是暂时... 因为目前还没发现它会不会印象其他地方的运作)

  • 相关阅读:
    Yii2中request的使用
    git在本地仓库直接使用rm彻底删除文件,服务端还是存在
    oc基础-oc中之集合NSSet,NSMutableSet
    oc基础-oc中之集合NSArray,NSMutableArray
    oc基础-NSString和NSMutableString区别
    oc基础-Foundation中NSString类型的一些用法
    oc基础-foundation框架中的常用结构体
    oc基础-设计代理模式理解
    oc基础-protocol协议的使用
    block关键字的使用
  • 原文地址:https://www.cnblogs.com/xiayong123/p/3716989.html
Copyright © 2011-2022 走看看