Je développe un jeu vidéo indépendant et je travaille sous l'hypothèse selon laquelle la clémasse de mon contrôleur a une gamme de mouvement circulaire, elle renvoie des coordonnées "circulaires"; C'est-à-dire que les coordonnées cartésiennes contraintes à une zone circulaire (du rayon 1). En fait, les coordonnées sont "carrées"; E.G., la position de la passe-clé en haut à droite enregistre comme x = 1, y = 1. Lorsque je convertit les coordonnées de Cartesian en Polar, la magnitude peut dépasser 1 - ce qui a pour effet que le joueur puisse se déplacer plus rapidement en diagonale que possible verticalement ou horizontalement. P>
Ainsi, pour clarifier, je souhaite enregistrer la position d'une molette analogique en termes d'une direction et d'une magnitude, où la magnitude est comprise entre 0 et 1. La molette retourne les coordonnées sur un plan carré, ce qui permet simplement de convertir les coordonnées de Cartesian à Polar n'est pas suffisant. Je pense que je dois convertir la coordonnée espace em>, mais qui appuie sur les limites de mon cerveau de singe. P>
3 Réponses :
Divisez chaque valeur par la magnitude pour normaliser toutes les valeurs à un vecteur d'unité, par exemple Cependant, cela peut avoir l'effet de couper la magnitude au lieu de normaliser les valeurs intérieures. C'est-à-dire que vous aurez la même valeur pour un contrôleur poussé "complètement" dans le haut à gauche et un contrôleur presque em> poussé complètement dans la même direction. P> P>
Je ne veux vraiment pas clipser la magnitude. J'ai déjà un moratzone. Les deux ensemble réduiraient considérablement la plage de mouvement effective du bâton. Je pense que Eemeli a la bonne idée.
voir Cartographie d'un carré à un cercle . Il y a aussi une belle visualisation pour la cartographie. Vous obtenez:
Basé sur la visualisation, je pense que c'est exactement i> ce que je veux. Merci!
Le mappage n'est pas unique. Il y a beaucoup d'autres solutions à cette question. P>
Par exemple, cette cartographie fonctionnera également p>
u = x √ (x² + y² - x²y²) / √ (x² + y²) p>
v = y √ (x² + y² - x²y²) / √ (x² + y²) p> blockQuote>
où (u, v) strong> sont des coordonnées de disque circulaire et
(x, y) strong> sont des coordonnées carrées. P> Une image vaut mille mots, alors voici quelques images pour illustrer le non-unicité de la cartographie et de son inverse. P>
pour une implémentation C ++ code> de cette autre cartographie, allez à
http://squirculaire.blogspot.com/2015/09/fg-squircle -Mapping.html
Voir http://squircular.blogspot.com pour plus d'images de la cartographie des résultats. P>Voir aussi "Méthodes d'analyse pour la mise en place du disque" pour un papier discutant de différentes équations de cartographie avec des preuves et dérivations. p>
Joli. Comment avez-vous généré les chiffres (langue / bibliothèque)?
J'ai écrit un programme de traitement d'image simple en C ++ qui utilise différentes équations de cartographie par pixel. Voir le lien vers un lien de code. Libpng est une lecture utile et d'écrire des fichiers PNG
Est-ce que fait la place "entière" ou renvoie-t-il des coordonnées qui se trouvent dans quelque chose qui ressemble déjà à un cercle? Par exemple. Assurez-vous que vous pouvez (ou ne pouvez pas) prendre la magnitude SQRT.
Quoi (x, y) obtenez-vous avec le bâton vers le haut? De plus, votre stick est-il analogique ou commutateur? Pouvez-vous obtenir des valeurs telles que (0.5,0.5)?
Oui, les coordonnées sont distribuées sur un carré, y compris les coins.
Ensuite, je pourrais supprimer ma réponse. :-) On dirait que le logiciel de pilote pré-déformer les valeurs.
Nosredna: Je pense que tu as raison. Quelque chose (pilote? DirectInput?) Mappe aux coordonnées sur un carré. Je me demande pourquoi. Je préférerais presque toujours un cercle.
@Metaphile Ne soyez pas un tel cercle.