bge - prédire la position après x frames
RegulatorZ
Inscrit:
23/05/2004 07:11
De Metz
Post(s): 11300
Salut tout le monde,

je bricole un jeu où le joueur contrôle un vaisseau, qui se déplace dans un espace 2D et est soumis à la gravité de différentes masses. (Vous pouvez trouver ici un exemple de ce que je cherche à faire)

Les forces qui s'appliquent ne sont pas compliquées à calculer : l'attraction des différentes masses, la poussée du réacteur, l'inertie ; ça nous donne plusieurs vecteurs forces qu'on peut additionner pour avoir le vecteur de déplacement.

Là où ça se complique, c'est que je voudrais indiquer au joueur, sa trajectoire future. Je voudrais calculer la position de mon vaisseau pour les x prochaines frames, afin d'afficher des marqueurs qui constitueront une ligne pointillée, quelque chose de ce type : image


À partir de là, deux cas de figure.
1- j'utilise le worldLocation de l'objet, et je lui additionne mon vecteur
2- j'utilise un actuator Motion en mode Force, avec les valeurs données par mon vecteur

Dans le cas 1, j'arrive sans problème à calculer les x prochaines positions, avec une boucle qui calcule chaque frame en fonction de sa précédente, et stocke le tout dans une liste, ce qui ressemble à ça :
iterations = 10 #nombre de frames à prédire
nextPositions=[]
nextPosition.append(own.worldLocation) #position actuelle
for i in range(0, iterations):
    nextPosition[i+1] = nextPosition[i] + calculerMonVecteur()

own.worldLocation=nextPositions[1] #je mets à jour la position du vaisseau
#puis je boucle sur les nextPositions, en affichant un marqueur à chaque position


Ça fonctionne dans le principe, mais utiliser worldLocation + vecteur pose des problèmes : le vaisseau se téléporte par petits accoups, donc il passe à travers les obstacles, il n'a pas de LinearVelocity, etc.


Donc, il vaudrait mieux utiliser un actuator Motion (cas 2). Mais dans ce cas, je ne parviens pas à prédire la trajectoire... L'actuator déplace "physiquement" l'objet, moi je voudrais récupérer juste la valeur du déplacement, ou même les nouvelles coordonnées, sans déplacer physiquement l'objet. Et surtout, pouvoir boucler dessus.


Je me retrouve un peu coincé... Si vous avez des suggestions, je suis preneur

... désolé pour le pavé

Contribution le : 26/11/2014 15:56
_________________
Portfolio
Créer un fichier PDF de la contribution Imprimer


Re: bge - prédire la position après x frames
Fou Furieux du Clan
Inscrit:
21/08/2014 10:50
Post(s): 128
Bonjour!

Je n'ai pas tout compris mais si tu connais d'avance la position "destination" que le vaisseau doit atteindre:


# vecteur normalisé qui indique la trajectoire
vec = vaisseau.getVectTo(destination)[1]

# pour un mouvement sans saccades on divise le vecteur vec:
if vaisseau.worldPosition != destination:

    vaisseau.applyMovement(vec/100, False)


Euh, je ne sais pas si c'est utile.

Bonne journée!

Contribution le : 26/11/2014 16:48
Créer un fichier PDF de la contribution Imprimer


Re: bge - prédire la position après x frames
OverdOzed
Inscrit:
19/01/2008 03:25
De tu voit le nuage sur la carte météo bin j'habite là
Post(s): 2554
tu peut pas tous simplement adapté la technique de goran a une ligne droite??

https://www.youtube.com/watch?v=ZRFNlJFrpEI&index=8&list=PLBF3FB2A571A6BB7C

Contribution le : 26/11/2014 17:00
Créer un fichier PDF de la contribution Imprimer


Re: bge - prédire la position après x frames
OverdOzed
Inscrit:
21/08/2013 19:12
De CH [+]
Post(s): 1558
Salut,

La méthode à Goran a effectivement l'air bonne: découpler affichage et physique, c'est-à-dire tu calcules la valeur de la force actuelle pour renseigner l'actuateur, et à côté plusieurs frames supplémentaires rien que pour l'affichage des repères. Et le "truc", c'est d'ajouter la vitesse dans le calcul.

En effet:
r = r0 + v0*t + 1/2*a*t^2
v = v0 + a*t


J'ai codé un p'tit truc dans l'bus, voilà (crapy style, mais le bus étant bondé! ):

import bge

from mathutils import Vector

k = 100.0

t = 0.01

steps = 200


cont = bge.logic.getCurrentController()

own = cont.owner



def calculateForce(pos):

    v = Vector()


    for n in bge.logic.getCurrentScene().objects:
        if n is not own:
            d = n.worldPosition - pos
            
            f = k * d / (d.length ** 3)
            
            v += f
            
    return v



def calculateNext(pos, vit):
    f = calculateForce(pos)
    
    return (pos + vit*t + 0.5*f*t**2, vit + f*t)



def drawNexts(pos, vit):
    
    last = (pos, vit)
    
    new = (pos, vit)
    
    for n in range(steps):
        _last = tuple(new)
        new = calculateNext(*last)
        last = _last
        
        bge.render.drawLine(last[0], new[0], (1.0, 0.0, 0.0))

act = cont.actuators["Motion"]     
act.force = calculateForce(own.worldPosition)


drawNexts(own.worldPosition, own.linearVelocity)


cont.activate(act)



Problèmes restants:
1) même en mettant une résolution de malade (paramètre t), la dérive est assez grande... il faudrait donc, dans l'absolu, pouvoir gérer les paramètres t et steps en fonction de la vitesse actuelle, pour ne pas perdre en qualité quand celle-ci augmente

2) à chaque frame, toutes les positions sont recalculées (à cause de la dérive...); peut-être en recalculant toutes les x frames l'ensemble et seulement une nouvelle aux autres moments (avec sauvegarde de la liste des positions), ça irait mieux...

3) simple à corriger: hypothèse est faite de l'égalité de toutes les masses

4) ça marche en 3D... it's not a bug, it's a feature!


Bref... si ça t'aide, tant mieux, et sinon... tant pis!

Contribution le : 26/11/2014 17:47
_________________
BAddons, La Collection d'Addons de Matpi: https://github.com/qwenger/BAddons
Développeur Blender quand j'en ai le temps...

Créer un fichier PDF de la contribution Imprimer


Re: bge - prédire la position après x frames
Fou Furieux du Clan
Inscrit:
21/08/2014 10:50
Post(s): 128
Bon je crois que j'ai pas bien saisi l'affaire, mais pour essayer de me rendre utile, je ne sais pas si tu connais la fonction bge.render.drawline:

http://www.blender.org/api/blender_python_api_2_72b_release/bge.render.html?highlight=drawline#bge.render.drawLine

pour ta ligne pointillée. C'est pas mal, et tu peux choisir la couleur de la ligne tracée...

EDIT: Haha, grillé par Matpi (pour drawline)

Contribution le : 26/11/2014 17:48
Créer un fichier PDF de la contribution Imprimer


Re: bge - prédire la position après x frames
OverdOzed
Inscrit:
21/08/2013 19:12
De CH [+]
Post(s): 1558
C'est ce que Goran et moi avons utilisé, ouais!

Contribution le : 26/11/2014 17:51
_________________
BAddons, La Collection d'Addons de Matpi: https://github.com/qwenger/BAddons
Développeur Blender quand j'en ai le temps...

Créer un fichier PDF de la contribution Imprimer


Re: bge - prédire la position après x frames
Fou Furieux du Clan
Inscrit:
21/08/2014 10:50
Post(s): 128
(Ah j'ai pas regardé le truc de Goran... Je vais regarder. Pardon)

EDIT: Juste un petit edit pour dire (même si c'est hors sujet) que le tuto de Goran n'est pas à jour concernant la fonction drawline et les
if space.positive: else:

on peut utiliser:

if space.status == 1: #just activated et
if space.status == 3: #just released

Contribution le : 26/11/2014 17:55
Créer un fichier PDF de la contribution Imprimer


Re: bge - prédire la position après x frames
RegulatorZ
Inscrit:
23/05/2004 07:11
De Metz
Post(s): 11300
Waouh, beaucoup d'infos d'un coup ! Merci

Je prends le temps de décortiquer tout ça, et je vous tiens au courant...

Contribution le : 26/11/2014 18:16
_________________
Portfolio
Créer un fichier PDF de la contribution Imprimer


Re: bge - prédire la position après x frames
RegulatorZ
Inscrit:
23/05/2004 07:11
De Metz
Post(s): 11300
Grâce à vos réponses, j'ai bricolé un truc et ça commence à prendre forme. Merci à tous !

image
blend

Contribution le : 26/11/2014 22:55
_________________
Portfolio
Créer un fichier PDF de la contribution Imprimer



 Haut   Précédent   Suivant




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]...[5] 46 4074 Hier 22:50:02
Bibi09 
Questions & Réponses Comment nettoyer le LNA ? 0 14 Hier 20:54:50
Meltingman2 
[WIP] et travaux terminés [WIP] Tutoriel vidéo et création de mon prochain court métrage 5 238 Hier 20:25:01
Meltingman2 
Moteur de jeu GameBlender et alternatives [WIP] DeadSigns FPS horreur - Première version disponible !    [1][2][3]...[58] 577 98355 Hier 17:24:51
Hook 
Questions & Réponses switch entre IK/FK 4 51 08/08 18:54:05
prometheusx 
Questions & Réponses Je bloque sur la modélisation de ce verre! Avez-vous une solution? 8 269 08/08 13:23:47
debutant 
Questions & Réponses [non résolu] cloth: déformation bizzarre au rendu 3 73 07/08 09:21:18
Arielboid 
Questions & Réponses les cheveux longueur 1 58 06/08 19:53:18
Rimpotche 
Questions & Réponses ADDON MB - Lab 0 66 06/08 15:29:23
GI-jo13 
Questions & Réponses [résolu] en sculpt mode 5 204 04/08 18:21:10
prometheusx 
Questions & Réponses [résolu] Array circulaire 2 164 04/08 15:22:46
Redstar 
Questions & Réponses Addon pour textures procedurales 2 163 02/08 20:11:35
Crocodile_13 
Questions & Réponses avis animation marche :)    [1][2][3][4] 34 795 02/08 20:03:14
prometheusx 
[WIP] et travaux terminés [terminé] court métrage 2020    [1][2] 13 912 02/08 15:28:29
flahaut 
Questions & Réponses [résolu] Générique, sous-titres etc 3 169 02/08 09:18:02
Corpia 
Questions & Réponses [résolu] Scène prend la couleur du fond    [1][2] 11 322 02/08 08:20:32
Arielboid 
Questions & Réponses [non résolu] Problele d'addon 0 128 02/08 01:52:30
nayther 
Questions & Réponses Addon pour textures procedurales 1 127 01/08 12:22:52
moonboots 
Questions & Réponses hair densité sélection de polys 9 272 30/07 23:18:21
lenogre 
Questions & Réponses [résolu] graph editor et location key frame 7 235 30/07 16:41:18
math_ 

Qui est en ligne
143 utilisateur(s) en ligne (dont 110 sur Forums)

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


plus...
Nouveaux membres
KeeshaQ213 10/8/2020
Marty55G89 10/8/2020
GonzaloSwa 10/8/2020
Quincy04I 9/8/2020
MinervaEst 9/8/2020
MollieAnde 9/8/2020
Daniella38 9/8/2020
SuzannaCul 9/8/2020
MilagroF76 9/8/2020
MichelleMc 9/8/2020
Dernier Ajout
mirages-preview~0.jpg

Evènements à venir
Aou 13
Anniversaire Siskas
Sep 8
Anniversaire de ang
Nov 18
Anniversaire de RichDeg
plus 266 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