Page 2 sur 3

Re: [DB-AL] vitesse de diagonale différente sur le joystick

Publié : 17 Nov 2020 01:30
par adrenachrom
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:

Image

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

Publié : 17 Nov 2020 08:32
par Aelhan
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 :

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);
    }
}
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 ^^

Re: [DB-AL] vitesse de diagonale différente sur le joystick

Publié : 17 Nov 2020 10:57
par adrenachrom
Impeccable! Ca marche comme je l'espérais.
Je vais regarder en détail comment ça fonctionne.
Un grand merci à vous les gens ^^

Re: [DB-AL][RESOLU] vitesse de diagonale différente sur le joystick

Publié : 17 Nov 2020 11:52
par boubouk50
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.

Re: [DB-AL][RESOLU] vitesse de diagonale différente sur le joystick

Publié : 17 Nov 2020 14:25
par jmhoubre
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é.

Re: [DB-AL][RESOLU] vitesse de diagonale différente sur le joystick

Publié : 17 Nov 2020 14:46
par Aelhan
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

Re: [DB-AL][RESOLU] vitesse de diagonale différente sur le joystick

Publié : 17 Nov 2020 16:11
par boubouk50
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

Re: [DB-AL][RESOLU] vitesse de diagonale différente sur le joystick

Publié : 17 Nov 2020 17:49
par Aelhan
jmhoubre a écrit :
17 Nov 2020 14:25
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é.
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 !

Re: [DB-AL][RESOLU] vitesse de diagonale différente sur le joystick

Publié : 17 Nov 2020 18:17
par boubouk50
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.

Re: [DB-AL][RESOLU] vitesse de diagonale différente sur le joystick

Publié : 17 Nov 2020 19:05
par Aelhan
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 !