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

Moteurs 3D Discussion :

skeleton : quel calcul effectuer?


Sujet :

Moteurs 3D

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 101
    Points : 75
    Points
    75
    Par défaut skeleton : quel calcul effectuer?
    bonjours,

    je suis en train de coder un moteur de fps pour un projet de fps avec une bonne équipe
    j'ai deja code plein de fonctions(afficher une map, mettre des collisions, une porte qui s'ouvre en appuyant sur enter, du texte,du brouillard, une skybox,de l'eau et de la neige(moteur de particule))

    j'aimerais creer des skeletons

    petite explications pour ceux qui ne connaissent pas :
    un skeleton est un modele qui ressemble a un squelette : compose de maillons relies entre eux. Si on bouge un maillon, il fait bouger les autres.

    le principe est simple sans utiliser la physique : il suffit de reproduire le meme deplacement a chaque objet mais avec la physique, la gravite viens tout compliquer :
    ex : si vous prenez un crayon par la pointe et que vous le levez, l'extrémité se rapproche de la position x,z de la pointe mais reste sur le sol tant que le distance y est inferieure a la taille du crayon.
    de plus, on a le meme genre de probleme avec de longues chaines de skeleton.

    est-ce que quelqu'un aurait une idee d'un algorithme que je pourrais appliquer?

    merci,
    delfare

    PS :
    voici ma struct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    typedef struct skeleton
    {
           float x,y,z;
     
           bool inchangeable;
           bool nogravity;
           int num_join;
           struct skeleton *join_skeleton[100];
           float distance[100];
    }skeleton;
    avec inchangeable si le maillon ne peut pas etre bougé et nogravity si le maillon n'est pas soumis a la gravité.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2006
    Messages : 16
    Points : 18
    Points
    18
    Par défaut
    Premièrement, il faut établir une hiérarchie entre les "maillons", une sorte d'arbre si tu veux de sorte que chaque maillon possède un maillon parent qu'il utilise comme référence. Deuxièmement, chaque maillon doit possèder une position et une orientation relative à son maillon parent. Tu peux représenter cela par un vecteur pour la position et un quaternion pour l'orientation. Quand vient le temps de construire le "skeleton", tu pars du maillon à la racine de l'arbre et tu parcours graduellement l'arbre. C'est ainsi que si tu modifie la position ou l'orientation d'un maillon, les autres maillons qui dépendent de lui vont aussi subir les même transformations. Tu effectues pour chaque maillon les transformations suivantes pour obtenir les positions et orientation absolues ( dans le "world coord system" ):

    maillon.position_abs = rotationVec3ParQuat(maillon.position_rel, maillon.parent.orientation_abs) + maillon.parent.position_abs

    maillon.orientation_abs = normalizeQuat( multQuat(maillon.parent.orientation_abs, maillon.orientation_rel) )

    inutile de dire que la position et l'orientation relatives de la racine de l'arbre correspondent déjà à sa position et son orientation absolues.

Discussions similaires

  1. Statistique avec R quel test effectuer?
    Par plnbdn dans le forum R
    Réponses: 0
    Dernier message: 29/09/2013, 10h09
  2. [WD17] Sur quel formulaire effectuer le SUBMIT ?
    Par zouzoukha dans le forum WinDev
    Réponses: 2
    Dernier message: 07/04/2013, 23h11
  3. Réponses: 1
    Dernier message: 27/06/2010, 08h33
  4. Réponses: 1
    Dernier message: 13/06/2008, 13h27
  5. Réponses: 2
    Dernier message: 19/02/2006, 15h08

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