0

three.js を使用して、y 回転に応じて特定の方向に移動する車のゲームを作成しています。例としては 90 度です。以前はそれらを前にobject.translateZ()進めていましたが、問題が発生しました。

私は車をシミュレートするためにphysijsを使用しています。車同士が衝突すると、(衝突により) y 回転が変わる可能性があり、道路に戻るために向きを変えるように、車がゆっくりと回転を元の回転に戻す方法を見つけたいと考えています。これがなければ、私の街はとても混沌としています。

これが私がすでに使用しているコードです(これはほんの一部です):

var targetRotation = 90
var rotation = car.mesh.rotation.y * 180 / Math.PI //to convert to degrees

車の回転を目標の回転と同じになるようにゆっくりと変更する方法を見つけたいです。

どんな助けでも大歓迎です!(しかし、ある種の機能は完璧でしょう)

4

1 に答える 1

2

私は以前に他のシステム (Three.js ではなく 2D) でこのようなことを行ったことがありますが、基本的にやりたいことは、目標角度に十分に近づくまで角度を徐々に増やしていくことです。通常、これは、フロートがインクリメントする回転速度よりも小さいことを意味します (したがって、値を「オーバーシュート」することはありません)。

増分の量は、どれだけ速く回転させたいかによって異なります。

また、角度を 360 度または 0 度に近づけるかどうかに応じて、角度を大きくするか小さくするか (時計回りまたは反時計回り) を確認する必要があります。これは、差が 180 より大きいか小さいかを確認することで確認できます。

モジュラス演算子を使用して、-360/360 の間の「実際の」角度を取得できます。

var currentAngle = car.mesh.rotation.y * 180 / Math.PI; //car's angle in degrees
var targetAngle = 90; //preferred angle *this time* ;)
var turningSpeed = 1; //one degree per update (wayyy to high for real stuff, usually)
currentAngle = currentAngle % 360; //get the 0-360 remainder
if ( Math.abs(targetAngle - currentAngle) >= turningSpeed) {
  var addto = 0
  if (targetAngle - currentAngle < 0) {
    addto = 360
  }
  if ( targetAngle - currentAngle + addto <= 180 ) { 
    currentAngle += turningSpeed;  
  }
  else {
     currentAngle -= turningSpeed;
  }
}
else { currentAngle = targetAngle; } //we're close enough to just set it
car.mesh.rotation.y = ( currentAngle * Math.PI ) / 180; // back to radians!
于 2016-12-13T03:25:25.720 に答える