Faire tourner un personnage (camera integre) avec la souris

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Avatar de l’utilisateur
Amethyste
Messages : 136
Inscription : 30 Mai 2013 22:37
Localisation : Vendée

Faire tourner un personnage (camera integre) avec la souris

Message par Amethyste » 02 Juin 2013 16:22

Bonjour à tous,

Mon premier soucis n'a pas tardé à arriver.

Cela fait quelques jours que je cherche mais je n'arrive pas à trouver la solution.

Je vous explique : J'aimerai que mon perso tourne en fonction de l'emplacement de la souris et tourne suivant l'axe des y.

Par contre il faudrait qu'il tourne tant que la souris n'est pas dans l'axe de la camera, et que plus on s’éloigne de l'axe plus il tourne vite.

J'ai essayé de passer via un GetAxis ("Mouse") et ca tourne bien mais il s’arrête lorsque la souris atteins le bord de l’écran.

J'ai aussi essayé avec des raycast mais je n'arrive pas à récupérer l'angle formé par le vecteur du raycast et le vecteur forward.

En ce qui concerne la rotation à proprement parlée il n'y a pas de soucis, je passe via

Code : Tout sélectionner

transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.Euler(0,angle,0), 0.5 * Time.deltaTime);
Si je rentre l'angle à la main, il tourne mais il me reste à calculer l'angle.

Auriez-vous une petite idée?

Merci à tous

Je vous met des images pour vous expliquer

Image

Avatar de l’utilisateur
Max
Messages : 8771
Inscription : 30 Juil 2011 13:57
Contact :

Re: Faire tourner un personnage (camera integre) avec la sou

Message par Max » 02 Juin 2013 16:53

As-tu regardé ce qui est fait dans la demo AngryBots ? cela semble être très proche de ce que tu cherches il me semble....
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

CorVuS
Messages : 56
Inscription : 25 Avr 2013 13:49

Re: Faire tourner un personnage (camera integre) avec la sou

Message par CorVuS » 02 Juin 2013 17:18

Tu nous dis "J'ai essayé de passer via un GetAxis ("Mouse") et ca tourne bien mais il s’arrête lorsque la souris atteins le bord de l’écran."

Question con:

Pourquoi si ça marche bien comme ça tu ne mets pas une conditions pour que quand ta souris atteints une certaine zone (près du bord de l'écran) ta rotation reste au max tant que la souris re-rentre pas dans la zone central ?.

Avatar de l’utilisateur
Amethyste
Messages : 136
Inscription : 30 Mai 2013 22:37
Localisation : Vendée

Re: Faire tourner un personnage (camera integre) avec la sou

Message par Amethyste » 03 Juin 2013 00:15

Finalement j'ai réussi à trouver un script qui faisait ce que je voulais.
Je l'ai étudié pour voir comment il fonctionnait et l'ai commenté pour pouvoir m'en servir et le modifier au besoin.

Par contre j'ai un soucis sur une fonction utilisée

A un moment du script il y a une fonction ClampAngle qui reçois trois paramètres et retourne un Mathf.Clamp

Voici la fonction en question

Code : Tout sélectionner

static function ClampAngle (angle : float, min : float, max : float) : float { 
   if (angle < -360.0) 
      angle += 360.0; 
   if (angle > 360.0) 
      angle -= 360.0; 
   return Mathf.Clamp (angle, min, max); 
}
Même en ayant cherché sur le scripting reference : http://docs.unity3d.com/Documentation/S ... Clamp.html , J'ai du mal à saisir le but de cette fonction.

Si quelqu'un pouvait me l'expliquer ce serait super.

Pour info voila le script que j'ai commenté en français, si ça peux être utile à qqn d'autres alors tant mieux

PS : il n'y a que la rotation, il faut implémenter le mouvement, mais ça, c'est de loin le plus simple à mettre dans ce genre de script

Code : Tout sélectionner

@script AddComponentMenu ("Camera-Control/Mouse Look JS") 

//variables publiques
var sensitivityX : float = 5; //reglage de la sensibilité de la souris en x
var sensitivityY : float = 5; //reglage de la sensibilité de la souris en y
var minimumX : float = -360; //le min et max de rotation que l'on peux avoir sur x
var maximumX : float = 360; 
var minimumY : float = -60; //le min et le max de rotation que l'on peux avoir sur y
var maximumY : float = 60; 

//variables privées
private var rotationX : float = 0; //la rotation de depart en x
private var rotationY : float = 0; //la rotation de depart en y
private var originalRotation : Quaternion; //Quaternion contenant la rotation de départ

function Start () { 

	originalRotation = transform.localRotation; //la rotation de depart est la rotation locale du transform
} 

function Update () { 

      //on recupere les getaxis de la souris, on multiplie par la sensibilité et on calcule la rotation
      rotationX += Input.GetAxis("Mouse X") * sensitivityX;
      rotationY += Input.GetAxis("Mouse Y") * sensitivityY; 
	
      rotationX = ClampAngle (rotationX, minimumX, maximumX); 
      rotationY = ClampAngle (rotationY, minimumY, maximumY); 
       
      //on prepare la rotation en x autour de l'axe y
      var xQuaternion = Quaternion.AngleAxis (rotationX, Vector3.up); 
      //on prepare la rotation autour de l'axe x
      var yQuaternion = Quaternion.AngleAxis (rotationY, Vector3.left); 
      //on effectue la rotation
      transform.localRotation = originalRotation * xQuaternion * yQuaternion; 
} 


static function ClampAngle (angle : float, min : float, max : float) : float { 
   if (angle < -360.0) 
      angle += 360.0; 
   if (angle > 360.0) 
      angle -= 360.0; 
   return Mathf.Clamp (angle, min, max); 
}
En tout cas merci à tous de m'avoir aidé

Avatar de l’utilisateur
Titan
Messages : 582
Inscription : 12 Sep 2011 13:54
Contact :

Re: Faire tourner un personnage (camera integre) avec la sou

Message par Titan » 03 Juin 2013 10:37

la fonction que tu a trouvé clamp un angle, tu lui donne ton angle et elle te retourne la valeur clamp entre le min et le max, par exemple:
input: angle 92, min 45, max 90; output 90
input: angle 43, min 45, max 90; output 45
input: angle 67, min 45, max 90; output 67
les 2 premières lignes servent à faire un "modulo google*" sur ton angle pour conserver une valeur entre -360 et 360 (2 tours donc), en pratique je comprend pas trop l’intérêt, parce que si tu lui passe:
input: angle 361, min 180, max 360; output 180 (361 => 1 => 180), alors que le comportement attendu, de mon point de vue, serais d'obtenir 360.

* x mod y = x - y * E(x / y). à la place du traditionnel x % y = x - y * iPart(x / y)
____________________________________________
Hop Boy

Avatar de l’utilisateur
Amethyste
Messages : 136
Inscription : 30 Mai 2013 22:37
Localisation : Vendée

Re: Faire tourner un personnage (camera integre) avec la sou

Message par Amethyste » 03 Juin 2013 14:00

Merci Titan

Donc en gros si retourne la valeur min si la valeur envoyée est inférieure à la valeur min, la valeur max si la valeur envoyée est supérieure à la valeur max ou la valeur si c'est entre les deux.

Merci de ton explication.

Concernant les deux lignes du milieu je regarderais plus en détail maintenant que je sait comment fonctionne le clamp.

Merci encore.

Répondre

Revenir vers « Scripting »