IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Mathématiques Discussion :

Algorithme corde ninja


Sujet :

Mathématiques

  1. #1
    Membre émérite Avatar de onilink_
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    597
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 597
    Points : 2 443
    Points
    2 443
    Par défaut Algorithme corde ninja
    Bonjour,
    je bosse actuellement sur un platformer, et je suis confronté a un soucis, je n'ai pas les compétences requises pour implémenter un élément physique important dans le gameplay du jeu.
    Il s'agit d'une corde/grapin, et je cherche a avoir un rendu proche de worms (donc collisions entre la corde et les décors) mais avec une corde plus souple (comme dans final ninja pour ceux qui connaissent).

    Je suis donc confronté a 2 soucis. Déjà niveau algorithmique je n'arrive pas a définir toutes les étapes, ensuite mathématiquement mes connaissances sont un peu limitées...


    Déjà, sur quel système s'appuyer? Pendulum|Spring? Sachant que mon moteur physique est basé sur la velocité de mon objet (et pas seulement ses coordonnées)... Final ninja utilise un système de spring d'après son auteur.


    Après le système en lui même j'ai fait des essais et je bloque sur la contrainte qui lie la corde au personnage, et donc l’empêche de s'allonger.
    Par exemple mon perso est accroché a un point de coordonnées (cx, cy).

    J'ai essayé ceci mais ça donne un effet élastique indésirable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    x et y => position personnage
    cx et cy => point d'accroche de la corde
    rope_len => taille max de la corde
     
    if(constraint)
    {
        dx = x - cx;
        dy = y - cy;
     
        len = sqrt(dx*dx + dy*dy);
     
        dx /= len;
        dy /= len;
     
        if(len > rope_len)
        {
            force = (len - rope_len) / rope_len;
            vx -= dx * force;
            vy -= dy * force;
        }
    }

    Ensuite au niveau collisions corde/décors, mon 'monde' est basé sur un système de tiles et je ne vois pas du tout commencer gérer la corde.
    J'imagine qu'il me faut une pile/liste contenant les point de collision entre ma corde et mon décor, et que la balancement doit se faire a partir du dernier point de collision ajouté a la pile, mais je ne vois pas du tout comment faire pour récupérer les points de collisions quand il le faut et construire cette liste...

    Comment arriver de l'étape 1 a l'étape 3?

    Merci de prendre un peu de votre temps pour m'éclairer et passez une agréable journée
    Circuits intégrés mis à nu: https://twitter.com/TICS_Game

  2. #2
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par onilink_ Voir le message
    J'ai essayé ceci mais ça donne un effet élastique indésirable
    C'est à dire ?

    Ca s'allonge trop vite/lentement ? Ou ca oscille autour du point d'équilibre ?


    Comment arriver de l'étape 1 a l'étape 3?
    Comme tu l'as dit, il faut trouver le point de contact corde/coin.

    C'est le coin pour lequel l'angle (extermité corde, origine corde, coin) est minimal.

    On peut approximer en disant que c'est à dire le coin pour lequel la distance horizontale jusqu'a la corde est minimale. Ca fonctionne si la droite n'est pas trop loin des blocs (par ex, ca ne marche pas si la corde est horizontale au départ)

    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  3. #3
    Membre émérite Avatar de onilink_
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    597
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 597
    Points : 2 443
    Points
    2 443
    Par défaut
    Bonsoir, merci pour votre attention.
    Le problème est que la corde s'allonge au delà de sa taille maximale. Plus la vitesse verticale du perso est grande, et plus l'allongement sera conséquent. Hors je souhaite qu'il y ai une contrainte bien plus forte, qui empêche vraiment la corde de donner l'air d'être élastique.
    J'avais testé autre chose en touchant directement les coordonnées mais ça me donnais un horrible effet saccadé.

    J'avais trouvé un très bon exemple ici, et en plus la personne donne les parties importantes du code. En revanche je n'ai pas compris son fonctionnement :/

    Pour le point de contact, je vais essayer de faire comme vous dites. Par contre, si la corde est horizontale, j'imagine qu'il suffit juste de faire la même chose mais en évaluant les distances droite/blocs a la verticale?
    Circuits intégrés mis à nu: https://twitter.com/TICS_Game

  4. #4
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par onilink_ Voir le message
    Pour le point de contact, je vais essayer de faire comme vous dites. Par contre, si la corde est horizontale, j'imagine qu'il suffit juste de faire la même chose mais en évaluant les distances droite/blocs a la verticale?
    hum... non. Ce que je voulais dire c'est que utiliser les distances horizontales ne fonctionne que si la position "actuelle" de la corde (avant contact) est proche de la position "finale" (après contact). Si la corde doit faire un arc de 90° avant de toucher un bloc, ca ne fonctionne pas.

    Pour que ca fonctionne dans tous les cas, il faut utiliser les angles. Le code d'exemple que tu as indiqué utilise d'ailleurs les angles.

    Le problème est que la corde s'allonge au delà de sa taille maximale. Plus la vitesse verticale du perso est grande, et plus l'allongement sera conséquent. Hors je souhaite qu'il y ai une contrainte bien plus forte, qui empêche vraiment la corde de donner l'air d'être élastique
    Je crois que je vois le problème. Tu as codé d'un coté le vecteur de déplacement du personnage (sans contrainte) et de l'autre tu cherches a coder un autre vecteur de déplacement qui contraint le personnage a rester au bout de la corde. Et ensuite tu veux ajouter les deux vecteurs.

    Cette approche est possible en théorie, mais c'est compliqué a mettre en oeuvre.

    Une idée plus simple, c'est de créer directement le vecteur de déplacement avec la contrainte de la corde. En clair, lorsque le personnage est au bout de la corde (tendue) il se déplace toujours en arc de cercle. D'après ce que j'ai vu, c'est la technique employée dans le code d'exemple que tu as indiqué.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  5. #5
    Membre émérite Avatar de onilink_
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    597
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 597
    Points : 2 443
    Points
    2 443
    Par défaut
    Bonjour, la solution de l'angle minimal fonctionne très bien. Je posterais une partie de mon code bientôt au cas ou quelqu'un en ai besoin

    Pour la contrainte de la corde j'ai opté pour une solution au rendu moins réaliste, mais fonctionnelle. Lorsque le joueur s'accroche je ne lui applique plus aucune force, et je le fait se déplacer seulement sur le cercle définis par la rotation autour de l'axe du crochet (en utilisant des coordonnées polaires).
    Pour l’accélération en fonction de l'angle j'utilise ceci:

    accelerationAngle -= cos(angle en radiants)
    angle += accelerationAngle
    angle *= 0.995 // friction

    Au final on se retrouve avec un rendu très proche de celui d'un pendule.

    Bonne journée, et merci pour votre aide
    Circuits intégrés mis à nu: https://twitter.com/TICS_Game

Discussions similaires

  1. Formalisation graphique des algorithmes
    Par David R. dans le forum Algorithmes et structures de données
    Réponses: 14
    Dernier message: 08/12/2012, 10h21
  2. Algorithme de randomisation ... ( Hasard ...? )
    Par Anonymous dans le forum Assembleur
    Réponses: 8
    Dernier message: 06/09/2002, 14h25
  3. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 22h18
  4. Recherche de documentation complète en algorithmes
    Par Anonymous dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 29/03/2002, 12h09
  5. Algorithme génétique
    Par Stephane.P_(dis Postef) dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 15/03/2002, 17h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo