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

Unity Discussion :

Aligner deux Objets


Sujet :

Unity

  1. #1
    Membre à l'essai Avatar de TheLLspectre
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2014
    Messages : 43
    Points : 19
    Points
    19
    Par défaut Aligner deux Objets
    Bonjour,

    Je cherche à aligner deux objets:
    (la main du personnage, avec l'endroit où il regarde (empty)), l'empty sert de point de vue et donc de mobilité à la caméra.
    Et donc la main lorsqu'elle ramasse l'objet s'aligne avec l'empty, par animation pour permettre le déplacement du personnage.
    En revanche je voudrai qu'avec le déplacement de l'empty la main reste aligné avec, donc le pointe.


    Dans un premier temps j'ai testé ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if(WTake.tag == "Pistol")
    			{
    				characterContent.GetComponent.<Animation>().CrossFade("w_gun", 0.2);
    				var handle = GameObject.Find("right_arm").transform;
    				handle.transform.LookAt(targetView);
    			}
    Ce qui me donne un résultat pas mal du tout, étant donné que la main réagit bien au mouvement de la souris au même titre que l'empty le fait de base, mais ce n'est pas la bonne orientation Nom : image1.png
Affichages : 1187
Taille : 562,1 Ko

    Comme on peut le voir l'empty view est en face du personnage mais la main se trouve au dessus de la tête, l'axe X rouge devrait pointer vers l'empty.
    Il me faudrait une sorte de droite pour imager passant par l'empty et l'axe x du groupe de la main.
    Est ce que ça n'aurait pas un rapport avec la position local de l'objet ?
    Ca doit être tout bête mais je butes dessus ...

    Si vous y voyez une solution, c'est pas de refus
    Merci d'avance !

  2. #2
    Membre éclairé

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Points : 877
    Points
    877
    Billets dans le blog
    1
    Par défaut
    Je suis pas sûr d'avoir tout compris, mais le LookAt fait pointer z (forward) vers la target et non pas le x.

  3. #3
    Membre à l'essai Avatar de TheLLspectre
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2014
    Messages : 43
    Points : 19
    Points
    19
    Par défaut
    Tu as possiblement suffisamment compris , justement moi il faudrait que ce soit le X qui regarde, est ce que c'est possible ??
    Parce que le manuel propose que cela en option:
    "Parameters
    worldPosition Point to look at.
    worldUp Vector specifying the upward direction."

  4. #4
    Membre éclairé

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Points : 877
    Points
    877
    Billets dans le blog
    1
    Par défaut
    C'est un peut continuer de tordre le truc j'ai l'impression
    Passe par un GameObject intermédiaire, c'est lui que tu récupéreras pour ton LookAt, genre un "right_arm_socket".
    Maintenant le "right_arm" en enfant de "right_arm_socket", tu peux repositionner ton mesh sans rien casser (à moins que ce soit un squelette)

  5. #5
    Membre à l'essai Avatar de TheLLspectre
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2014
    Messages : 43
    Points : 19
    Points
    19
    Par défaut
    C'est un squelette !
    Tu proposes que je fasse un objet qui prenne la position, de la main qui aura un objet, c'est ça ? si c'est le cas c'est un procédé que j'utilise déjà pour les objets ramassés.
    Donc en résumé une fois l'objet ramassé la main prendrai la place de cet objet, et celui là serai enfant du point de vue pour pouvoir le suivre ?

  6. #6
    Membre éclairé

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Points : 877
    Points
    877
    Billets dans le blog
    1
    Par défaut
    Du coup je ne crois pas qu'il soit bon de modifier la hiérarchie ainsi.
    Je ne connais pas les squelettes, mais peut être que l'inverse kinematics pourrait répondre à ton problème.

  7. #7
    Membre à l'essai Avatar de TheLLspectre
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2014
    Messages : 43
    Points : 19
    Points
    19
    Par défaut
    J'ai regardé du coup l'inverse Kinematic, et peut être que ceci : Animator.SetLookAtPosition pouvait être intéressant...
    Mais il fonctionne avec l'Animator, hors j'en ai pas... et j'en ai pas besoin

    Parce que je fais ça maintenant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                                    var handle = GameObject.Find("right_arm").transform;
     
    				dhandle = targetView.position - handle.transform.position;
    				handle.transform.rotation = Quaternion.LookRotation(dhandle);
    Donc le mouvement est correcte ça fait ce que je veux sauf que j'ai toujours le bras qui vient dans une position de départ pointé vers le haut hors moi je veux qu'il soit pointé devant .... est ce que j'ai pas juste à lui affecté une rotation de 90° juste pour le réaligner ?

  8. #8
    Membre à l'essai Avatar de TheLLspectre
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2014
    Messages : 43
    Points : 19
    Points
    19
    Par défaut
    Je fais le bilan de tout ça:
    Rien n'a fonctionné !

    Donc j'ai tenté le LookAt(), et l'inverseKinematic, au final je me suis penché sur les Quaternions ce qui donne quelque chose de légèrement plus fluide.

    Mais le problème reste le même ..... le bras vient se placer de base au dessus de la tête.

    Je vous transmet les codes correspondant à l'action de ramasser et ensuite aligner

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    function TakeWeapon()
    {
    	TxtTake.text = "";
    	holdobject = true;
    	gun = true;
    	WTake.gameObject.GetComponent(Rigidbody).isKinematic = true; // ne tombe plus
    	WTake.transform.position = GameObject.Find("Hold/Drop").transform.position; //attache l'arme à l'empty de la main
    	WTake.gameObject.transform.parent = GameObject.Find("Hold/Drop").transform;//l'arme devient enfant de l'empty de la main
    	PosInitial = GameObject.Find("gun_pos_init").transform.position;//position que prendra l'arme
    	RotInitial = GameObject.Find("gun_pos_init").transform.rotation;//rotation que prendra l'arme
    	WTake.transform.position = PosInitial;//position que prend l'arme
    	WTake.transform.rotation = RotInitial;//position que prend l'arme
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    if(WTake.tag == "Pistol")
    			{
    				//characterContent.GetComponent.<Animation>().CrossFade("w_gun", 0.2);
    				var handle = GameObject.Find("right_arm").transform;
    				//handle.transform.LookAt(targetView);
    				dhandle = targetView.position - handle.transform.position; //Vecteur du deuxieme pointant vers le premier (dans la formule)
    				handle.transform.rotation = Quaternion.LookRotation(dhandle);
    				//handle.transform.Translate(0,0,-Input.GetAxis("Mouse Y") * 2);
    			}
    Nous y sommes presque il s'agit juste d'un problème de position !

  9. #9
    Membre éclairé

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Points : 877
    Points
    877
    Billets dans le blog
    1
    Par défaut
    Ceci pourra peut être t'aider a comprendre comment incliner correctement ton Transform;
    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
    using UnityEngine;
     
    public class LookAt : MonoBehaviour
    {
    	public enum Direction
    	{
    		Up,
    		Right,
    		Forward,
    		Down,
    		Left,
    		Back,
    	}
     
    	public Direction direction;
    	public Transform target;
     
    	void Update ()
    	{
    		Vector3 handle = transform.position - target.position;
    		switch(direction)
    		{
    		case Direction.Up:
    			transform.up = handle;
    			break;
    		case Direction.Right:
    			transform.right = handle;
    			break;
    		case Direction.Forward:
    			transform.forward = handle;
    			break;
    		case Direction.Down:
    			transform.up = -handle;
    			break;
    		case Direction.Left:
    			transform.right = -handle;
    			break;
    		case Direction.Back:
    			transform.forward = -handle;
    			break;
    		}
    	}
    }
    PS: Passe au C#

  10. #10
    Membre à l'essai Avatar de TheLLspectre
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2014
    Messages : 43
    Points : 19
    Points
    19
    Par défaut
    En faite, il s'agit d'une redéfinition de LookAt() !
    Ca semble relativement intéressant !

    Qu'est ce que le C# m'apportera de plus que le Javascript, parce que je ne suis pas un copain du C?

  11. #11
    Membre éclairé

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Points : 877
    Points
    877
    Billets dans le blog
    1
    Par défaut
    Bon après m’être mieux renseigné, je ne serais plus aussi catégorique vis avis de l'utilisation de l'unityscript (ce n'est pas tout à fait du javascript).
    Reste avec le langage sur lequel tu es le plus à l'aise.
    Trois points que je trouve cependant embêtant, c'est qu'il est spécifique à Unity, l'absence de la lib C#, et quelques fonctionnalités absente.

    Après il faut bien voire que le C et C# n'ont rien à voire. Le C# est plus haut niveau, il se rapprocherait plus du Java ou à la limite du C++/std(sans garbage collection)

  12. #12
    Membre à l'essai Avatar de TheLLspectre
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2014
    Messages : 43
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par PilloBuenaGente Voir le message
    Ceci pourra peut être t'aider a comprendre comment incliner correctement ton Transform;
    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
    using UnityEngine;
     
    public class LookAt : MonoBehaviour
    {
    	public enum Direction
    	{
    		Up,
    		Right,
    		Forward,
    		Down,
    		Left,
    		Back,
    	}
     
    	public Direction direction;
    	public Transform target;
     
    	void Update ()
    	{
    		Vector3 handle = transform.position - target.position;
    		switch(direction)
    		{
    		case Direction.Up:
    			transform.up = handle;
    			break;
    		case Direction.Right:
    			transform.right = handle;
    			break;
    		case Direction.Forward:
    			transform.forward = handle;
    			break;
    		case Direction.Down:
    			transform.up = -handle;
    			break;
    		case Direction.Left:
    			transform.right = -handle;
    			break;
    		case Direction.Back:
    			transform.forward = -handle;
    			break;
    		}
    	}
    }
    PS: Passe au C#
    Je suis revenue travailler un peu.
    Et cette classe là je ne vois pas de trop où la mettre je l'ai mis dans un nouveau js à part, mais je ne sais pas si il va me le prendre en compte dans ce cas là dans mes autres js utilisant du LookAt ? (en java ça aurait fonctionné c'est sûr).

    Et ensuite j'ai du le retranscrire en JS aussi, mais j'ai une erreur sur le switch(direction)
    BCE0051: Operator '==' cannot be used with a left hand side of type 'LookAt.Direction' and a right hand side of type 'System.Object'.


    EDIT:
    Je viens d'essayer quelque chose par hasard pour continuer à apprendre et je me demande du coup si je pourrai pas ajouter un component Fixed Joint de l'objet à la main !?

  13. #13
    Membre éprouvé
    Avatar de Garvelienn
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2016
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2016
    Messages : 244
    Points : 993
    Points
    993
    Par défaut
    Si le but est de pointer sur le right (axe X), il faut faire :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    object.lookAt(target, myUpVector); // pointe le forward sur la target (myUpVector étant généralement v(0,1,0))
    object.rotate(object.up, 90); // effectue une rotation de 90 sur l'axe Up pour que le right prenne la place du forward (ce dernier devenant -right en quelque sorte)

    C'est du pseudo code car je n'ai pas Unity sous la main, mais en théorie cela devrait marcher, Non ?
    «Le management, tel qu’on l’apprend dans les écoles et tel qu’on l’applique ensuite, sous prétexte de «motivation du personnel», organise exactement le contraire, à savoir la démotivation organisée.» - Bernard Stiegler

  14. #14
    Membre à l'essai Avatar de TheLLspectre
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2014
    Messages : 43
    Points : 19
    Points
    19
    Par défaut
    Citation Envoyé par Garvelienn Voir le message
    Si le but est de pointer sur le right (axe X), il faut faire :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    object.lookAt(target, myUpVector); // pointe le forward sur la target (myUpVector étant généralement v(0,1,0))
    object.rotate(object.up, 90); // effectue une rotation de 90 sur l'axe Up pour que le right prenne la place du forward (ce dernier devenant -right en quelque sorte)

    C'est du pseudo code car je n'ai pas Unity sous la main, mais en théorie cela devrait marcher, Non ?
    J'ai fait ça mais non ça ne marche toujours pas non plus, j'avais pensé aussi à faire une rotation de 90 mais je comprends pas ça fait rien de logique j'obtiens toujours les mêmes résultats.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    var handle = GameObject.Find("right_arm").transform;
    handle.LookAt(targetView, handle.up);
    handle.Rotate(handle.up, 90);
    En revanche avec ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    var handle = GameObject.Find("right_arm").transform;
    handle.LookAt(targetView);
    handle.Rotate(handle.right, 90);
    J'ai quelque chose d'un peu plus potable, mais là ou le bras est rigide sur l'axe vertical comme je le veux, il ne l'ait pas sur l'horizontal, ou il tourne plus vite que le personnage alors que le bras devrait rester à sa place en faite il ne devrait pas être affecté par une rotation

  15. #15
    Membre éprouvé
    Avatar de Garvelienn
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2016
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2016
    Messages : 244
    Points : 993
    Points
    993
    Par défaut
    Que donne le repère de la main (up,right,forward) juste après le lookat ? Le forward pointe bien sur le lookat ? Le right et le up ne sont pas inversé (up = -right théorique; right = up théorique)? Attention aux paramètres par défaut du lookat. Si le up n'est pas précisé, Vector.up sera pris. Et dans le cas du main qui fonctionne comme une rotule, cela peut poser problème.
    «Le management, tel qu’on l’apprend dans les écoles et tel qu’on l’applique ensuite, sous prétexte de «motivation du personnel», organise exactement le contraire, à savoir la démotivation organisée.» - Bernard Stiegler

Discussions similaires

  1. comparer deux objets pas si simple ?
    Par StIcK dans le forum Langage
    Réponses: 4
    Dernier message: 23/06/2006, 20h55
  2. [Javascript] Détecter collision de deux objets <img>
    Par Invité4 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 04/04/2006, 08h54
  3. [Débutant] Aligner deux divs sur une ligne avec inline
    Par Braz dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 09/03/2006, 10h52
  4. [vector] Partager une même variable entre deux objets.
    Par Ekinoks dans le forum SL & STL
    Réponses: 18
    Dernier message: 25/08/2005, 20h40
  5. Afficher deux objets superposés C++ Builder 6
    Par nicoistia dans le forum C++Builder
    Réponses: 2
    Dernier message: 12/03/2004, 15h09

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