DB activer rotation complète par appui d'une touche

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
vertigo13
Messages : 20
Inscription : 18 Oct 2019 22:12

DB activer rotation complète par appui d'une touche

Message par vertigo13 » 21 Oct 2019 13:34

Bonjour,

j'ai un script permettant de faire tourner un objet à 90 degrés sur l'axe Y.

Si je lance la rotation depuis la fonction start() ça marche, le cube tourne une fois à 90 degrés.
Ce que j'essaie de faire c'est de lancer cette rotation depuis la fonction update() avec GetKeyDown(Keycode.Z), mais dans ce cas il faut appuyer plusieurs fois pour faire la rotation. Bien sûr j'aimerais que la rotation se fasse en entier en appuyant une seule fois sur la touche.

Est-ce que je dois passer par une boucle à l'intérieur de Input.GetKeyDown pour incrémenter la rotation de 1 jusqu'à 90?
J'ai essayé avec une boucle For mais sans succès.

Pour le code:

Code : Tout sélectionner

	
	// For the rotation of the player in quaternion
	Quaternion rotateCoords;
	int angleOfRotation;
	
	void Start () {

		transform.rotation = Quaternion.identity;
		angleOfRotation = 90;

		}
	
	void Update () {

		// Convert the quaternion in Euler angles
		rotateCoords = Quaternion.Euler (0, 90, 0);

		// Dampen towards the target rotation
		transform.rotation = Quaternion.Lerp (transform.rotation, rotateCoords, Time.deltaTime * 2);
	}

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: DB activer rotation complète par appui d'une touche

Message par Alesk » 21 Oct 2019 14:27

C'est normal que ça se comporte comme ça, car tu spécifie une rotation absolue.
Il faut ajouter 90° à chaque fois.
Après tu risque aussi d'avoir un souci avec la fonction Lerp, qui peut faire visuellement revenir en arrière ta rotation (ça vient de la façon dont sont recalculés les angles)

Il vaut mieux procéder comme ceci :
On effectue le changement d'angles sur un Vector3, pour garder un contrôle sur les valeurs des angles, et ce n'est qu'à la fin qu'on convertit en Quaternion pour mettre à jour le transform.

Code : Tout sélectionner

   
    public float stepAngle = 90;
    Vector3 currentEuler;
    Vector3 destinationEuler;

    void Start()
    {
        currentEuler = transform.rotation.eulerAngles;
        destinationEuler = currentEuler;
    }

    void Update()
    {
        if(Input.GetKeyDown(KeyCode.Z)){
            destinationEuler.y += stepAngle;
        }
        currentEuler = Vector3.Lerp(currentEuler , destinationEuler , Time.deltaTime * 2);
        transform.rotation = Quaternion.Euler(currentEuler);
    }

vertigo13
Messages : 20
Inscription : 18 Oct 2019 22:12

Re: DB activer rotation complète par appui d'une touche

Message par vertigo13 » 21 Oct 2019 21:38

Merci beaucoup, ça marche super.
La seule chose qui m'embête c'est que j'ai encore compris pourquoi :-D
Du coup je vais potasser ta méthode!

Avatar de l’utilisateur
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: DB activer rotation complète par appui d'une touche

Message par Alesk » 21 Oct 2019 22:49

En stockant la valeur de l'angle à atteindre dans une variable à part, ça te garanti que cet angle ne sera pas altéré par les calculs de conversion du Quaternion en angles Euler ou inversement.

En utilisant que le Lerp sur un Quaternion, tu aurais eu des valeurs du genre : 0 -> 90 -> -180 -> -90 -> 0 (c'est pas forcément ça, mais c'est l'idée)
Quand on passe les 180°, parfois selon les calculs, ça inverse les valeurs. visuellement ça ne se voit pas car -180° = 180° et -90° = 270°
Mais lorsque l'on désire une rotation continue, il faut garantir la linéarité et le sens de la progression de la valeur de l'angle.
Donc là avec ma méthode, ça donne 0 -> 90 -> 180 -> 270 -> 360 -> 450 -> 540 -> etc ... et on fait l'interpolation linéaire sur le Vector3.
Et c'est cette valeur finale correcte qui est automatiquement convertie ensuite dans le Quaternion à assigner à la rotation du transform.

Répondre

Revenir vers « Scripting »