rotation non instantané

Pour les scripts écrits en Javascript (UnityScript). :!: Obsolète :!:
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
thyma
Messages : 70
Inscription : 23 Juin 2015 12:25

rotation non instantané

Message par thyma » 11 Sep 2015 21:43

Bonjour il y a quelques mois j'ai pas mal galérer a faire un script de déplacements comprenant plusieurs type de gravité possible (attirer vers les murs, plafond et tout)
ici on m'a conseiller de faire plutôt pivoter le décors mais cette solution ne me plaisait pas trop parce que le jeu serrait en multi joueur, au final j'ai réussi a faire mon script (parce que mon QI s’élève a 10 000) et j'étais très content
depuis le jeu progresse petit a petit et quand j'ai voulus tester en ligne avec des amis et hamachi ils m'on dit que les changement de gravités étaient trop brusque voir dégelasse et totalement déroutant pour le joueur du coup je me demandais si au lieu de faire pivoter le personnage de 90° d'un coup on pouvait luis faire faire une rotation en quelque seconde pour que le joueur comprenne ce qui se passe.
Le problème c'est que j'ai pas trop d'idée donc je redemande de l'aide 3 mois après pour le même script ...
voici le code pour ceux qui veulent :

Code : Tout sélectionner

 var nom: String;
var cameraPlayer : GameObject;
var speed : float;
var jump = 8.0;
var gravity = 9.0;
public var graviti = "-y";
var Tete : GameObject;
var x = 0.0;
var y = 0.0;
var Sens = 0.0;
public var vie = 10;

deltaTime=Time.deltaTime;

private var controller:CharacterController;
private var moveDirection:Vector3;
private var deltaTime:float;



function Start (){
	controller = GetComponent("CharacterController");
	  if ( !GetComponent.<NetworkView>().isMine) //si ce perso ne m'appartient pas
{
 Destroy(cameraPlayer);
 this.enabled = false;
}
}

function Update (){
	
	if (vie <= 0){
		var go = GameObject.Find("menu");
   		go.GetComponent(apparaitre).estMort = true;
   	}

	y += Input.GetAxis("Mouse X") * Sens;
	x = -Input.GetAxis("Mouse Y") * Sens;

	if (graviti == "-y") {
		transform.rotation = Quaternion.Euler(0, y, 0);
		Tete.GetComponent.<Transform>().Rotate(Vector3(x,0,0));
		moveDirection = Vector3(Input.GetAxis("Horizontal") * speed, 0, Input.GetAxis("Vertical") * speed);
		moveDirection = transform.TransformDirection(moveDirection);
		if (controller.isGrounded == true){
			if (Input.GetButton ("Jump")) {
				moveDirection.y = jump;}}
		if (controller.isGrounded == false){
			moveDirection.y -= gravity * deltaTime;}
		controller.Move(moveDirection * deltaTime);
	}

	if (graviti == "+y") {
		transform.rotation = Quaternion.Euler(180, -y, 0);
		Tete.GetComponent.<Transform>().Rotate(Vector3(x,0,0));
		moveDirection = Vector3(Input.GetAxis("Horizontal") * speed, 0, Input.GetAxis("Vertical") * speed);
		moveDirection = transform.TransformDirection(moveDirection);
		if (controller.isGrounded == true){
			if (Input.GetButton ("Jump")) {
				moveDirection.y -= jump;}}
		if (controller.isGrounded == false){
			moveDirection.y += gravity * deltaTime;}
		controller.Move(moveDirection * deltaTime);
	}

	if (graviti == "+z") {
		transform.rotation = Quaternion.Euler(y, 90, -90);	
		Tete.GetComponent.<Transform>().Rotate(Vector3(x,0,0));
		moveDirection = Vector3(Input.GetAxis("Horizontal") * speed, 0, Input.GetAxis("Vertical") * speed);
		moveDirection = transform.TransformDirection(moveDirection);
		if (controller.isGrounded == true){
			if (Input.GetButton ("Jump")) {
				moveDirection.z = -jump;}}
		if (controller.isGrounded == false){
			moveDirection.z += gravity * deltaTime;}
		controller.Move(moveDirection * deltaTime);
	}

	if (graviti == "-z") {
		transform.rotation = Quaternion.Euler(y, -90, -90);	
		Tete.GetComponent.<Transform>().Rotate(Vector3(x,0,0));
		moveDirection = Vector3(Input.GetAxis("Horizontal") * speed, 0, Input.GetAxis("Vertical") * speed);
		moveDirection = transform.TransformDirection(moveDirection);
		if (controller.isGrounded == true){
			if (Input.GetButton ("Jump")) {
				moveDirection.z = jump;}}
		if (controller.isGrounded == false){
			moveDirection.z -= gravity * deltaTime;}
		controller.Move(moveDirection * deltaTime);
	}	
	
	if (graviti == "-x") {
		transform.rotation = Quaternion.Euler(y, 0 , -90);	
		Tete.GetComponent.<Transform>().Rotate(Vector3(x,0,0));
		moveDirection = Vector3(Input.GetAxis("Horizontal") * speed, 0, Input.GetAxis("Vertical") * speed);
		moveDirection = transform.TransformDirection(moveDirection);
		if (controller.isGrounded == true){
			if (Input.GetButton ("Jump")) {
				moveDirection.x = jump;}}
		if (controller.isGrounded == false){
			moveDirection.x -= gravity * deltaTime;}
		controller.Move(moveDirection * deltaTime);
	}

	if (graviti == "+x") {
		transform.rotation = Quaternion.Euler(-y, 0 , 90);	
		Tete.GetComponent.<Transform>().Rotate(Vector3(x,0,0));
		moveDirection = Vector3(Input.GetAxis("Horizontal") * speed, 0, Input.GetAxis("Vertical") * speed);
		moveDirection = transform.TransformDirection(moveDirection);
		if (controller.isGrounded == true){
			if (Input.GetButton ("Jump")) {
				moveDirection.x = -jump;}}
		if (controller.isGrounded == false){
			moveDirection.x += gravity * deltaTime;}
		controller.Move(moveDirection * deltaTime);
	}
} 

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6265
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: rotation non instantané

Message par boubouk50 » 14 Sep 2015 10:49

Le plus simple reste l'interpolation entre les différentes gravités. Au lieu d'attribuer directement la nouvelle gravité, passe par un Lerp entre la gravité actuelle et la prochaine.
Pour les quaternions il te faut utiliser Quaternion.Lerp ou Quaternion.Slerp
Pour le reste (si besoin) Mathf.Lerp
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

thyma
Messages : 70
Inscription : 23 Juin 2015 12:25

Re: rotation non instantané

Message par thyma » 14 Sep 2015 21:51

oui alors pour lerp et slerp sa pourrait marcher j'ai regarder sur internet un peu, par contre le problème c'est comment l'executer une seul fois ? parce que je veut en fait faire une jolie rotation progressive quand sa change de gravité mais qu'une fois qu'elle est terminé le joueur reprenne les controles ce qui ne serra pas le cas

Avatar de l’utilisateur
Iwa
Messages : 1131
Inscription : 25 Avr 2012 16:20
Contact :

Re: rotation non instantané

Message par Iwa » 15 Sep 2015 09:09

thyma a écrit :oui alors pour lerp et slerp sa pourrait marcher j'ai regarder sur internet un peu, par contre le problème c'est comment l'executer une seul fois ? parce que je veut en fait faire une jolie rotation progressive quand sa change de gravité mais qu'une fois qu'elle est terminé le joueur reprenne les controles ce qui ne serra pas le cas
http://docs.unity3d.com/ScriptReference/Mathf.Lerp.html

Tu lui donne ton mini et ton maxi (soit ton angle d'arrivée). Donc à priori un fois qu'il a atteint l'angle que tu voulais il cesse de lerpé. Tu as juste a donné la valeur min et max de ton lerp que ce soit bon :) puisqu'il n'y a que ça qui change quand tu tournes :)

Ensuite si tu veux vraiment être sûr qu'il cesse de lerpé tu peux rajouter un petit booléen qui te permettra de passer ou non dans cette partie de la boucle update :).
"N'est stupide que la stupidité Monsieur..." - Forest Gump
... sauf si tu lis pas ça :)

Si tu as tout ce qu'il te faut, merci de penser à basculer ton sujet en [RESOLU] en éditant ton tout premier post ;)

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6265
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: rotation non instantané

Message par boubouk50 » 15 Sep 2015 09:27

+1

Un lerp est un interpolation de 2 valeurs en fonction d'une 3e comprise entre 0 et 1. Cette 3e valeur détermine donc si tu es avant le changement (0), pendant le changement (0 à 1), après le changement (1).
Il est donc facile de savoir dans quel état ton perso pour lui allouer les bons contrôles.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

thyma
Messages : 70
Inscription : 23 Juin 2015 12:25

Re: rotation non instantané

Message par thyma » 15 Sep 2015 19:18

alors j'ai changé

Code : Tout sélectionner

transform.rotation = Quaternion.Euler(0, y, 0);
par

Code : Tout sélectionner

transform.rotation = Quaternion.Slerp (Quaternion.Euler(180, -y, 0), Quaternion.Euler(0, y, 0), Time.time * speed);
et j'ai eu la grosse surprise de voir que sa changeait absolument rien c'est comme si c'était la même ligne de code et c'est contre toute logique... Normalement la rotation devrait se faire doucement

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6265
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: rotation non instantané

Message par boubouk50 » 16 Sep 2015 09:31

Code : Tout sélectionner

transform.rotation = Quaternion.Slerp (Quaternion.Euler(180, -y, 0), Quaternion.Euler(0, y, 0), Time.time * speed);
Alors je sais pas si c'est l'exemple sur le site d'Unity qui est faux, mais le Slerp ne devrait pas fonctionner comme cela.
Ton 3e paramètre, l'interpolant, doit être compris entre 0 et 1. 0 représente le quaternion de départ Quaternion.Euler(180, -y, 0) et 1, le quaternion final Quaternion.Euler(0, y, 0). Toute valeur entre 0 et 1 représente un quaternion entre ses deux quaternions.

Pour faire une interpolation correcte, il faut donc que tu fasses en sorte que ton interpolant passe de 0 à 1 sur plusieurs frames. Par ex:

Code : Tout sélectionner

float interpolant = 0;
float speed = "ICI ta vitesse de rotation";
...
interpolant += Time.deltaTime * speed;
transform.rotation = Quaternion.Slerp (Quaternion.Euler(180, -y, 0), Quaternion.Euler(0, y, 0), interpolant);
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

thyma
Messages : 70
Inscription : 23 Juin 2015 12:25

Re: rotation non instantané

Message par thyma » 16 Sep 2015 18:54

ok merci j'essaye sa, plus un autre truque que j'avais aussi trouvé avec slerp et si sa marche je marque la solution

thyma
Messages : 70
Inscription : 23 Juin 2015 12:25

Re: rotation non instantané

Message par thyma » 16 Sep 2015 21:12

ok donc j'ai trouver la solution
pour ceux qui veulent
vous prenez le script que j'ai poser au début
vous virez la variable nom qui sert a rien
et a chaque début de gravité vous remplacez la première ligne par :

Code : Tout sélectionner

 transform.rotation = Quaternion.Slerp (transform.rotation, Quaternion.Euler(0, y, 0), 0.1); 
et c'est bon
ps : sa rajoute aussi un petit ralentissement au niveau de la souris, c'est tout a fait normale, certains trouveront sa chiant mais moi j'aime bien

Verrouillé

Revenir vers « (Js) Javascript »