0

我的场景中有一个模拟时钟,我想用当前时间进行更新。现在我可以通过以 1 秒的间隔计算每只手的旋转来使时钟保持时间,但我看到分针和时针的一些奇怪的结果。

hourHand = scene.getObjectByName('Box001');
minuteHand = scene.getObjectByName('Box002');
secondHand = scene.getObjectByName('Cylinder002');

var d = new Date();

var mins = d.getMinutes();
var secs = d.getSeconds();
var hours = d.getHours();

minuteHand.rotateY((-mins / 60) * (2 * Math.PI));
secondHand.rotateY(((mins /60) + (-secs / 3600)) * (2 * Math.PI));
hourHand.rotateY(((-hours / 12) + (mins / 720)) * (2 * Math.PI));


setInterval(function(){
    minuteHand.rotateY((2 * Math.PI) / -3600);
    secondHand.rotateY((2 * Math.PI) / -60);
    hourHand.rotateY((2 * Math.PI) / (-3600 * 12));
},1000);

我遇到的问题是:

  • 如果时间是 4:30,时针在 4 时应该在 4 和 5 之间,分针也有同样的问题
  • 我不确定我使用的数学是否正确,因为随着时间的推移,我发现了一些我无法确定的奇怪问题。

有没有更准确的方法来做到这一点?

4

1 回答 1

0

您无法保证您的间隔实际上每 1000 毫秒触发一次,因此随着时间的推移,当然会累积错误,因为您无法“赶上”之前的延迟。

我建议您将手部旋转基于使用当前时间作为输入的函数。这样,您的间隔/触发器/回调何时执行并不重要,但无论何时执行它都会显示正确的结果。

数学并不太复杂,时钟显然有 360 度,所以从我的头顶上看,这意味着

(Date.now()/1000)%60 * 6将是您的二手旋转度数(假设 0° 是顶部),同样

(Date.now()/60000)%60 * 6应该是分钟旋转和

(Date.now()/3600000)%24 * 15你的时针。 更新愚蠢的我,将此公式设置为 24 小时轮换。您希望这是正常时钟的 12 小时,所以这将变为:

(Date.now()/3600000)%12 * 30

对这些计算持保留态度,没有花时间来验证这一点。

于 2015-02-09T16:48:49.583 回答