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 と 5 の間にあるはずの 4 にあり、分針にも同じ問題があります。
  • 私が使用している数学が正しいかどうかはわかりません。時間の経過とともに特定できない奇妙な問題が発生しているためです。

これを行うより正確な方法はありますか?

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 に答える