[DB-AL][RESOLU] vitesse de diagonale différente sur le joystick
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
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
-
- Messages : 18
- Inscription : 10 Avr 2019 23:40
Re: [DB-AL] vitesse de diagonale différente sur le joystick
Re,
Oui, mon rigidbody utilise la gravité mais je ne pense pas que ce soit la source du problème.
@Aelhan, voici un gif pour te montrer ce que j'ai et ce que j'essaye d'obtenir:
Le joystick renvoie une valeur entre 0 et 1. La valeur max sur chacun des axes est donc de 1. Sauf qu'en diagonale, ce n'est pas le cas ( ce qui parait logique spatialement, encore une fois ). Ce que j'aimerais c'est qu'en diagonale, la valeur max soit également de 1.
Jmhoubre me proposait d'utiliser NORMALIZE pour ça. Dans un sens ça marche puisqu'effectivement la valeur diagonale max devient 1. Le souci c'est que toutes les valeurs deviennent 1 à partir du moment ou je bouge le joystick, qu'il soit au maximum de son amplitude ou pas. Et ça ça m'intéresse pas. Je veux pouvoir faire marcher mon personnage à une vitesse variable en fonction de l'amplitude du joystick.
Oui, mon rigidbody utilise la gravité mais je ne pense pas que ce soit la source du problème.
@Aelhan, voici un gif pour te montrer ce que j'ai et ce que j'essaye d'obtenir:
Le joystick renvoie une valeur entre 0 et 1. La valeur max sur chacun des axes est donc de 1. Sauf qu'en diagonale, ce n'est pas le cas ( ce qui parait logique spatialement, encore une fois ). Ce que j'aimerais c'est qu'en diagonale, la valeur max soit également de 1.
Jmhoubre me proposait d'utiliser NORMALIZE pour ça. Dans un sens ça marche puisqu'effectivement la valeur diagonale max devient 1. Le souci c'est que toutes les valeurs deviennent 1 à partir du moment ou je bouge le joystick, qu'il soit au maximum de son amplitude ou pas. Et ça ça m'intéresse pas. Je veux pouvoir faire marcher mon personnage à une vitesse variable en fonction de l'amplitude du joystick.
Re: [DB-AL] vitesse de diagonale différente sur le joystick
Dans ce cas, l'idée qui me vient, ce serait de multiplier tes valeurs par racine de 2 (cos pi/4 = sin pi/4 = racine de 2), mais en clampant tes valeurs, ça donnerait un truc du genre :
Evidemment, je n'ai pas de joystick, donc pas simple pour tester, mais mathématiquement ça devrait fonctionner (j'ai mis -1 à 1 car je suppose que les valeurs gauche et bas sont négatives)
Edit : en voulant faire des tests, j'ai vu que c'était juste mal codé, mais là ça devrait fonctionner ^^
Code : Tout sélectionner
using UnityEngine;
public class ValeursJoystick : MonoBehaviour
{
public float valeurDeX;
public float valeurDeY;
public void CustomNormalize()
{
valeurDeX *= Mathf.Sqrt(2f);
valeurDeX = Mathf.Clamp(valeurDeX, -1f, 1f);
valeurDeY *= Mathf.Sqrt(2f);
valeurDeY = Mathf.Clamp(valeurDeY, -1f, 1f);
}
}
Edit : en voulant faire des tests, j'ai vu que c'était juste mal codé, mais là ça devrait fonctionner ^^
Celui qui pose une question risque cinq minutes d'avoir l'air bête.
Celui qui ne pose pas de question restera bête toute sa vie.
Celui qui ne pose pas de question restera bête toute sa vie.
-
- Messages : 18
- Inscription : 10 Avr 2019 23:40
Re: [DB-AL] vitesse de diagonale différente sur le joystick
Impeccable! Ca marche comme je l'espérais.
Je vais regarder en détail comment ça fonctionne.
Un grand merci à vous les gens ^^
Je vais regarder en détail comment ça fonctionne.
Un grand merci à vous les gens ^^
- boubouk50
- ModoGenereux
- Messages : 6222
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: [DB-AL][RESOLU] vitesse de diagonale différente sur le joystick
Pourquoi ne pas simplement utiliser ClampMagnitude?
Il permet de borner un vector3 à une valeur (ici 1), ainsi ton vector3 ne sera jamais plus grand que 1.
Il permet de borner un vector3 à une valeur (ici 1), ainsi ton vector3 ne sera jamais plus grand que 1.
"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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Re: [DB-AL][RESOLU] vitesse de diagonale différente sur le joystick
J'ai recherché encore la cause du problème. Peux-tu vérifier le paramétrage de ta manette ? Dans Edit > Project Settings, section Input Manager, regarde le Type des axes utilisés (Horizontal et Vertical). Est-il sur la valeur par défaut ("Key or Mouse Button") ou sur "Joystick Axis" ?
En réponse à Aelhan, son code fait ceci :
- multiplie l'input par environ 1.4
- clamp sur [-1, 1]
En fait cela marche aussi avec pi, racine(3), 100000, sin (exp (racine(666)))...
En fait tu n'as plus l'input du joystick sur [-1, 1], mais sur [-1/sat, 1/sat], sat étant le multiplicateur utilisé.
En réponse à Aelhan, son code fait ceci :
- multiplie l'input par environ 1.4
- clamp sur [-1, 1]
En fait cela marche aussi avec pi, racine(3), 100000, sin (exp (racine(666)))...
En fait tu n'as plus l'input du joystick sur [-1, 1], mais sur [-1/sat, 1/sat], sat étant le multiplicateur utilisé.
Re: [DB-AL][RESOLU] vitesse de diagonale différente sur le joystick
De ça que je comprends de ClampMagnitude ça devrait limiter la magnitude du vecteur donc la version "ce que j'ai" sur le gif alors que ce qu'il veut c'est qu'à la place de parcourir un cercle, c'est parcourir un carré. A moins que j'ai mal compris la fonction ClampMagnitude
Celui qui pose une question risque cinq minutes d'avoir l'air bête.
Celui qui ne pose pas de question restera bête toute sa vie.
Celui qui ne pose pas de question restera bête toute sa vie.
- boubouk50
- ModoGenereux
- Messages : 6222
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: [DB-AL][RESOLU] vitesse de diagonale différente sur le joystick
C'est moi qui suit à la ramasse, comme je suis sur un réseau protégé, je n'ai pas accès aux images et Gifs hébergés. Je suis allé voir avec mon téléphone, effectivement, ClampMagnitude ne change rien au résultat.
Il faut créer une déformation de cercle vers un carré, il existe des fonctions pour cela.
l'équation associée est:
x = ½ √( 2 + u² - v² + 2u√2 ) - ½ √( 2 + u² - v² - 2u√2 )
y = ½ √( 2 - u² + v² + 2v√2 ) - ½ √( 2 - u² + v² - 2v√2 )
avec
x = x (carré)
y = y (carré)
u = x (cercle) <- horizontal Joystick
v = y (cercle) <- vertical Joystick
qui est l'inverse de
u = x √( 1 - ½ y² )
v = y √( 1 - ½ x² )
Issu de la recherche Mapping a circle to a square sur un moteur de recherche et plus précisément de cette source:
https://stackoverflow.com/questions/132 ... n-a-square
Cela crée une déformation non linéaire par contre. Peut-être faut-il creuser les recherches pour un mapping simple et linéaire comme indiqué dans ce PDF (Simple Stretching Page 3)
https://arxiv.org/ftp/arxiv/papers/1509/1509.06344.pdf
J'ai trouvé ça: http://squircular.blogspot.com/2015/09/ ... pping.html
Il faut créer une déformation de cercle vers un carré, il existe des fonctions pour cela.
l'équation associée est:
x = ½ √( 2 + u² - v² + 2u√2 ) - ½ √( 2 + u² - v² - 2u√2 )
y = ½ √( 2 - u² + v² + 2v√2 ) - ½ √( 2 - u² + v² - 2v√2 )
avec
x = x (carré)
y = y (carré)
u = x (cercle) <- horizontal Joystick
v = y (cercle) <- vertical Joystick
qui est l'inverse de
u = x √( 1 - ½ y² )
v = y √( 1 - ½ x² )
Issu de la recherche Mapping a circle to a square sur un moteur de recherche et plus précisément de cette source:
https://stackoverflow.com/questions/132 ... n-a-square
Cela crée une déformation non linéaire par contre. Peut-être faut-il creuser les recherches pour un mapping simple et linéaire comme indiqué dans ce PDF (Simple Stretching Page 3)
https://arxiv.org/ftp/arxiv/papers/1509/1509.06344.pdf
J'ai trouvé ça: http://squircular.blogspot.com/2015/09/ ... pping.html
"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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Re: [DB-AL][RESOLU] vitesse de diagonale différente sur le joystick
Je ne suis pas d'accord quand tu dis que ça ferait la même chose avec d'autres valeurs, car avec Racine(2) la valeur va monter de façon linéaire jusqu'à atteindre 1 pile à la diagonale, avec pi, tu seras déjà à 1 en ayant à peine bougé... c'est de la trigo ! Testes avec tes valeurs et vois la différence, ma solution fait exactement ce qu'il cherche à faire sur son gif !jmhoubre a écrit : ↑17 Nov 2020 14:25J'ai recherché encore la cause du problème. Peux-tu vérifier le paramétrage de ta manette ? Dans Edit > Project Settings, section Input Manager, regarde le Type des axes utilisés (Horizontal et Vertical). Est-il sur la valeur par défaut ("Key or Mouse Button") ou sur "Joystick Axis" ?
En réponse à Aelhan, son code fait ceci :
- multiplie l'input par environ 1.4
- clamp sur [-1, 1]
En fait cela marche aussi avec pi, racine(3), 100000, sin (exp (racine(666)))...
En fait tu n'as plus l'input du joystick sur [-1, 1], mais sur [-1/sat, 1/sat], sat étant le multiplicateur utilisé.
Celui qui pose une question risque cinq minutes d'avoir l'air bête.
Celui qui ne pose pas de question restera bête toute sa vie.
Celui qui ne pose pas de question restera bête toute sa vie.
- boubouk50
- ModoGenereux
- Messages : 6222
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: [DB-AL][RESOLU] vitesse de diagonale différente sur le joystick
Aelhan,
le problème avec cette solution est que toutes les valeurs possibles sont multipliées par √2 (soit 1.414...).
Donc lorsque le Joytsick atteint √2/2 (soit 0.707...) soit un peu plus de 2/3 de son range, l'input vaudra déjà 1.
Chaque axe du joystick n'est donc plus sur un range [-1, 1] mais sur un range [-√2/2, √2/2]. Tu perds 1/3 de précision.
Utiliser une transformation de cercle vers un carré est plus juste.
le problème avec cette solution est que toutes les valeurs possibles sont multipliées par √2 (soit 1.414...).
Donc lorsque le Joytsick atteint √2/2 (soit 0.707...) soit un peu plus de 2/3 de son range, l'input vaudra déjà 1.
Chaque axe du joystick n'est donc plus sur un range [-1, 1] mais sur un range [-√2/2, √2/2]. Tu perds 1/3 de précision.
Utiliser une transformation de cercle vers un carré est plus juste.
"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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Re: [DB-AL][RESOLU] vitesse de diagonale différente sur le joystick
En fait non, je fais un petit erratum, en effet sin pi/4 = √(2)/2 (et non √(2) comme j'ai dit ce matin). Il faut donc diviser par √(2)/2 ce qui revient à multiplier par √(2) (car √(2)/2=1/√(2)).
Et le joystick atteint la valeur Racine(2)/2 uniquement à la diagonale, puisque c'est à la diagonale que sin(45°)=cos(45°)=√(2)/2 pas avant ! Seulement, lorsque l'angle est inférieur à 45°, la multiplication fait que le résultat du cos est >1 d'où le clamp. M'enfin, je pense que notre ami a exactement le résultat qu'il voulait, c'est le plus important !
Et le joystick atteint la valeur Racine(2)/2 uniquement à la diagonale, puisque c'est à la diagonale que sin(45°)=cos(45°)=√(2)/2 pas avant ! Seulement, lorsque l'angle est inférieur à 45°, la multiplication fait que le résultat du cos est >1 d'où le clamp. M'enfin, je pense que notre ami a exactement le résultat qu'il voulait, c'est le plus important !
Celui qui pose une question risque cinq minutes d'avoir l'air bête.
Celui qui ne pose pas de question restera bête toute sa vie.
Celui qui ne pose pas de question restera bête toute sa vie.