Partage
  • Partager sur Facebook
  • Partager sur Twitter

Tangage + rotation

Unity5 / C#

    10 février 2016 à 1:06:18

    public class PlayerController : MonoBehaviour
    {
        public float speed;
        public float tilt;
        
    void FixedUpdate ()
        {
            float moveHorizontal = Input.GetAxis ("Horizontal");
            float moveVertical = Input.GetAxis ("Vertical");
    
            Vector3 movement = new Vector3 (moveHorizontal, 0.0f, moveVertical);
    
    	// Déplacement
    	rigidbody.velocity = movement * speed;
    
            
           // Tangage
    	 rigidbody.rotation = Quaternion.Euler (0.0f, 0.0f, rigidbody.velocity.x * -tilt);
        }
    }


    Bonjour à tous,

    j'ai suivi le tuto Star Shooter de la team Unity et j'ai voulu extrapoler dessus en faisant évoluer mon vaisseau en réel 3D.

    ceux qui connaissent cet exercice se souviennent que les déplacements latéraux sont accompagnés d'un tangage (rotation sur l'axe z).

    Je ne parviens pas à  combiner le tangage avec une rotation type "Demi-tour" (sur l'axe y) pour plus de réalisme.

    Si quelqu'un a un tuyau...

    Merci par avance/

    -
    Edité par AlexAlex36 10 février 2016 à 1:08:20

    • Partager sur Facebook
    • Partager sur Twitter
      10 février 2016 à 9:40:47

      Yop,

      En gros, quand ton vaisseau va sur le côté, en plus de tanguer il se retourne et montre ses réacteurs à l'ennemi? J'espère mal comprendre car c'est particulièrement étrange comme comportement x) A moins que tu ne veuilles que légèrement orienter l'avant de ton vaisseau pour accompagner le tangage (genre comme un bateau) ? Si tu peux expliquer un peu plus ton histoire de demi-tour, je suis preneur pour essayer de t'aider.

      • Partager sur Facebook
      • Partager sur Twitter
        10 février 2016 à 11:18:00

        merci de proposer ton aide.

        c'est juste un exercice que je m'impose en tant que débutant pour manipuler le transform entre autre.

        exemple très simple car il ne s'agit pas nécessairement de combattre un ennemi.

        dans une course genre WipEout le vaisseau peut avoir une trajectoire virage  en boucle qui inverse le sens initial.

        pour le bateau Il doit tanguer et Virer de bord.

        Donc tu a bien compris. le vaisseau doit pouvoir tourner autour de lui même tout en tangant.

        Oh! la vue est à la 3ème personne caméra fille du vaisseau.

        Avec un code additionnel j'ai réussi à le faire virer en tangant et résolu le problème du sens de navigation qui s'inverse

        à 180 de virage(la touche Up faisait reculer...). malheureusement le vaisseau perd de l'altitude et le sens du tangage s'inverse pendant le virage... chaotique!!

        -
        Edité par AlexAlex36 10 février 2016 à 11:20:05

        • Partager sur Facebook
        • Partager sur Twitter
          10 février 2016 à 11:54:26

          Avec ce code ça a l'air d'aller côté virage. mais le tangage s'inverse ...
          using UnityEngine;
          using System.Collections;
          using System.Collections.Generic;
           
          public class ShipController : MonoBehaviour 
          {
           
          public float speed, tangage;
          private float yRotation;
          
          void FixedUpdate ()
          {
           
          Rigidbody Rb = gameObject.GetComponent<Rigidbody> ();
           
          float MoveH = Input.GetAxis ("Horizontal");
          float MoveV = Input.GetAxis ("Vertical");
           
          Vector3 mvt = new Vector3 (MoveH, 0.0f, MoveV);
          mvt = transform.TransformDirection(mvt);
          transform.Translate(mvt, Space.World);
          Rb.velocity = mvt *speed;
           
          yRotation += Input.GetAxis ("Horizontal");
           
                  Rb.rotation = Quaternion.Euler(0.0f, yRotation, Rb.velocity.x * -tangage);
           
          }
           
           
          }
           

          -
          Edité par AlexAlex36 10 février 2016 à 11:56:26

          • Partager sur Facebook
          • Partager sur Twitter
            10 février 2016 à 14:48:46

            Déjà, un petit conseil d'un point de vue des ressources: définie une donnée membre pour ton Rigidbody dans ta classe et initialise là dans le Start() avec GetComponent() plutôt que de le faire dans le FixedUpdate().

            J'ai essayé rapidement le script que tu as écrit. J'imagine que tu es dans une vue 3D car d'un point de vue 2D comme le tuto original, je trouve le comportement plutôt farfelu. En testant très rapidement de mon côté, j'ai obtenu un petit effet de virée de bord. Je te laisse essayer voir si ça te correspond et si c'est pas le cas, je chercherais un peu plus de mon côté.

            using UnityEngine;
            using System.Collections;
            
            public class PlayerController : MonoBehaviour {
            
            	public float speed = 10.0f;
            	public float tilt = 5.0f;
            	public float tack = 5.0f;
            
            	private Rigidbody rb;
            
            	void Start()
            	{
            		rb = GetComponent<Rigidbody> ();
            	}
            
            	void FixedUpdate()
            	{
            		float moveHorizontal = Input.GetAxis ("Horizontal");
            		float moveVertical = Input.GetAxis ("Vertical");
            
            		Vector3 movement = new Vector3 (moveHorizontal, 0.0f, moveVertical);
            		rb.velocity = movement * speed;
            
            		rb.rotation = Quaternion.Euler (0, rb.velocity.x * tack, rb.velocity.x * -tilt);
            
            	}
            }

            EDIT: J'avais laissé quelques fautes dans le code que je viens de corriger.

            -
            Edité par Kaihyo 10 février 2016 à 15:08:14

            • Partager sur Facebook
            • Partager sur Twitter
              10 février 2016 à 21:01:02

              Merci Kaihyo

              Merci du conseil sur la définition du Rigidbody.

              Tout d'abord j'avais dit plus haut que j'était en vue "caméra embarquée" à l'arrière du vaisseau.

              j'avais essayé ta solution auparavant et le résultat est moins bon.

              on a d'ailleurs aucun virage sans les deux intructions de normalisation des axes

              mvt = transform.TransformDirection(mvt);
              transform.Translate(mvt, Space.World);

              Le code que j'ai mis a l'air de bien fonctionner pour le virage. 

              on pourrait se poser la question autrement:

              <<Comme pour la normalisation de l'axe Z comment normaliser la rotation (tangage) en space.world>> car elle s'inverse à partir de 90 degrès de virage. Tout en restant appuyé sur la flèche gauche mon vaisseau vire bien, avance dans le bon sens mais tangue tantôt à droite tantôt à gauche.

              Est ce qu'il y a un moyen de te mettre le "projet" à disposition que tu puisses l'exécuter sur ton pc

              pour mieux te rendre compte de la problématique. 

              Merci :)

              -
              Edité par AlexAlex36 10 février 2016 à 21:32:52

              • Partager sur Facebook
              • Partager sur Twitter
                11 février 2016 à 9:51:09

                Il me semblait bien que tu étais passé en mode embarqué :p

                Avec ton explication je vois un peu mieux le problème (même si je n'ai pas de solution dans l'immédiat). Je pense que si je me met dans la même config que toi je pourrais chercher plus facilement.

                Si tu veux partager tes projets avec quelqu'un d'autre, il me semble qu'il faut que tu mettes ce que tu veux partager dans un package. Pour faire ça : "Assets" > "Export Package...". Il faudra sans doute que tu l'upload pour que je puisse le télécharger.

                • Partager sur Facebook
                • Partager sur Twitter
                  12 février 2016 à 8:53:04

                  Ok et merci encore Kaihyo .

                  je vais pouvoir m'y pencher après le w-e ( mais non je fais pas la bringue :ange: )

                  A+

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Tangage + rotation

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown