« 1 (2) 3 4 »


Re: Programmer un archer à cheval
OverdOzed
Inscrit:
23/02/2006 19:10
De Sideula
Post(s): 2019
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 12:06:41
_________________
Développement en cours du hARMful Engine
Créer un fichier PDF de la contribution Imprimer


Re: Programmer un archer à cheval
OverdOzed
Inscrit:
19/03/2016 16:30
De Belgique
Post(s): 1416
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 12:13:26
_________________
Mon projet jeu vidéo
Mes tutos
Créer un fichier PDF de la contribution Imprimer


Re: Programmer un archer à cheval
OverdOzed
Inscrit:
23/02/2006 19:10
De Sideula
Post(s): 2019
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 19:56:20
_________________
Développement en cours du hARMful Engine
Créer un fichier PDF de la contribution Imprimer


Re: Programmer un archer à cheval
OverdOzed
Inscrit:
19/03/2016 16:30
De Belgique
Post(s): 1416
Ç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 20:41:39
_________________
Mon projet jeu vidéo
Mes tutos
Créer un fichier PDF de la contribution Imprimer


Re: Programmer un archer à cheval
OverdOzed
Inscrit:
23/02/2006 19:10
De Sideula
Post(s): 2019
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 12:54:29
_________________
Développement en cours du hARMful Engine
Créer un fichier PDF de la contribution Imprimer


Re: Programmer un archer à cheval
OverdOzed
Inscrit:
19/03/2016 16:30
De Belgique
Post(s): 1416
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 13:18:28
_________________
Mon projet jeu vidéo
Mes tutos
Créer un fichier PDF de la contribution Imprimer


Re: Programmer un archer à cheval
OverdOzed
Inscrit:
23/02/2006 19:10
De Sideula
Post(s): 2019
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 13:43:49
_________________
Développement en cours du hARMful Engine
Créer un fichier PDF de la contribution Imprimer


Re: Programmer un archer à cheval
OverdOzed
Inscrit:
23/02/2006 19:10
De Sideula
Post(s): 2019
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 20:36:05
_________________
Développement en cours du hARMful Engine
Créer un fichier PDF de la contribution Imprimer


Re: Programmer un archer à cheval
OverdOzed
Inscrit:
19/03/2016 16:30
De Belgique
Post(s): 1416
Ç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 14:18:43
_________________
Mon projet jeu vidéo
Mes tutos
Créer un fichier PDF de la contribution Imprimer


Re: Programmer un archer à cheval
OverdOzed
Inscrit:
23/02/2006 19:10
De Sideula
Post(s): 2019
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 14:38:39
_________________
Développement en cours du hARMful Engine
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
Questions & Réponses fusionner plusieurs matériels en un seul 0 14 Aujourd'hui 04:52:52
ALK-chimiste 
Questions & Réponses Labels 3 116 Hier 22:45:48
Bibi09 
[WIP] et travaux terminés Une locomotive ... 4 107 Hier 22:13:30
busanga 
Le coin des geeks Fonctionnement blender avec plusieurs cartes graphiques 1 39 Hier 13:39:34
Gilead_Maerlyn 
Questions & Réponses [résolu] Impossible de faire un bevel regulier 9 275 16/11 22:33:51
pat72 
Moteur de jeu GameBlender et alternatives [résolu] Programmer un archer à cheval    [1][2][3][4] 34 1056 16/11 11:38:45
Bibi09 
Questions & Réponses Trace bizzarre sur un objet 6 135 15/11 14:10:05
moonboots 
Python & Plugins [WIP] Tracer une courbe et obtenir son équation 7 136 15/11 11:51:13
busanga 
Questions & Réponses Besoin d'aide simulation de vent sur des plantes (système particules) 0 179 14/11 17:50:55
B3nD 
Questions & Réponses Contrainte en édition 1 95 14/11 13:57:05
naeco 
Questions & Réponses [non résolu] Des conseils ? 5 212 13/11 22:21:41
tokoji 
Questions & Réponses La video lue dans editeur de clip et sequence mais pas dans node 0 71 13/11 20:06:12
masje 
Questions & Réponses Question sur IvyGen 3 237 13/11 16:20:13
Muad 
Questions & Réponses Déplacement d'un personnage riggé sur courbe de Bézier 3 110 13/11 13:45:28
Rimpotche 
Questions & Réponses Choisir Rendu sur la carte graphique de l'ordinateur 4 202 13/11 11:13:26
masje 
Questions & Réponses Extrusion régulière sur plusieurs angles ?    [1][2] 12 313 12/11 15:37:27
Fracoris 
[WIP] et travaux terminés [WIP] Bataille Navale // Animation 3d    [1][2][3] 24 2100 11/11 22:02:15
Bibi09 
[WIP] et travaux terminés Teeny Tiny - Story 1 170 11/11 21:42:22
Bibi09 
Questions & Réponses des rayures bizzard ? 3 125 11/11 20:52:08
Eleonor-e 
Mes premières images sous Blender (débutants) Les trucs à Élé 6 246 11/11 18:53:11
Eleonor-e 

Qui est en ligne
51 utilisateur(s) en ligne (dont 24 sur Forums)

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


plus...
Nouveaux membres
B3nD 14/11/2019
Jothys 13/11/2019
21600883 11/11/2019
Eleonor-e 11/11/2019
DAOUDA 8/11/2019

AikonFR
8/11/2019
LouYa9 6/11/2019
nikita182 6/11/2019
parki 6/11/2019
papillon 5/11/2019
Dernier Ajout
2019-11-05 01.JPG

Evènements à venir
Nov 18
Anniversaire de RichDeg
Dec 29
Anniversaire d'ebrain
Jan 11
BUG de Lyon
plus 278 plus d'élément(s)
 Par Mickaël Guédon [ebrain] © 2003-2019 The Blender Clan - hébergé par TuxFamily - Site déclaré à la CNIL sous le numéro 1155445