【问题标题】:D3: Tumbling dice (unwantedly)D3:掷骰子(不受欢迎)
【发布时间】:2017-05-24 15:46:08
【问题描述】:

我想 - 在 D3 的帮助下 - 以不同的速度围绕其中心旋转一个对象。只要旋转速度不太高,一切正常。但最终对象开始翻滚,即使旋转中心(明显)是固定的。

http://jsfiddle.net/mcqnpgn6/找到掷骰子`

// initialize rotation angles
var dAngle = 10
var angles = []
var angle = 0;
for (i = 0; i < T; i++) {
  angles[i] = angle
  angle += dAngle > 0 ? dAngle : i
}

// create dice ....

// rotate dice
for (i = 0; i < T; i++) {
  dice.transition()
    .delay(i * dt)
    .duration(dt)
    .ease("linear")
    .attr("transform", "rotate(" + angles[i] + "," + cx + "," + cy + ")")
}

我做错了什么或理解错误? 将如何解决这个任务?

【问题讨论】:

  • 我会使用requestAnimationFrame 而不是在for 循环中编写自己的动画,我认为这不需要transition()。每一帧,您都希望骰子旋转 一些 角度,与速度变量成反比。

标签: animation d3.js rotation


【解决方案1】:

详细说明我的评论:http://jsfiddle.net/mcqnpgn6/25/。关键部分如下:

var theta = dAngle;

function rotate(){
  theta += dAngle;
  dice.attr("transform", "rotate(" + theta + "," + cx + "," + cy + ")")
  window.requestAnimationFrame(rotate);
}

rotate();

【讨论】:

  • 谢谢。 requestAnimationFrame 是否进行补间?您是否解释了为什么我的方法不适用于更高的速度?
  • requestAnimationFrame 没有补间,它只是以大约 60 fps 的速度渲染连续的静态帧。当您的元素具有固定的开始和结束位置时,D3 transition() 才有意义,而对于动画则不那么重要。 (如果您要重复转换,请参阅此示例:bl.ocks.org/mbostock/1125997)。如果您将 dAngle 设为大(尝试 500),则翻滚的原因会变得更清楚:D3 正在对旋转中心进行插值,因此元素正在平移和旋转。
  • 谢谢。 “D3 正在插入旋转中心”是什么意思?旋转中心对我来说似乎是固定的。
  • 您的矩形必须经过许多其他地方才能从变换 A 到变换 B,因此它正在决定这些中间变换将是什么。见:stackoverflow.com/questions/13313043/d3-js-animate-rotation
猜你喜欢
  • 1970-01-01
  • 2018-09-08
  • 1970-01-01
  • 2012-02-29
  • 2015-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-06
相关资源
最近更新 更多