摄像机跟随抖动问题——老问题曾修复过又出现

  • Creator 版本:2.3.4

  • 目标平台: WEB和小程序下出现

  • 重现方式:

  • 出现概率:一直抖

  • 额外线索:
    物体followTarget执行cc.tween上下往复运动,运动距离比较长
    跟随摄像机跟随,在摄像机update中,执行this.node.setPosition = targetNode.position
    尤其在运动的开始和单次运动快结束时,情况只在web跟小程序端出现,模拟器上不抖.

浏览论坛,在以前2.0版本也存在这个问题,官方引擎团队回复在2.0.1版本中修复,是浮点精度问题.
后来有开发者反应2.3.0版本仍然存在该问题摄像机跟随抖动帖子

现在用的2.3.4版本,问题仍然存在。

现在处理方式只能暂用一个替代方式:
创新一个新的物体(moveNode)来做cc.tween运动,然后在新物体的update里强制:
var copyPos = cc.moveNode.postion;
camNode.pos = copyPos;
followTarget.pos = copyPos;

让摄像机要原本要跟随物体坐标,强制和新的第三方moveNode保持一致,这样如果在var copyPos = cc.moveNode.postion;过程中发生了浮点精度问题,那么至少能保证camNode.pos跟followTarget.pos的值都是同一个发生浮点精度偏差后的值,保证了camNode和followTarget的坐标一致。

局限性仍然很大,希望官方能尽快解决。

这里推荐用镜头平滑跟随,不要直接设置跟随目标节点的位置,这样太生硬,而且会有抖动的问题,你可以算一下镜头和目标节点的偏移量,在update里跟随

let curP = camera.position;
let offsetP = cc.v2(targetNode.x-curP.x,targetNode.y-curP.y);
let speed = 0.1;//跟随速度
camera.position = cc.v2(curP.x+offsetP.x*speed,curP.y+offsetP.y*speed);

这样偏移量越大跟随越快,镜头能实现平滑移动

2赞

好主意!
unity里我知道个专门摄像机功能组件做这个镜头控制.

1赞

采用你的方案,依然会抖动.
可能在计算的时候,因为精度问题,导致计算结果在些帧计算结果忽高忽低,导致抖动.

这个方案确实不错,但是当摄像机的y坐标增加到大概2000以上抖动逐渐增加,还是无法解决

以每帧帧数平滑不行.还可以乘上时间间隔, 采用时间方式更平滑舒适
let speed = 10 * dt;//每秒10倍的时间间隔平滑
camera.position = cc.v2(curP.x+offsetP.xspeed,curP.y+offsetP.yspeed);