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

Unreal Engine Discussion :

[UDK] Rotation et quaternion


Sujet :

Unreal Engine

  1. #1
    Acropole
    Invité(e)
    Par défaut [UDK] Rotation et quaternion
    Salut,

    J'essaye de programmer les mouvements de vaisseaux spatiaux avec le code suivant, mais l'axe Z tourne brusquement n'importe quand :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    function UpdateRotation( float DeltaTime )
    {
        local Rotator    DeltaRot, newRotation, ViewRotation;
        local vector X, Y, Z, FinalRot;
        local Quat XQuat, YQuat, ZQuat, EndQuat;
     
     
        ViewRotation = Rotation;
     
        if (Pawn!=none)
        {
            Pawn.SetDesiredRotation(ViewRotation);
        }
     
        GetAxes(Rotation, X, Y, Z);
     
        YQuat = QuatFromAxisAndAngle( Y, PlayerInput.aLookUp );
        ZQuat = QuatFromAxisAndAngle( Z, PlayerInput.aTurn * - 1.0);
     
        EndQuat = QuatProduct( YQuat, ZQuat );
        DeltaRot = QuatToRotator(EndQuat);
     
        //FinalRot = PlayerInput.aTurn*Y + PlayerInput.aLookUp*Z;
        //DeltaRot.Roll    = 0;
        DeltaRot.Yaw    /= 100;
        DeltaRot.Pitch    /= 100;
     
        ProcessViewRotation( DeltaTime, ViewRotation, DeltaRot );
        SetRotation(ViewRotation);
     
        ViewShake( deltaTime );
     
        //NewRotation = ViewRotation;
        //NewRotation.Roll = Rotation.Roll;
        //NewRotation.Roll = 0;
     
        if ( Pawn != None )
            Pawn.FaceRotation(ViewRotation, deltatime);
        GetAxes(Pawn.Rotation, X, Y, Z);
     
     
    }
    Quelqu'un comprend-t-il où j'ai fait une erreur ?
    Ou est-ce encore une surprise d'Epic qui fait foirer mon code avec leur code natif ?

    Je précise que j'hérite de UTPawn et UTPlayerController (pour le code ci dessus)

  2. #2
    Expert éminent
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Points : 6 812
    Points
    6 812
    Par défaut
    As tu essayé sans passé par les quaternions :
    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
    22
    23
    24
    25
    26
    27
    function UpdateRotation( float DeltaTime )
    {
        local Rotator    DeltaRot, newRotation, ViewRotation;
        local vector X, Y, Z, FinalRot;
     
        ViewRotation = Rotation;
     
        if (Pawn!=none)
        {
            Pawn.SetDesiredRotation(ViewRotation);
        }
     
        DeltaRot.Yaw    = PlayerInput.aTurn * -1.0;
        DeltaRot.Pitch   = PlayerInput.aLookUp;
     
        ProcessViewRotation( DeltaTime, ViewRotation, DeltaRot );
        SetRotation(ViewRotation);
     
        ViewShake( deltaTime );
     
        NewRotation = ViewRotation;
        NewRotation.Roll = Rotation.Roll;
     
        if ( Pawn != None )
            Pawn.FaceRotation(ViewRotation, deltatime);
     
    }
    Mes Tutos DirectX, OpenGL, 3D : http://raptor.developpez.com/

  3. #3
    Acropole
    Invité(e)
    Par défaut
    oui, j'ai déjà essayé, ça aboutit a un gimbal lock.

    Pourquoi le -1 ? ça inverse la souris, c'est pas cool.

  4. #4
    Expert éminent
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Points : 6 812
    Points
    6 812
    Par défaut
    Citation Envoyé par Acropole Voir le message
    oui, j'ai déjà essayé, ça aboutit a un gimbal lock.
    Tu veux quoi comme mouvement exactement ?
    Si tu veux faire une rotation du yaw du pawn, tu dois appliquer ton DeltaRot sur ton Pawn .. donc calculer le Delta avant le SetDesiredRotation.

    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
    22
    23
    24
    25
    26
    27
    function UpdateRotation( float DeltaTime )
    {
        local Rotator    DeltaRot, newRotation, ViewRotation;
        local vector X, Y, Z, FinalRot;
     
        ViewRotation = Rotation;
     
        DeltaRot.Yaw    = PlayerInput.aTurn ;
        DeltaRot.Pitch   = PlayerInput.aLookUp;
     
        ProcessViewRotation( DeltaTime, ViewRotation, DeltaRot );
        SetRotation(ViewRotation);
     
        if (Pawn!=none)
        {
            Pawn.SetDesiredRotation(ViewRotation);
        }
     
        ViewShake( deltaTime );
     
        NewRotation = ViewRotation;
        NewRotation.Roll = Rotation.Roll;
     
        if ( Pawn != None )
            Pawn.FaceRotation(NewRotation, deltatime);
     
    }
    Après, il faut peut etre regarder pour ne pas heriter de UTPawn (et UTPC..) mais plutot de Pawn (et PlayerController) pour éviter les effet de bord spécific à UT et prendre UT comme exemple d'application.

    Citation Envoyé par Acropole Voir le message
    Pourquoi le -1 ? ça inverse la souris, c'est pas cool.
    J'ai repris le -1 de ton code .. je pensais que tu voulais inverser la souris justement
    Mes Tutos DirectX, OpenGL, 3D : http://raptor.developpez.com/

  5. #5
    Acropole
    Invité(e)
    Par défaut
    C'est marrant j'ai pensé a mettre le code avant setdesiredrotation juste avant de venir sur le forum, mais je me suis dis que comme la fonction est exécuté a chaque tick ça change rien, le rotation du début est celui de l'appel précédent, donc modifié par les quaternions.
    J'ai quand même essayé, ça change rien.

    Le -1 est nécessaire avec les quaternions, avec les rotator c'est le contraire... va comprendre Charles...

    En héritant de pawn ça change rien, sauf que la camera est a la troisième personne

  6. #6
    Expert éminent
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Points : 6 812
    Points
    6 812
    Par défaut
    Citation Envoyé par Acropole Voir le message
    C'est marrant j'ai pensé a mettre le code avant setdesiredrotation juste avant de venir sur le forum, mais je me suis dis que comme la fonction est exécuté a chaque tick ça change rien, le rotation du début est celui de l'appel précédent, donc modifié par les quaternions.
    J'ai quand même essayé, ça change rien.

    Le -1 est nécessaire avec les quaternions, avec les rotator c'est le contraire... va comprendre Charles...

    En héritant de pawn ça change rien, sauf que la camera est a la troisième personne
    Tu es en FirstPerson ? Tu expliquer ce que tu veux comme rotation du pawn et de la camera (du PC du coup ..) ?

    (pour changer la cam par defaut, surcharge GetDefaultCameraMode).
    Mes Tutos DirectX, OpenGL, 3D : http://raptor.developpez.com/

  7. #7
    Acropole
    Invité(e)
    Par défaut
    Dans un fps classique l'axe vertical (Z) est toujours vers le haut.
    Ici je veux qu'il tourne en même temps que le joueur regarde vers le haut ou le bas.
    Par exemple si le joueur regarde vers le bas l'axe Z deviens horizontal et, dans ce cas, si le joueur regarde vers la droite ou la gauche (donc tourne autour de son axe Z) l'axe Z horizontal soit pris en compte.

    Télécharge la démo sur mon site, tu verra ce que ça donne. Mais là je m'étais servit des matrice en C++ et opengl.

  8. #8
    Expert éminent
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Points : 6 812
    Points
    6 812
    Par défaut
    Citation Envoyé par Acropole Voir le message
    Dans un fps classique l'axe vertical (Z) est toujours vers le haut.
    Ici je veux qu'il tourne en même temps que le joueur regarde vers le haut ou le bas.
    Par exemple si le joueur regarde vers le bas l'axe Z deviens horizontal et, dans ce cas, si le joueur regarde vers la droite ou la gauche (donc tourne autour de son axe Z) l'axe Z horizontal soit pris en compte.

    Télécharge la démo sur mon site, tu verra ce que ça donne. Mais là je m'étais servit des matrice en C++ et opengl.
    Donc alors, ce que tu veux, c'est ton pawn qui tourne autour de l'axe Y (local). Première chose, je pense que tu dois le passer en PHYS_None ( ou autre que PHYS_Walking ..., spider peut etre..) Il doit y avoir du clamp quelque part dans le code physique pour éviter les renversements.

    De plus, tu dois utiliser le LookUp sur le Pitch de ton orientation précédente (il me semble que LookUp se cumule ... mais verifie ses valeurs pour obtenir un delta). Donc DeltaRot.Pitch = Input.aLookUp.

    Enfin, tu dois repartir de ton Pawn.Rotation ... et non Rotation simplement qui est la Rotation du PC. Essaye donc de faire ViewRotation = Pawn.Rotation.

    Donc pour une rotation simple sur le Yaw, ça devrait donner :
    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
    22
    23
    24
    25
    26
    27
    function UpdateRotation( float DeltaTime )
    {
        local Rotator    DeltaRot, newRotation, ViewRotation;
        local vector X, Y, Z, FinalRot;
     
        ViewRotation = Pawn.Rotation;
     
        if (Pawn!=none)
        {
            Pawn.SetDesiredRotation(ViewRotation);
        }
     
        DeltaRot.Pitch   = PlayerInput.aLookUp;
     
        ProcessViewRotation( DeltaTime, ViewRotation, DeltaRot );
     
        SetRotation(ViewRotation);
        ViewShake( deltaTime );
     
        NewRotation = ViewRotation;
        NewRotation.Roll = Rotation.Roll;
     
        if ( Pawn != None )
    {
            Pawn.FaceRotation(ViewRotation, deltatime);
     
    }
    (Attention, dans FaceRotation, il met le Pitch à 0 en PHYS_Walking, cf Pawn.uc)
    Mes Tutos DirectX, OpenGL, 3D : http://raptor.developpez.com/

  9. #9
    Acropole
    Invité(e)
    Par défaut
    J'ai rajouté le Yaw :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    function UpdateRotation( float DeltaTime )
    {
        local Rotator    DeltaRot, newRotation, ViewRotation;
        local vector X, Y, Z, FinalRot;
     
        ViewRotation = Pawn.Rotation;
     
        if (Pawn!=none)
        {
            Pawn.SetDesiredRotation(ViewRotation);
        }
     
        DeltaRot.Pitch   = PlayerInput.aLookUp;
        DeltaRot.Yaw   = PlayerInput.aTurn;
     
        ProcessViewRotation( DeltaTime, ViewRotation, DeltaRot );
     
        SetRotation(ViewRotation);
        ViewShake( deltaTime );
     
        NewRotation = ViewRotation;
        NewRotation.Roll = Rotation.Roll;
     
            if ( Pawn != None )
        {
                Pawn.FaceRotation(ViewRotation, deltatime);
     
        }
    }
    Il y'a toujours le gimbal lock et, à ma connaissance, il n'y a que deux moyen de l'éviter : les matrices et les quaternions.

    Le pawn est en PHY_Flying.

  10. #10
    Expert éminent
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Points : 6 812
    Points
    6 812
    Par défaut
    Citation Envoyé par Acropole Voir le message
    J'ai rajouté le Yaw :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    function UpdateRotation( float DeltaTime )
    {
        local Rotator    DeltaRot, newRotation, ViewRotation;
        local vector X, Y, Z, FinalRot;
     
        ViewRotation = Pawn.Rotation;
     
        if (Pawn!=none)
        {
            Pawn.SetDesiredRotation(ViewRotation);
        }
     
        DeltaRot.Pitch   = PlayerInput.aLookUp;
        DeltaRot.Yaw   = PlayerInput.aTurn;
     
        ProcessViewRotation( DeltaTime, ViewRotation, DeltaRot );
     
        SetRotation(ViewRotation);
        ViewShake( deltaTime );
     
        NewRotation = ViewRotation;
        NewRotation.Roll = Rotation.Roll;
     
            if ( Pawn != None )
        {
                Pawn.FaceRotation(ViewRotation, deltatime);
     
        }
    }
    Il y'a toujours le gimbal lock et, à ma connaissance, il n'y a que deux moyen de l'éviter : les matrices et les quaternions.

    Le pawn est en PHY_Flying.
    Ok, je comprends (j'avais du mal avec le gimble lock vu que j'ai jamais fait de dev d'avion )

    Ici, le DeltaRot est calculé en global. Tu peux essayer de passer par les vecteurs directeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    local Vector CurrentDirection;
     
    DeltaRot.Pitch   = PlayerInput.aLookUp;
    DeltaRot.Yaw   = PlayerInput.aTurn;
    CurrentDirection = Vector( Pawn.Rotation );
    CurrentDirection = CurrentDirection >> DeltaRot;
    ViewRotation = Rotator( CurrentDirection );
    L'opérateur >> amène un vecteur dans le repère associé au rotator.
    Par contre, il te reste a intercaller les ProcessView, FaceRotation, & co ...
    C'est pas garantit que ça marche, mais c'est l'idée .. après je sèches
    Mes Tutos DirectX, OpenGL, 3D : http://raptor.developpez.com/

  11. #11
    Acropole
    Invité(e)
    Par défaut
    Ca marche pas, y'a toujours le gimbal lock et en plus certaines zones sont innaccessibles en regardant vers le bas ou le haut.
    Mais j'ai la preuve que le merdier vient d'unreal :

    DeltaRot = QuatToRotator(YQuat);

    En prenant uniquement le quaternion latéral (donc regarder vers le haut ou le bas) il y'a un blocage à +90 et -90°. Ce bloquage ne devrais pas être là puisse qu'en prenant le quaternion vertical (regarder a droite et a gauche) tout se passe comme il faut.

    Je hais unrealscript, depuis 2004...

  12. #12
    Acropole
    Invité(e)
    Par défaut
    Ok, je laisse tomber, ça fait 3 jours que j'y suis dessus sans succès alors que je viens de le faire en 5 minutes sur unity :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function Update () {
        transform.Rotate(Vector3.up, Input.GetAxis("Horizontal") * 10 * Time.deltaTime);
        transform.Rotate(Vector3.right, Input.GetAxis("Vertical") * -10 * Time.deltaTime);
    }

  13. #13
    Expert éminent
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Points : 6 812
    Points
    6 812
    Par défaut
    Citation Envoyé par Acropole Voir le message
    Ok, je laisse tomber, ça fait 3 jours que j'y suis dessus sans succès alors que je viens de le faire en 5 minutes sur unity :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function Update () {
        transform.Rotate(Vector3.up, Input.GetAxis("Horizontal") * 10 * Time.deltaTime);
        transform.Rotate(Vector3.right, Input.GetAxis("Vertical") * -10 * Time.deltaTime);
    }
    Pour laisser une dernière chance à Unreal Script, tu peux toujours ouvrir Object.uc et regarder les fonctions de math qui existe sur les rotator, vector et quaternion comme QuatRotateVector, TransformVectorByRotation ou les opérateur >> .
    Mes Tutos DirectX, OpenGL, 3D : http://raptor.developpez.com/

  14. #14
    Acropole
    Invité(e)
    Par défaut
    Je vois pas pourquoi, ça marche avec unity, sans prise de tête, sans code natif foireux et 1000 bMachin partout.
    L'UDK est un simple portage d'unreal et n'est vraiment destiné qu'a ceux qui ont payé la licence complète. Y'a qu'a voir l'outil, un super éditeur de map (les studios veulent pas s'emmerder avec ça) et rien pour les scripts (les studios utilisent Visueal Studio et le code source).
    Unrealscript a été trés mal pensé depuis le début et épic game n'a jamais voulu l'accepter, même si apparemment ils commencent a comprendre vu qu'ils veulent virer un max de code natif d'après la dernière mise à jour.
    1500$ pour unity c'est cher, mais si je peux faire mon jeu avec c'est toujours mieux que 99.99$ pour faire que des maps.

  15. #15
    Expert éminent
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Points : 6 812
    Points
    6 812
    Par défaut
    Citation Envoyé par Acropole Voir le message
    Je vois pas pourquoi, ça marche avec unity, sans prise de tête, sans code natif foireux et 1000 bMachin partout.
    C'est juste un problème de syntaxe selon moi ... Ce n'est pas de la programmation pure et dure.

    Citation Envoyé par Acropole Voir le message
    L'UDK est un simple portage d'unreal et n'est vraiment destiné qu'a ceux qui ont payé la licence complète. Y'a qu'a voir l'outil, un super éditeur de map (les studios veulent pas s'emmerder avec ça) et rien pour les scripts (les studios utilisent Visueal Studio et le code source).
    Il faut se dire que UDK est très récent. Ce n'est pas encore une API rodée par la communautée. Et c'est effectivement un moteur Pro qu'ils commencent tout juste à adapter leur moteur. Ils ont fait déjà un gros effort de com. sur les mailling list pro.

    Citation Envoyé par Acropole Voir le message
    Unrealscript a été trés mal pensé depuis le début et épic game n'a jamais voulu l'accepter, même si apparemment ils commencent a comprendre vu qu'ils veulent virer un max de code natif d'après la dernière mise à jour.
    1500$ pour unity c'est cher, mais si je peux faire mon jeu avec c'est toujours mieux que 99.99$ pour faire que des maps.
    UnrealScript a été penser pour "leurs" jeux. Mais c'est un point de vue qui se comprend. Ensuite, je suis d'accord qu'il n'est pas forcement adapté pour passer d'un FPS / TPS à un jeu de shoot spacial. Certaine orientations sont effectivement adapté à leurs productions. Je me verrais mal faire un RTS avec Unreal par exemple. UnrealScript a de gros avantage mais ce n'est pas forcement visible par UDK (par exemple, simplification de la sérialization, simplification de la réplication pour le réseau, génération automatique du code natif, etc ..)
    Mes Tutos DirectX, OpenGL, 3D : http://raptor.developpez.com/

  16. #16
    Acropole
    Invité(e)
    Par défaut
    Citation Envoyé par raptor70 Voir le message
    Il faut se dire que UDK est très récent. Ce n'est pas encore une API rodée par la communautée. Et c'est effectivement un moteur Pro qu'ils commencent tout juste à adapter leur moteur. Ils ont fait déjà un gros effort de com. sur les mailling list pro.
    .

    Unreal 3 est quand même sortis il y'a deux ans (ou trois, je sais plus), il y'a eu de nombreuses équipes de mods (plus le Make Something Unreal Contest) et, si on compare a ut 2003/2004 les changements au niveau des scripts ne sont pas radicaux. Donc on ne peux pas dire que l'UDK est récent. Ce qui est récent c'est la nouvelle licence qui permet de l'utiliser sans avoir acheté UT3 et quelques feature comme le nouveau système d'éclairage ou DLLBind. Mais on est loin du moteur tout neuf.


    Citation Envoyé par raptor70 Voir le message
    UnrealScript a été penser pour "leurs" jeux. Mais c'est un point de vue qui se comprend.
    Et c'est ce qui va lui porter fortement préjudice. Je pense qu'ils l'ont compris et c'est la raison pour laquelle il y'a maintenant le DLLBind et le passage progressif de code natif en script. C'est ce que leur avait d'ailleurs dit un gros ponte du jeux vidéo (le patron d'electronic arts je crois, ou un autre, même si ce genre de personne peut aussi annoncer de grosses conneries comme la fin des jeux solo...).

    Mais d'ici là j'aurais fini mon projet avec unity.

    PS : D'ailleurs ils n'ont pas annoncé le nombre de téléchargements des dernières mises à jour... Ca fait un bail que je connais unreal, j'ai utilisé pleins d'éditeurs de jeux, je programme dans plusieurs langages et vu comme je galère pour des tas de trucs je pense qu'il y'a un paquet de monde qui a déjà laissé tomber.

Discussions similaires

  1. Rotation avec quaternion selon un repère précis
    Par Scheb dans le forum Développement 2D, 3D et Jeux
    Réponses: 1
    Dernier message: 24/03/2013, 13h11
  2. Caméra, rotation et quaternions
    Par korsakoff69 dans le forum DirectX
    Réponses: 6
    Dernier message: 03/11/2008, 11h04
  3. Quaternions + rotations = confusion...
    Par Acropole dans le forum OpenGL
    Réponses: 13
    Dernier message: 15/09/2005, 13h16
  4. [Rotations] Rotations Locales/Globales avec Quaternions
    Par Clorish dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 24/05/2005, 16h41
  5. Quaternions et rotations
    Par CookSlash dans le forum OpenGL
    Réponses: 2
    Dernier message: 18/05/2004, 14h34

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