« 1 (2) 3 4 »


Re: Programmer un archer à cheval
OverdOzed
Inscrit:
23/02/2006 18:10
De Alpes-Maritimes
Post(s): 2657
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
_________________
Venez tester notre projet de Blender clan 2.0 + Tchat (en cours de développement) !
Pourquoi ? Retrouver un forum fonctionnel.
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): 1655
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): 2657
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
_________________
Venez tester notre projet de Blender clan 2.0 + Tchat (en cours de développement) !
Pourquoi ? Retrouver un forum fonctionnel.
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): 1655
Ç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): 2657
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
_________________
Venez tester notre projet de Blender clan 2.0 + Tchat (en cours de développement) !
Pourquoi ? Retrouver un forum fonctionnel.
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): 1655
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): 2657
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
_________________
Venez tester notre projet de Blender clan 2.0 + Tchat (en cours de développement) !
Pourquoi ? Retrouver un forum fonctionnel.
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): 2657
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
_________________
Venez tester notre projet de Blender clan 2.0 + Tchat (en cours de développement) !
Pourquoi ? Retrouver un forum fonctionnel.
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): 1655
Ç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): 2657
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
_________________
Venez tester notre projet de Blender clan 2.0 + Tchat (en cours de développement) !
Pourquoi ? Retrouver un forum fonctionnel.
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
[WIP] et travaux terminés [WIP] Teeny Tiny - Story    [1][2][3]...[13] 125 9990 Aujourd'hui 01:53:31
meltingman 
[WIP] et travaux terminés [terminé] Scène de Pti dej à la Française - EVEE a donf - 2.9 Blender    [1][2][3]...[5] 41 444 Hier 23:49:50
meltingman 
Questions & Réponses [résolu] Modificateur Curve sur une courbe multiple 2 28 Hier 22:05:14
yawdpwal 
The Blender Clan 'tchat Pour les arboriculteurs 3D 2 113 Hier 21:47:01
iet 
Questions & Réponses Disparition de matériaux après système de particule 0 21 Hier 18:21:49
Zarathoustra 
Hors Sujet !! Quels secteurs exploite l'impression 3D ? 1 28 Hier 16:12:54
Bibi09 
Questions & Réponses Problème de collision dans un player FPS 1 48 Hier 14:56:23
Redstar 
Questions & Réponses [résolu] Placer sa camera sur un HDRI    [1][2] 11 355 Hier 14:38:31
Crocodile_13 
Questions & Réponses [WIP] Problème Rétopo    [1][2] 10 108 Hier 09:53:59
Laorz 
Hors Sujet !! Un poisson clown low poly - 15 mm - Tutoriel - 2.9 0 31 25/10 20:03:08
meltingman 
Questions & Réponses Prioriser la visibilité d'un objet ? 2 55 25/10 17:31:26
Rimpotche 
[WIP] et travaux terminés image couteau dans caillou qui saigne 2 57 25/10 07:03:37
Crocodile_13 
[WIP] et travaux terminés [terminé] Chaussures Très Réalistes (.bend disponible) 5 152 24/10 21:23:47
Crocodile_13 
Le coin des geeks gain de fluidité viewport entre ryzen 3900X et 3950X    [1][2][3] 28 1411 24/10 15:45:54
papillon 
Questions & Réponses hdri en mode ombrage 2 130 24/10 10:27:06
kimlicrea 
Questions & Réponses Modifier les attribue de plusieurs objet en même temps (lumière) 3 80 24/10 10:21:47
kimlicrea 
[WIP] et travaux terminés [terminé] Moderno 404    [1][2] 13 572 23/10 20:26:41
moonboots 
Questions & Réponses Lissage de face 4 99 23/10 19:43:53
Maxence34 
Mes premières images sous Blender (débutants) Première réalisation    [1][2] 15 9022 23/10 02:13:26
Talason 
The Blender Clan 'tchat Addon convertisseur d'images en courbes 2 101 22/10 20:29:31
Rimpotche 

Qui est en ligne
177 utilisateur(s) en ligne (dont 112 sur Forums)

Membre(s): 0
Invité(s): 177


plus...
Nouveaux membres
ElouiseBay 27/10/2020
FredricLow 27/10/2020
RosalindaG 27/10/2020
RoderickBe 27/10/2020
JesusJessu 27/10/2020
Sarah19864 27/10/2020
ClaireLeak 27/10/2020
Concepcion 27/10/2020
MilagrosCa 27/10/2020
SallyHeney 27/10/2020
Dernier Ajout
mirages-preview~0.jpg

Evènements à venir
Nov 18
Anniversaire de RichDeg
Dec 29
Anniversaire d'ebrain
Jan 9
BUG de Lyon
plus 264 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