首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方便帆布相机的运动

方便帆布相机的运动
EN

Stack Overflow用户
提问于 2015-09-16 05:57:45
回答 1查看 716关注 0票数 0

我有一个功能,它将相机移动到用户单击画布的位置。但目前的运动是线性的。我希望它可以轻松地进行/退出转换,但是很难理解如何用我当前的功能来实现它。

这是我的代码:

代码语言:javascript
复制
animate.mouseEvent = function(e,el){        
    var mousePos = mouse.relativePosition(e,el);
    var parent   = el;
    if(e.button == 0){

            function update(){
                if(centerX == mousePos.x && centerY == mousePos.y){
                    clearInterval(parent.timer);
                    //center X / Y is canvas width & height halved
                }

                var difx            = centerX - mousePos.x,
                    dify            = centerY - mousePos.y,
                    distance        = Math.sqrt(difx*difx + dify*dify),
                    normalX         = difx/distance,
                    normalY         = dify/distance,
                    speed           = 1, //currently linear [replace with ease in/out]
                    x               = normalX * speed,
                    y               = normalY * speed;

                    updateOffsets(x,y);                     
                    mousePos.x  += x;
                    mousePos.y  += y;
                }
                parent.timer = setInterval(update,1);   
     }
}


animate.updateOffsets = function(x,y){
    canvas.offsetX -= x;
    canvas.offsetY -= y;
}

因此,我想知道如何从我目前的线性方法中实现一个轻松的输入/输出。使用以下功能:

代码语言:javascript
复制
Math.easeInOutQuad = function (t, b, c, d) {
    t /= d/2;
    if (t < 1) return c/2*t*t + b;
    t--;
    return -c/2 * (t*(t-2) - 1) + b;
};

我不完全知道如何实现它,也不知道它到底会返回什么来计算新的偏移量。希望有人能解释。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-16 20:45:49

这应该能给你一个主意。我用了另一个宽松的功能,你可以代替你自己的。示例

代码语言:javascript
复制
var element = document.getElementById('moving');
var bg = document.getElementById('background');

bg.addEventListener('click', function(evt) {
  animate({
    x: evt.offsetX,
    y: evt.offsetY
  });
}, false);

function getPosition() {
  return {
    x: element.offsetLeft,
    y: element.offsetTop
  };
}
function setPosition(x, y) {
  element.style.left = x + 'px';
  element.style.top = y + 'px';
}

function easing(x) {
  return 0.5 + 0.5 * Math.sin((x - 0.5) * Math.PI);
}

function animate(target) {
  var initial = getPosition();
  var initialX = initial.x;
  var initialY = initial.y;
  var targetX = target.x;
  var targetY = target.y;
  var deltaX = targetX - initialX;
  var deltaY = targetY - initialY;

  var timeStart = timestamp();
  var timeLength = 800;

  var timer = setInterval(update, 10);

  function timestamp() {
    return Date.now();
  }
  function stop() {
    clearInterval(timer);
  }

  function update() {
    var t = (timestamp() - timeStart) / timeLength;
    if (t > 1) {
      fraction(1);
      stop();
    } else {
      fraction(easing(t));
    }
  }
  function fraction(t) {
    setPosition(initialX + t * deltaX, initialY + t * deltaY);
  }
}

编辑

应用于您提供的小提琴

代码语言:javascript
复制
var element         = document.getElementById('background');
var ctx             = element.getContext("2d");
var camera          = {};
    // camera.offset marks the position seen at the upper left corner
    // (It would be better if it marked the center)
    // Let these be negative, so (0,0) scene position is at the center of the image
    camera.offsetX  = -element.width/2;
    camera.offsetY  = -element.height/2;
var obj             = {};
    obj.x           = 50;
    obj.y           = 50;

element.addEventListener('click', animate, false);

function easing(x) {
      return 0.5 + 0.5 * Math.sin((x - 0.5) * Math.PI);
}

function animate(evt){
    // Transform click position from screen coordinates to scene coordinates
  var targetX       = evt.offsetX + camera.offsetX - element.width / 2,
      targetY       = evt.offsetY + camera.offsetY - element.height / 2;

  var initialX      = camera.offsetX,
    initialY        = camera.offsetY;

  var deltaX        = targetX - initialX,
      deltaY        = targetY - initialY;

  var timeStart     = Date.now();
  var timeLength    = 800;
  var timer         = setInterval(update, 10);

  function stop(){
    clearInterval(timer);
  }

  function update(){
    var t = (Date.now() - timeStart) / timeLength;
      if (t > 1) {
          fraction(1);
          stop();
      } else {
          fraction(easing(t));
      }
  }    
  function fraction(t){
      camera.offsetX = initialX + t * deltaX,
      camera.offsetY = initialY + t * deltaY;
  }
}

function draw(){
    ctx.clearRect(0,0,element.width,element.height);

  ctx.fillStyle = 'red';
  ctx.fillRect((element.width/2)-2,(element.height/2)-2,4,4);       

    ctx.fillStyle = 'blue';
    // ===> Here the size and position arguments were swapped
  ctx.fillRect(obj.x-camera.offsetX,obj.y-camera.offsetY, 20, 20);   
}

// Consider using requestAnimationFrame
setInterval(draw, 10);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32600794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档