2016-12-12 6 views
0

En utilisant three.js, je crée un jeu avec des voitures qui se déplacent dans une direction spécifique, en fonction de leur rotation y. Un exemple serait 90 degrés. J'utilise object.translateZ() pour les faire avancer mais j'ai rencontré un problème. J'utilise physijs pour simuler les voitures. Les voitures qui se heurtent peuvent changer leur rotation en Y (à cause de l'accident) et je veux trouver un moyen pour les voitures de changer lentement leur rotation à la rotation d'origine comme ils se tournent pour revenir sur la route. Sans cela, ma ville est très chaotique.En tournant les objets pour qu'ils réinitialisent leur rotation y dans Three.js

Voici le code que je suis déjà en utilisant (ce qui est juste partie):

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

Je veux trouver un moyen de changer lentement la rotation de la voiture, donc il est le même que la rotation cible.

Toute aide est appréciée! (mais une sorte de fonction serait parfaite)

Répondre

2

J'ai fait des choses comme ça auparavant dans d'autres systèmes (2D, pas Three.js), et essentiellement tout ce que vous voulez faire est d'incrémenter progressivement l'angle jusqu'à ce que vous atteigniez quelque chose assez proche à l'angle cible. Habituellement, cela signifie que le flottant est inférieur à la vitesse de rotation que vous incrémentez (donc vous ne «dépassez» pas la valeur).

Le montant de l'incrément dépend de la rapidité avec laquelle vous voulez qu'ils tournent.

Vous souhaitez également vérifier s'il est préférable d'augmenter l'angle ou de diminuer (tournez-vous dans le sens des aiguilles d'une montre ou dans le sens inverse) si vous êtes plus proche de 360 ​​ou 0. Cela empêche la voiture de tourner . Vous pouvez trouver ceci en voyant si la différence est plus grande/moins de 180.

Nous pouvons utiliser l'opérateur de module pour obtenir l'angle "réel" entre -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! 
+0

wow! Merci beaucoup! –

+0

Je viens de remarquer un petit problème, si l'angle actuel est 0 et l'angle cible est de 90, il descend à -90, un moyen de résoudre ce problème? –

+0

Ouais, je pensais juste aux maths et j'ai remarqué quelques erreurs dans le virage; Je suis en train de cartographier la gamme en ce moment pour examiner la formule. Gimme a min ... – Hectate