【问题标题】:How to stop my camera after it reaches it's target到达目标后如何停止我的相机
【发布时间】:2015-10-14 10:41:08
【问题描述】:

我有一个简单的功能,用户可以点击并拖动相机。相机移动时略微平滑,但我不知道有什么简单的方法可以在相机赶上鼠标位置后停止相机。

我确定这只是一个简单的数学逻辑错误,但目前相机只是永远浮动。

这是我的功能:

function drag(evt,el){
    clearInterval(timer);
    if(evt.button == 2){ //right click and drag
    mousePos = {};
    mousePos.x = evt.offsetX / scale;
    mousePos.y = evt.offsetY / scale;
    function update(e){
        var difx    = mousePos.x - (e.offsetX/scale),
            dify    = mousePos.y - (e.offsetY/scale);
        var targetX = camera.x + difx;
        var targetY = camera.y + dify;

        //update for next mouse movement
        mousePos.x  = e.offsetX / scale;
        mousePos.y  = e.offsetY / scale;     

        function smooth(){ // the problems lay here
            if(camera.x != targetX){
                camera.x    += (difx * lerp);
            }
            if(camera.y != targetY){
                camera.y    += (dify * lerp);
            }
        }

        timer = setInterval(smooth,16);
    }           
    function clear(){
        el.removeEventListener('mousemove', update, false);
        this.removeEventListener('mouseup', clear, false);
    }
    el.addEventListener('mousemove',update,false);
    document.body.addEventListener('mouseup',clear,false);  
}}

我有代码在这里http://jsfiddle.net/bbb9q2c3/如果您单击并拖动然后放开框将继续移动,因为我当前的代码似乎没有检测到相机何时到达它的目标。

我能做些什么来解决这个问题?

【问题讨论】:

  • 我玩了一会儿,但没有得到有效的解决方案。这是我注意到的一些事情。相机永远不会与目标完全匹配。我建议添加一个缓冲区并检查它是否在界限内。其次,我使用 setTimeout 而不是 setInterval,这样一旦满足平滑,我使用 clearTimeout,这样函数就不会无限期地运行。
  • 有没有办法保证它会达到目标位置,也许使用某种 deltaTime 情况?
  • 您是否在没有在 mousemove 上清除过它的情况下调用 setInterval()?坏主意...
  • @Kaiido 哦,我忘了补充!感谢您发现它。
  • @Dave 如果 delta 为负测试以查看位置是否小于目标,以及是否为正测试以查看位置是否大于目标。

标签: javascript animation math camera


【解决方案1】:

fiddled 有点。

这是我所做的更改:

  1. 在绘制函数中我删除了翻译,以便相机坐标匹配鼠标坐标。所以 (0,0) 的相机位于左上角而不是中间。
  2. 使用阈值检查相机是否靠近鼠标ath.abs(dify) > 1
  3. 为更新功能添加了 clearInterval。现在它的响应速度较慢,因此您可能需要摆弄它。
  4. 在初始化中将正方形设置为中间位置。

【讨论】:

  • 这不是我想要的行为,它不应该移动到鼠标位置,而是移动与鼠标相同的量。因此,如果鼠标向上移动 1 px,相机也应该向上移动。例如,如果我只延迟 > 0.1,它也会变得非常紧张。所以如果我想要一个 10 毫秒的延迟,那就很奇怪了。
  • 哦,我明白了。相机什么时候停止?假设鼠标向上移动了 10 像素,然后向左移动了 10 像素,而相机落后了 - 仅向上移动了 8 像素。什么时候左转,什么时候停?
  • 只要它的最终目标仍然与鼠标整体移动的距离相对相同,它就可以更快地转动,否则你滚动得越远,相机移动对鼠标的精确度就越低。换句话说,它不需要严格遵循路径,我的目标是延迟大约 100 毫秒,所以它几乎不会被注意到。
猜你喜欢
  • 2016-11-01
  • 1970-01-01
  • 2021-01-31
  • 1970-01-01
  • 2017-06-27
  • 2022-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多