THREE.jsシーンでオブジェクトの回転を処理するコードを書きました。しかし問題は3D特有ではありません。JavaScript - アニメーション回転アルゴリズム
私のオブジェクト(this)は、回転(this.clientRotation)がthis.targetRotationで定義された回転に達するまで、各関数呼び出し時に0.25ラジアン回転します。以下のコードは、レンダリングループで継続的に呼び出されるupdate()関数の内容です。
現在の回転と目標回転との絶対差が、各回転の回転量(0.25)よりも大きいかどうかをチェックして、目標回転に近づくと往復を避ける必要がありました。
回転(ラジアン)の差が180度を超えているかどうかを確認する必要がありました。この場合、最短の回転が逆になります。
更新された回転が-PIと+ PI(0度と360度)の間にあるかどうかを確認する必要がありました。
//Move only if we find a delta big enough between the target rotation and current rotation
//Rotation goes from -PI to +PI
this.rotationSpeed = 0.25;
var absDiff = Math.abs(this.clientRotation - this.targetRotation);
if(absDiff > this.rotationSpeed){
if(absDiff < Math.PI){
//Less than 180 degrees, turn towards the target
if(this.targetRotation > this.clientRotation) this.clientRotation += this.rotationSpeed;
if(this.targetRotation < this.clientRotation) this.clientRotation -= this.rotationSpeed;
} else {
//More than 180 degrees this way, so it is shorter to turn the other way
if(this.targetRotation > this.clientRotation) this.clientRotation -= this.rotationSpeed;
if(this.targetRotation < this.clientRotation) this.clientRotation += this.rotationSpeed;
}
//If rotation radians becomes more than a complete 360 turn, start again from 0
//If it goes below 0, start again down from 360
if(this.clientRotation > Math.PI) this.clientRotation -= Math.PI*2;
if(this.clientRotation < -Math.PI) this.clientRotation += Math.PI*2;
}
非常に複雑です。この標準的な回転動作を達成するために、より最適化された方法がありますか?
私はしばしば3進数を使っていますが、私は個人的には、それらがなくても明確なコードを見つけることがあります。 else-ifsのための良い点:) – Rayjax