Page 1 sur 2

[RESOLU]Mouvement de rotation dans un torus

Publié : 26 Juil 2020 11:43
par Exsize
Bonjour à tous.

Je commence un nouveau petit projet et pour vous expliquer mon problème je pense qu'il faut que je vous montre.

Voici une petite image de mon projet (ne faites pas attention aux matériaux c'est vraiment moche)
Image

J'aimerai que la capsule (qui sera à terme le joueur) tourne à l'intérieur du torus. Je pense que le script de déplacement ne sera pas compliqué car c'est un mouvement constant. Mais c'est au niveau de la gravité. J'aimerai que la capsule sois attiré par le torus en tout points.

Malgrès toute mes recherches je n'y arrive encre pas c'est pour cela que je fais appelle à vous.

Merci beaucoup si vous pouvez m'aider !

Re: Mouvement de rotation dans un torus

Publié : 26 Juil 2020 13:43
par Max
Bonjour,

un sujet récent du forum qui pourrait pas mal t'aiguiller: viewtopic.php?f=2&t=17489

Re: Mouvement de rotation dans un torus

Publié : 26 Juil 2020 15:09
par Exsize
Bonjour.

Malgrès le code donné dans l'autre topic, impossible de faire bouger ma capsule à l'intérieur du torus. Néanmoins la gravité fonctionne tout autour du torus même si la capsule "tremble" un peu.

Auriez-vous une solution pour que la capsule se déplace toute seule dans le torus seulement sur l'axe x, y ?

Merci d'avance !

Re: Mouvement de rotation dans un torus

Publié : 26 Juil 2020 15:25
par Max
Poste le code que tu utilises, cela peut servir de base et voir ce qui pourrait être corrigé pour que cela soit plus fonctionnel.

Re: Mouvement de rotation dans un torus

Publié : 26 Juil 2020 15:49
par Exsize
Voilà voilà

Code : Tout sélectionner

public class MovementPlayer : MonoBehaviour
{
    public float speedMove = 4;     //vitesse de déplacement
    public float speedRot = 120;    //vitesse de rotation
    public float smoothRot = 10;    //amortissement dans les angles du sol
    public float jumpHeight = 1f;   //Hauteur pour le saut
    public float jumpForce = 40000; //Force pour le saut
    public float gravity = 50;      //Force pour la gravité
    bool onGround = false;
    float distanceToGround;
    Vector3 groundNormal;
    Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
        rb.freezeRotation = true;
    }


    private void FixedUpdate()
    {
        //Envoie un rayon verticalement vers le bas
        RaycastHit hit = new RaycastHit();
        Ray ray = new Ray(transform.position, -transform.up);

        //le layer 8 correspond à tout ce qui représente un "sol"
        int mask = 1 << 8;//ne réagit qu'au layer 8
        if (Physics.Raycast(ray, out hit, Mathf.Infinity, mask))
        {
            //si le player est tout près du sol = true
            distanceToGround = hit.distance;
            onGround = distanceToGround < 0.1f;

            //applique la rotation pour que le player soit perpendiculaire au "sol"
            groundNormal = hit.normal.normalized;
            Quaternion targetRot = Quaternion.FromToRotation(transform.up, groundNormal) * transform.rotation;
            transform.rotation = Quaternion.Lerp(transform.rotation, targetRot, smoothRot * Time.deltaTime);
        }
        else
            //on est dans le vide
            onGround = false;

        if (!onGround)
        {
            //si on touche pas le sol on applique la gravité
            rb.AddForce(groundNormal * -gravity);
        }
        else
        {
            //si on est au sol on peut sauter
            float j = Input.GetAxis("Jump");
            if (j != 0)
                rb.AddForce(transform.up * jumpForce * jumpHeight );

        }
        //et dans tous les cas on peut avancer
        float x = Input.GetAxis("Vertical") * Time.deltaTime * speedMove;
        transform.Translate(x, 0, 0);
    }
}

Re: Mouvement de rotation dans un torus

Publié : 26 Juil 2020 16:31
par Max
petite question : as-tu besoin de la physique ? est-ce que cela fait parti de ton gameplay
Parce que sinon, si c'est juste pour déplacer une capsule à l’intérieur d'un torus, pas besoin de la physique, juste d'un peu de trigo ;)

Re: Mouvement de rotation dans un torus

Publié : 26 Juil 2020 18:12
par Exsize
Malheureusement oui...

Le joueur va courir dans le torus et éviter des obstacles. La physique de mon jeu est dans le même style que le jeu « run around »

https://play.google.com/store/apps/deta ... rena&gl=FR

J’aurai peut être du commencer par là pour vous expliquez :?

Re: Mouvement de rotation dans un torus

Publié : 26 Juil 2020 18:44
par Max
Dans ce cas, le code que tu fournis semble être une base de départ, moyennant quelques ajustements.
A la louche et en le reprennant:

Code : Tout sélectionner

   void Start()
    {
        rb = GetComponent<Rigidbody>();
        rb.useGravity = false;
        rb.constraints = RigidbodyConstraints.FreezeRotation;
    }


    private void FixedUpdate()
    {
        //et dans tous les cas on peut avancer
        float x = Input.GetAxis("Vertical") * Time.deltaTime * speedMove;
        transform.Translate(x, 0, 0);

        //Envoie un rayon verticalement vers le bas
        RaycastHit hit = new RaycastHit();
        Ray ray = new Ray(transform.position, -transform.up);

        if (Physics.Raycast(ray, out hit, Mathf.Infinity))
        {
            //si le player est tout près du sol = true
            onGround = hit.distance < ((sizeCapsule/2.0f)+0.1f);

            //applique la rotation pour que le player soit perpendiculaire au "sol"
            groundNormal = hit.normal.normalized;
            Quaternion targetRot = Quaternion.FromToRotation(transform.up, groundNormal) * transform.rotation;
            transform.rotation = Quaternion.Lerp(transform.rotation, targetRot, smoothRot * Time.deltaTime);
        }
        else
        {    //on est dans le vide
            onGround = false;
        }


        if (!onGround)
        {
            //si on touche pas le sol on applique la gravité
            rb.AddForce(groundNormal * -gravity);
        }
        else
        {
            //si on est au sol on peut sauter
            float j = Input.GetAxis("Jump");
            if (j != 0)
            { 
                rb.AddForce(transform.up * jumpForce);
                Debug.Log("JUMP");
            }

        }
    }

Re: Mouvement de rotation dans un torus

Publié : 27 Juil 2020 11:30
par Exsize
Merci de tes réponses !

Néanmoins ma capsule est seulement attiré par le torus donc la gravité marche mais la capsule ne se déplace pas autour. dès lors que la capsule touche le torus plus rien ne se passe. De plus il y a toujours ce petit tremblement de la capsule qui survient même quand cette dernière est dans les aires.

Tout cela est bien compliqué et peut être irréalisable en 3d je ne sais pas.

Je cherche moi aussi de mon coté une solution mais si tu as une idée je suis preneur !

Re: Mouvement de rotation dans un torus

Publié : 27 Juil 2020 11:56
par Max
Bonjour,

je viens de tester vite fait, et cela fonctionne pas mal (code que j'ai posté plus haut). Peut-être une histoire de réglage de ton coté.
(après, gérer la physique, on le répète souvent, c'est pointu)

Image