2017-02-07 27 views
0

私はターゲットに移動するオブジェクトを持っています。問題は、x位置がz位置より速いか、またはz位置がx位置よりも速いことです。Three.jsオブジェクトがターゲットに移動

zポジションの移動に時間がかかる場合は、オブジェクトがxポジションでスローダウンすることはできますか?

アニメーション機能での私のコード:

var distanceX = objectX - targetX; 
var distanceZ = objectZ - targetZ; 

if(distanceX < 0) { 
    visitor.translateX(0.05); 
}else { 
    if(distanceX > 0) { 
     visitor.translateX(-0.05); 
    } 
} 

if(distanceZ < 0) { 
    visitor.translateZ(0.05); 
}else{ 
    if(distanceZ > 0) { 
     visitor.translateZ(-0.05); 
    } 
} 
+1

'Date.now()'はミリ秒精度のタイムスタンプ(https://en.wikipedia.org/wiki/Unix_timeを参照)を常に返します。この場合、アニメーションはわずか5ミリ秒で実行されます「5000」である)。また、startTimeを1に設定することはできませんが、アニメーション開始時刻のタイムスタンプに設定する必要があります: 'var startTime = Date.now();' –

答えて

1

私の代わりに、増分の絶対値として現在の値を計算することをお勧めします。あなたがやっていることは基本的にこのようなものです:

x = xLast + constantValue; 

代わりに、あなたは最後の値を必要とせずにこれを行うことができます(これは、線形補間と呼ばれている):

progress = Math.min((Date.now() - startTime)/duration, 1); 
x = xStart + progress * (xEnd - xStart); 

この場合における進捗値であります0(アニメーション開始)から1(アニメーション終了)までの値。

このようなアニメーションを作成する場合は、両方の部分の継続時間を同じ値に設定するだけで済みます。 three.js数学utilsのを使用すると、あなたも、すべてを一度にこれを行うことができます。

var end = new THREE.Vector3(1, 0, 2); 
var start = new THREE.Vector3(2, 0, -1); 

// in animation-loop 
var tmp = new THREE.Vector3(); 
var progress = Math.min((Date.now() - startTime)/duration, 1); 

// tmp = progress * (end - start) 
tmp.copy(end).sub(start).multiplyScalar(progress);   
object.position.copy(from).add(tmp); 

そのように、あなたは正確に同じ時間に目的地に到着した一定の速度で位置移動のすべてのコンポーネントを持つことになります。

tween.jsのようなアニメーションライブラリを見たい場合があります。彼らはこれをかなり快適に扱うことができます。

+0

ありがとうございます。あなたが何を説明しているのかを理解するのは難しいですが、何か試しました。編集された質問をご覧ください –

関連する問題