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

Pour les scripts écrits en C#
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
adrenachrom
Messages : 18
Inscription : 10 Avr 2019 23:40

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

Message par adrenachrom » 17 Nov 2020 01:30

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.

Avatar de l’utilisateur
Aelhan
Messages : 124
Inscription : 11 Déc 2019 23:00

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

Message par Aelhan » 17 Nov 2020 08:32

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 ^^
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.

adrenachrom
Messages : 18
Inscription : 10 Avr 2019 23:40

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

Message par adrenachrom » 17 Nov 2020 10:57

Impeccable! Ca marche comme je l'espérais.
Je vais regarder en détail comment ça fonctionne.
Un grand merci à vous les gens ^^

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

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

Message par boubouk50 » 17 Nov 2020 11:52

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.
"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

Avatar de l’utilisateur
jmhoubre
Messages : 851
Inscription : 05 Oct 2019 22:05

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

Message par jmhoubre » 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é.

Avatar de l’utilisateur
Aelhan
Messages : 124
Inscription : 11 Déc 2019 23:00

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

Message par Aelhan » 17 Nov 2020 14:46

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.

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

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

Message par boubouk50 » 17 Nov 2020 16:11

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
"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

Avatar de l’utilisateur
Aelhan
Messages : 124
Inscription : 11 Déc 2019 23:00

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

Message par Aelhan » 17 Nov 2020 17:49

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 !
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.

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

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

Message par boubouk50 » 17 Nov 2020 18:17

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.
"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

Avatar de l’utilisateur
Aelhan
Messages : 124
Inscription : 11 Déc 2019 23:00

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

Message par Aelhan » 17 Nov 2020 19:05

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 !
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.

Répondre

Revenir vers « (C#) CSharp »