« 1 (2) 3 4 »


Re: Programmer un archer à cheval
OverdOzed
Inscrit:
23/02/2006 18:10
De Alpes-Maritimes
Post(s): 2342
Hello !

Je t'avoue que je n'ai rien compris. Le coup du -1000 magic number, d'un point de vue code, c'est le genre de truc qui me met en pétard en entreprise.

Après, si tu sais ce dont il s'agit ou si tu continueras à savoir le pourquoi du comment, tant mieux ! Sinon, place au moins un commentaire dans ton code pour l'expliquer !

Contribution le : 03/11/2019 11:06
Créer un fichier PDF de la contribution Imprimer


Re: Programmer un archer à cheval
OverdOzed
Inscrit:
19/03/2016 15:30
De Belgique
Post(s): 1600
Bon finalement, je n'y arrive pas:

À chaque fois, j'ai un souci de type.

Voilà mon code de base:

rotcam3 = scene.objects['rot_cam3'].worldOrientation
euler_rotcam = rotcam3.to_euler() # convertis en euler
euler_rotcam[2] = math.degrees(obj['rot_arcX']/-1000) # definis coordonee z via degres
scene.objects['rot_cam3'].worldOrientation = euler_rotcam.to_matrix() + scene.objects['rot_cam3'].worldOrientation[2] # applique le changement et converti en matrice


Python n'accepte pas l'addition d'un vecteur + une matrice, ce que je comprends.

En réfléchissant, je me suis demandé s'il n'y aurai pas plus simple, car la manœuvre me semble bien compliquée pour une chose si simple. Du coup, j'ai fais ceci:

scene.objects['rot_cam3'].worldOrientation[2] = scene.objects['rot_cam3'].worldOrientation[2] + obj['rot_arcX']/-1000


Et là, pareil, vecteur + float = incompatible.

Donc, je dois m'arranger pour que la valeur que j'additionne soie elle aussi en vecteur mais est-ce possible de convertir en vecteur un float ???

Contribution le : 03/11/2019 11:13
Créer un fichier PDF de la contribution Imprimer


Re: Programmer un archer à cheval
OverdOzed
Inscrit:
23/02/2006 18:10
De Alpes-Maritimes
Post(s): 2342
Tu peux multiplier un vecteur par un autre vecteur (de même dimension et orientation) ou une matrice (⚠ dimensions). Pour une rotation, on utilise aussi très souvent les quaternions.

Tu peux aussi multiplier un vecteur par un scalaire (float).

Dans ton cas, il faut savoir ce que tu veux faire avec cette addition vecteur + scalaire car mathématiquement, ça n'existe pas.

La raison, c'est une question de taille (comme quoi, ceux qui disent que ça compte pas ont tort !). Un scalaire revient à un vecteur de dimension 1x1. Ta représentation Euler est un vecteur de taille 1x3 (ou 3x1). Or, on ne peut calculer que des choses qui ont au moins une dimension identique, comme une multiplication avec une matrice de rotation (de dimension 3x3 en 3D).

Est-ce que c'est additionner le scalaire à toutes les composantes du vecteur ?
V = [a b c]
Sc = 12
Sv = [Sc Sc Sc]

Résultat:
V + Sv = [a+Sc b+Sc c+Sc]


Si au contraire, tu ne veux additionner ton scalaire que pour une seule composantes, tu peux créer un vecteur ainsi (exemple pour seulement Y) :
Sadd = [0 Sc 0]

Résultat:
V + Sadd = [a+0 b+Sc c+0]


PS: je n'ai pas précisé, ce n'est pas du Python.

Ce type d'opération (appelée vectorisation) n'a rien "d'illégal" ou de hack. Ça se fait très très souvent par exemple en calcul parallélisé (shaders ou GPGPU, SIMD, ...).
https://fr.wikipedia.org/wiki/Vectorisation_(informatique)

Contribution le : 03/11/2019 18:56
Créer un fichier PDF de la contribution Imprimer


Re: Programmer un archer à cheval
OverdOzed
Inscrit:
19/03/2016 15:30
De Belgique
Post(s): 1600
Ça ne va pas, je comprends pas non plus ton explication

J'ai remplacé le "degrees" par "radians" et j'ai inversé la valeur pour que ce soit cohérent côté code comme côté effet sur le jeu.

J'arrive à contraindre mon objet entre 0 et 30°, mais je n'arrive pas à adapter l'orientation quand j'ai tourné la plate-forme. Quand je cliques, ça reviens entre 0 à 30 degrés (ça dépends la valeur de la propriété/variable).

J'ai remis à jour mon blend.

Je suis sans doute pas loin de la solution mais ça me dépasse mathématiquement.

Contribution le : 03/11/2019 19:41
Créer un fichier PDF de la contribution Imprimer


Re: Programmer un archer à cheval
OverdOzed
Inscrit:
23/02/2006 18:10
De Alpes-Maritimes
Post(s): 2342
Je vais jeter un oeil au blend, je suis pas sûr de comprendre non plus le problème.

Quant à mon explication, je vais reformuler de façon plus simple, j'espère.
Pour la question : oui, on peut "convertir" un float en vecteur.

En maths, on ne peut pas additionner un vecteur et un nombre. C'est pour ça que Python te renvoie une erreur.
On peut par contre additionner deux vecteurs entre eux.

Pour pouvoir additionner un nombre à un vecteur, il faut qu'ils aient la même forme : un vecteur de même taille (= nombre de valeurs).

Dans le cas où tu as un vecteur représentant les angles d'Euler, tu as un vecteur de 3 valeurs (yaw, pitch et roll).


Du coup, pour ton nombre, il doit lui aussi être sous la forme d'un vecteur de trois valeurs. C'est très simple : tu crées un vecteur contenant 3 fois ton nombre.


Comme je ne suis pas sûr de ce que tu veux faire, je te donne deux exemples.


Admettons que tu as ton vecteur Euler = [45,10,90]. Tu veux additionner Angle = 30° à chaque angle de ton vecteur Euler.
D'abord, tu "convertis" ton Angle (30°) en vecteur : VAngle = [30,30,30].
Ensuite, tu peux demander à Python de les additionner.

Le résultat sera alors :
Euler + Vangle = [45,10,90] + [30,30,30] = [75,40,120]


--------------------------

Autre cas de figure : tu ne veux additionner ton Angle = 30° rien que pour la rotation sur Y de ton vecteur Euler = [45,10,90]. Tu veux donc que les rotations des angles X et Z restent identiques.
Tu fais un vecteur VAngleY = [0,30,0].

Puis Python additionnera comme suit :
Euler + Vangle = [45,10,90] + [0,30,0] = [45,40,90]

Contribution le : 04/11/2019 11:54
Créer un fichier PDF de la contribution Imprimer


Re: Programmer un archer à cheval
OverdOzed
Inscrit:
19/03/2016 15:30
De Belgique
Post(s): 1600
D'accord, je comprends mieux.

C'est en effet cohérent sur mes test de ce matin. Mais je comprends vraiment rien a ce qu'il se passe quand je fais faire quelque chose avec les matrices !

Bon, d'après mes observations, quand je change de direction sur un seul axe (l'axe X souris traduis sur l'axe Z dans le jeu), j'ai ça:

Si je ne bouge pas:

Matrix 3x3 ((1, 0, 0),
            (0, 1, 0),
            (0, 0, 1)

Si je bouge:

Matrix 3x3 ((0.68, 0.95, 0),
            (0.95, 0.68, 0),
            (0, 0, 1)


Je remarque que seul deux composants ont changés. Quand je fais:
"worldOrientation = worldOrientation + mon_radian_changé_en_matrice",
Je vois que je fais un scaling. Via un print, je vois bien que les 3 composants ont changés.

Par contre, si je ne change qu'un seul composant:
worldOrientation = worldOrientation[0] + mon_radian_changé_en_matrice[0]"
Je constate aussi un scaling !

J'ai un peu chipoté et soit j'obtiens une déformation hideuse, soit un scaling.

Contribution le : 04/11/2019 12:18
Créer un fichier PDF de la contribution Imprimer


Re: Programmer un archer à cheval
OverdOzed
Inscrit:
23/02/2006 18:10
De Alpes-Maritimes
Post(s): 2342
J'ai pas tout suivi avec le scaling mais ça doit être un effet de bord. Une matrice 3x3 ne représente que la rotation en 3D.

----------------------------
Un peu technique (c'est pas hyper important) :
Une matrice de transformation (matrice 4x4), elle, renferme tout : translation, rotation et scaling.

Rotation et scale utilisent certaines mêmes positions dans la matrice de transfo. Pour ensuite extraire les vecteurs de scale et de rotation, on fait des calculs.

Sauf que si l'un des deux (rotation ou scale) est erroné, il y a un impact forcément sur l'autre (car l'extraction de rotation et scale se base sur les valeurs finales).
Si les valeurs pour rotation sont foireuses, alors le scaling en sera déduit avec de mauvaises valeurs également.

C'est comme si tu avais un super truc pour déduire les deux nombres qui t'ont donné 38. Si tu as 38, bingo, tu as la bonne réponse pour les deux nombres.
Maintenant, tu as eu une erreur de calcul et tu obtiens 45. Ben là, ton super truc te renvoie de la merde et tu n'as aucun moyen de vérifier. C'est ce qu'il se passe avec la rotation et le scaling.
---------------------------

Sinon, actuellement je suis au taf donc j'ai pu que jeter un oeil rapidement.

Je pense que le souci vient du fichier "Text.001". Tu fais
rot_eul[2] = math.radians(-obj['rot_x'])
.

Or, je pense à première vue qu'il faudrait faire un "+=" pour additionner ton angle à l'angle world. MAIS, cela ne marche pas car dans le fichier "Text", le bloc "if obj['x']: # gauche/droite" ne fait pas ce qu'il faut.

C'est ma première impression, je regarderai ça plus en détail plus tard dans la journée !

Contribution le : 04/11/2019 12:43
Créer un fichier PDF de la contribution Imprimer


Re: Programmer un archer à cheval
OverdOzed
Inscrit:
23/02/2006 18:10
De Alpes-Maritimes
Post(s): 2342
J'ai modifié ton .blend pour avoir, je pense, ce que tu souhaites. Il reste un petit bug mineur quand on re-clique...

http://pasteall.org/blend/index.php?id=52557

Je t'explique les changements.

Pour résumer :
Pour que ça marche, il fallait conserver l'angle initial au moment où l'on clique, sinon tu n'as aucun point de repère pour restreindre l'angle de tir.

Tu faisais aussi des petits incréments sur l'angle. Mais à aucun moment tu ne pouvais savoir de combien tu avais déjà tourné précédemment, te rendant "aveugle" sur ce qu'il venait de se passer. Ce qu'il fallait faire, c'était donc (en plus de l'angle de départ) d'avoir une vue globale des mouvements de la souris à partir du clic.


Plus en détails :
Tu te bases à chaque frame sur le décalage de la souris avec la frame précédente. Ce qui ne te donne qu'une info très partielle du mouvement de la souris. Ce que j'ai fait, c'est calculer le déplacement total de la souris quand on clique.
J'additionne donc tous les petits déplacements calculés avec DeltaMouse() tant qu'on reste avec le bouton de la souris enfoncé dans "obj['totalDelta']".

Ensuite, dans le "if obj['prepa']:", j'utilise mon totalDelta et je le contrains entre 0 et 30 car il peut dépasser (j'ai aussi mis une notion de vitesse qui pourrait être paramétrée dans les options du jeu).
Avec ça, j'obtiens donc le "obj['rot_x']" que je vais appliquer à la rotation world.

Pour ce faire, je commence par stocker la rotation world du cube au moment où on clique.
obj['startRotation'] = obj.worldOrientation.to_euler()
Le changement final, c'est quand j'applique la rotation :
rot_eul[2] = obj['startRotation'][2] + math.radians(-obj['rot_x'])

Contribution le : 04/11/2019 19:36
Créer un fichier PDF de la contribution Imprimer


Re: Programmer un archer à cheval
OverdOzed
Inscrit:
19/03/2016 15:30
De Belgique
Post(s): 1600
Ça correspond effectivement à ce que je souhaitais.

obj['rot_x'] = max(min(obj['rot_x'], 30), 0)


Donc, je peux traduire cette ligne comme "faire quelque chose, du moment qu'on est entre 0 et 30" ?

Contribution le : 05/11/2019 13:18
Créer un fichier PDF de la contribution Imprimer


Re: Programmer un archer à cheval
OverdOzed
Inscrit:
23/02/2006 18:10
De Alpes-Maritimes
Post(s): 2342
Super ! :)


Non, cette ligne n'a pas de rapport avec une quelconque condition. C'est une façon pour que ton float 'rot_x' soit toujours compris entre 0 et 30 (inclus).

Après cette ligne, tu sais que'rot_x' est compris entre 0 et 30. Tu peux donc l'utiliser comme bon te semble, sans avoir à tester sa valeur du coup.

Exemples :
Si 'rot_x' valait -8°, après cette ligne il sera fixé à 0°.
Si 'rot_x' valait 34°, il sera à 30°.
Si 'rot_x' valait 12°, il restera à 12°.

En Python, je n'ai pas trouvé comment borner une valeur. C'est la retranscription d'une fonction existante dans d'autres langages qui s'appelle généralement "clamp(val, min, max)".

Ca marche comme ça (parce que ça retourne le cerveau si on connait pas ) :
min(obj['rot_x'], 30) ==> retourne le plus petit de 'rot_x' et 30. Donc 'rot_x' vaut au plus 30 (ça perturbe à cause du min).
max(min(obj['rot_x'], 30), 0) ==> retourne le plus grand de 0 et ce qu'on a obtenu avec le min. Donc 'rot_x' vaut au minimum 0 (idem à cause du max).


Tu pourrais faire la même chose avec des if, si c'est plus clair pour toi mais c'est plus verbeux. Avec les if, tu recodes les fonctions min et max en gros.

if rot_x < 0:
    rot_x = 0

if rot_x > 30:
    rot_x = 30

Contribution le : 05/11/2019 13:38
Créer un fichier PDF de la contribution Imprimer



 Haut   Précédent   Suivant
« 1 (2) 3 4 »




Enregistrer votre réponse
Compte*
Nom   Mot de passe   Authentification
Message:*



[Recherche avancée]



Sujets récemment répondus
Forums Sujets Réponses Lus Dernières contributions
Le coin des geeks pc bas prix    [1][2][3] 22 602 Aujourd'hui 07:48:50
Sphere3d 
[WIP] et travaux terminés bas sculpture corps    [1][2][3][4] 31 782 Aujourd'hui 04:44:09
prometheusx 
Moteur de jeu GameBlender et alternatives [WIP] Cs (sous zone telecom, node stencil)    [1][2][3]...[43] 420 134115 Aujourd'hui 04:38:04
sbkodama 
Le coin des geeks carte graphique Intel(R) HD Graphics et OpenGL    [1][2][3] 26 1303 Hier 22:03:27
Poutrator 
Questions & Réponses Problème rendu    [1][2][3] 22 188 Hier 17:34:15
Mikael 
Questions & Réponses [résolu] Bug sur la sculpture :( 5 63 Hier 16:27:41
OLDSEN 
Le coin des geeks Vieilles cartes graphiques : Quadro FX5800 ou Quadro 4000 ? 5 365 Hier 15:38:52
Poutrator 
Moteur de jeu GameBlender et alternatives [WIP] DeadSigns FPS horreur - Première version disponible !    [1][2][3]...[57] 565 94481 Hier 14:47:11
timeman13 
[WIP] et travaux terminés [terminé] Avions Seconde Guerre Mondiale // Courte Animation 9 685 13/07 23:46:32
prometheusx 
Questions & Réponses Modifier une série de matériaux texturés en même temps 4 269 13/07 15:49:03
JaAlVir657 
Questions & Réponses Mesure de plusieurs objet Blender 2.82 3 107 11/07 19:38:58
Rimpotche 
Moteur de jeu GameBlender et alternatives hARMful engine    [1][2][3]...[9] 83 9613 11/07 12:59:48
Bibi09 
Questions & Réponses problème radeon pro render vêtements transparents 0 108 09/07 18:49:17
soloic 
Questions & Réponses [résolu] "vieux" fichier blender "invisible"    [1][2] 11 1058 09/07 16:03:24
kinder 
Questions & Réponses [non résolu] Adoucir les courbes et espacer uniformément les vertices dans l'UV Map 2 408 09/07 13:35:44
moonboots 
Questions & Réponses [terminé] contrôle de l'angle d'incision du chanfrein/bevel 2 125 08/07 16:08:24
halphasten 
The Blender Clan 'tchat Clignotement de l'interface de blender 7 432 08/07 13:13:40
zezer 
Questions & Réponses Pass index 1 121 08/07 12:47:07
Rimpotche 
[WIP] et travaux terminés [terminé] court métrage 2020 8 349 07/07 18:44:19
flahaut 
Questions & Réponses épaisseur sur une texture 6 201 07/07 15:28:27
moonboots 

Qui est en ligne
34 utilisateur(s) en ligne (dont 20 sur Forums)

Membre(s): 1
Invité(s): 33


ebrain, plus...
Nouveaux membres
BirgitStan 15/7/2020
OLDSEN 14/7/2020
Mikael 12/7/2020
soloic 9/7/2020
kinder 9/7/2020
halphasten 8/7/2020
KOALA_NET21 8/7/2020
singinzerin 6/7/2020
Dartank 5/7/2020
manondup 3/7/2020
Dernier Ajout
mirages-preview~0.jpg

Evènements à venir
Jui 23
Anniv du BlenderClan !
Aou 7
anniversaire Cem47
Aou 13
Anniversaire Siskas
plus 268 plus d'élément(s)
 Par Mickaël Guédon [ebrain] © 2003-2020 The Blender Clan - hébergé par TuxFamily - Site déclaré à la CNIL sous le numéro 1155445