« 1 (2) 3 4 5 »


Re: Simulateur d'entrepôt, script et BGE : comment faire bouger un objet ?
Fou Furieux du Clan
Inscrit:
16/06/2010 18:25
Post(s): 177
J'ai pas bien compris le truc de la parabole ni celui du delta x mais si tu utilise des fonctions de blender utilisable en dehors de blender (bpy), elles ne fonctionneront pas dans le bge. Personnellement, pour la variation de vitesse j'aurais mis plusieurs actuators motion de valeur différentes s'actionnant l'un aprés l'autres grâce à une property timer. Le paramètre force des actuators motion appliquent une force qui fait accélérer l'objet au début. Sinon regarde la: http://www.highspeedracer.webou.net/tuto.php?id=21

Contribution le : 25/08/2011 15:37
_________________
I love GameBlender

3DMagixPro, IllusionMage, 3DMagix : Scam !
Créer un fichier PDF de la contribution Imprimer


Re: Simulateur d'entrepôt, script et BGE : comment faire bouger un objet ?
OverdOzed
Inscrit:
18/03/2007 16:25
De + De = Quat?
Post(s): 416
J'ai fait une erreur et négligé un paramètre dans mon code.
Tout d'abord, l'avancement c'est:
(positionX - positionDepart) / (positionArrivee - positionDepart)

Et non pas ce que j'ai marqué avant. Honte sur moi.

Ensuite, à moins que ton script ne soit appelé à intervalles non variables, il va falloir faire intervenir un facteur temps, genre par exemple exécution toutes les 2 milisecondes.

J'ai testé ce script dans unity, il fonctionne (attention, syntaxe uniscript) :
var object:Transform;
var posArrivee:float = 6.0;
var avancement:float;
var posDepart:float = 0.0;

function Update () {
	//print(object.position.x);
	if(object.position.x <= posArrivee)
	{
		avancement = (object.position.x - posDepart)/(posArrivee - posDepart);
		if ( avancement == 0 ) { avancement = 0.001; }
		object.position.x = object.position.x + (1.0 - (2.0 * avancement - 1.0)*(2.0 * avancement - 1.0))/20;
		print(avancement);
	}
}


J'ai divisé par 20 le résultat de f(x), pour avoir un mouvement de départ plus lent. Je n'ai pas utilisé de puissance 2, apparemment je ne connaît pas la syntaxe exacte...

Edit : une image de la fonction f(x) = 1-(2x-1)²

Sachant que l'avancement est forcément compris entre 0 et 1, tu vois sur quel intervale on travaille...

Contribution le : 25/08/2011 16:35
Créer un fichier PDF de la contribution Imprimer


Re: Simulateur d'entrepôt, script et BGE : comment faire bouger un objet ?
OverdOzed
Inscrit:
27/07/2005 12:25
De ce petit pays neutre avec des montagnes et du chocolat
Post(s): 4021
Je patauge encore sans vraiment avancer.
Je n'arrive toujours pas à trouver une méthode pour déplacer un objet dont les coordonnées sont définies dans un script.

pierro8 me dit que la "commande" bpy. ne fonctionne pas dans BGE, mais ne dit pas ce qu'il faut utiliser à la place.

Dans cette page fort intéressante, il utilise gl. mais lorsque je fais pareil, j'ai un message "gl is not defined".
http://www.highspeedracer.webou.net/tuto.php?id=21

Pourquoi un Actuator Motion utilisant "Force" au lieu de "Loc" ne fonctionne que sur des objets sans Parent ?

Puisque l'appel d'un script se fait au niveau du Controller, comment appeler un Actuator Motion dans ce script,
alors que justement la présence du Controller de type Python se passe de liaison vers un Actuator ?
Faut-il le créer dynamiquement ?

Oracle : je regarderai tes propositions de plus prés dès que j'aurais passé des réponses à ces questions, merci de ton aide.

[edit]
Essai du lendemain, je vais voir ici :
http://www.blender.org/documentation/blender_python_api_2_59_0/contents.html
Je constate que BPY est remplacé par BGE, youpie, génial, ça y est, j'essaie :
ImportError: no module named bge
Bon alors c'est quoi que j'ai encore raté ???

Contribution le : 29/08/2011 11:54
_________________
Sans difficulté il n'est point de progrès !
Créer un fichier PDF de la contribution Imprimer


Re: Simulateur d'entrepôt, script et BGE : comment faire bouger un objet ?
OverdOzed
Inscrit:
27/07/2005 12:25
De ce petit pays neutre avec des montagnes et du chocolat
Post(s): 4021
Bon, ben pour me sentir moins seul, je trouve quelques solutions et je me réponds à moi-même.

D'abord, félicitations à moi-même! J'ai fini par avancer un peu et comprendre quelque trucs.
Alors je me les écrit ici, comme ça si je reviens demain et que je ne me rappelle pas tout, je retrouverai mes notes.

1) import bpe
Ca remplace import bpy, et ce n'est utilisable que dans une script destiné au Game Engine.
La commande "Run script" provoque donc une erreur, qui ne sera pas présente lorsque le script sera exécuté en mode Game.
C'est méchant, mais c'est nécessaire de le savoir. Et tant pis si je suis le seul (pardon, étais le seul) ici à l'ignorer.

2) le mouvement
Dans une boucle for..., je défini à chaque itération la nouvelle position de mon objet. Si j'effectue du même coup
un print(position) pour voir les résultats dans la console, tout semble correct, mais mon objet est affiché
uniquement à sa position de départ et d’arrivée. Pas de mouvement visible, donc, mais un saut unique.
J’imagine qu’il manque une commande de rafraîchissement ou quelque chose dans le genre
(mais si c’est le cas, alors pourquoi l'objet est quand-même visible à sa position d’arrivée ???)

3) Keyboard Sensor
Le lancement d’un script par l’enfoncement d’une touche effectue en fait deux fois le script,
Une fois à l’enfoncement et une fois au relâchement. Pour éviter cela il suffit d’activer l’option Tap du Sensor.
Mais il semble que cela ne fonctionne pas toutes les fois (encore à vérifier).

Voilà, si quelqu’un passe dans le coin et se sent l’âme d’un commentateur, qu’il profite de l’occasion.
Dans le cas contraire, je continuerai d’approvisionner ce sujet comme si c’était mon blog

A mon prochain passage (demain) je mettrai sans doute (enfin) un .blend à (ma) disposition.

Contribution le : 31/08/2011 12:54
_________________
Sans difficulté il n'est point de progrès !
Créer un fichier PDF de la contribution Imprimer


Re: Simulateur d'entrepôt, script et BGE : comment faire bouger un objet ?
Fou Furieux du Clan
Inscrit:
17/02/2010 12:11
Post(s): 238
Citation :
Dans cette page fort intéressante, il utilise gl. mais lorsque je fais pareil, j'ai un message "gl is not defined".
http://www.highspeedracer.webou.net/tuto.php?id=21


Ton message d'erreur signifie que la variable "gl" n'est pas definie, entre autre, qu'elle existe pas parce que tu ne l'as pas créée.
La variable "gl" est souvent utilsée dans le bge pour remplacer le bge.logic (2.5) ou le GameLogic (2.49b)
gl = GameLogic
cont = GameLogic.getCurrentController()


Citation :
Pourquoi un Actuator Motion utilisant "Force" au lieu de "Loc" ne fonctionne que sur des objets sans Parent ?


L'actuator motion utilisant force s'applique sur un objet n'etant pas dependant d'un autre objet, ce qui altere ces propriétées physiques.
Un parentage force un objet a toujours rester a telle ou telle distance de l'objet. Si c'est en Loc, blender va modifier la position du child pour le parentage.

Citation :
Puisque l'appel d'un script se fait au niveau du Controller, comment appeler un Actuator Motion dans ce script,
alors que justement la présence du Controller de type Python se passe de liaison vers un Actuator ?
Faut-il le créer dynamiquement ?


Pourquoi veut tu te passer de liaison ? Avec liaison:

gl = GameLogic
cont = gl.getCurrentController()
Actuator = cont.actuators["nom_de_l'actuator"]


Sans il suffit d'utiliser l'objet. Par exemple:

gl = GameLogic
Objs = gl.getCurrentScene().objects
Actuator_Recherché = Objs["L'objet"].actuators["L'actuator_Recherché"]


Mais je ne suis pas sur de la methode pour lister les objets, je ne l'ai jamais utilisé.

Citation :
La commande "Run script" provoque donc une erreur, qui ne sera pas présente lorsque le script sera exécuté en mode Game.
C'est méchant, mais c'est nécessaire de le savoir. Et tant pis si je suis le seul (pardon, étais le seul) ici à l'ignorer.


Oui car la commande "Run Script" est propre a Blender, c'est donc une API carrement differente du BGE qui est attendue.

Citation :
2) le mouvement
Dans une boucle for..., je défini à chaque itération la nouvelle position de mon objet. Si j'effectue du même coup
un print(position) pour voir les résultats dans la console, tout semble correct, mais mon objet est affiché
uniquement à sa position de départ et d’arrivée. Pas de mouvement visible, donc, mais un saut unique.
J’imagine qu’il manque une commande de rafraîchissement ou quelque chose dans le genre
(mais si c’est le cas, alors pourquoi l'objet est quand-même visible à sa position d’arrivée ???)


En fait, lorsque tu utilise un script, il est excuté entierement avec ces boucles et tout le tralala, puis laisse la main a blender.

Moment 1:
Position de l'objet = [0, 0, 0]

Moment 2:
Execution du script:
____ Boucle:
__________ Pos = Pos[x]+1
__________ Print Pos
____ Fin

Moment 3:
Une nouvelle frame se lance, actualisation de blender, et des coordonnée de l'objet.

En fait, la position de ton objet a pris toutes les valeures d'un coup, s'est arreté a la derniere, et blender a repris la main apres l'execution du script.
Pour bien te rendre compte, fait des tests avec le module time.
Tu fait une scene animée, puis tu rentre ce script avec relié au controller python une brick "always" "true pulse on":

import time
time.sleep(0.5)


Le script demande juste qu'a chaque execution du script, il fasse une pause de 0.5 secondes.

Citation :
3) Keyboard Sensor
Le lancement d’un script par l’enfoncement d’une touche effectue en fait deux fois le script,
Une fois à l’enfoncement et une fois au relâchement. Pour éviter cela il suffit d’activer l’option Tap du Sensor.
Mais il semble que cela ne fonctionne pas toutes les fois (encore à vérifier).


Ou alors tu créé ton script en fonction, et tu englobe le lancement de celle ci dans une condition telle que:

gl = GameLogic
Sensor = gl.getCurrentController().sensors["Nom du sensor"]

if Sensor.positive == True:
    laDitFonction()


Note: "Sensor.NEGATIVE == True" n'existe pas, je pensais, mais non. Il se traduit simplement par "Sensor.POSITIVE == False"

Contribution le : 31/08/2011 14:55
Créer un fichier PDF de la contribution Imprimer


Re: Simulateur d'entrepôt, script et BGE : comment faire bouger un objet ?
OverdOzed
Inscrit:
24/07/2008 00:45
De Paris
Post(s): 3445
Hello mcBlyver !
Ça fait plaisir de te voir du côté BGE de la force.

Ton projet est intéressant, je regrette de ne pas avoir été là plus tôt pour le suivre et t'éviter cette cuisante solitude.

Je commence tout de suite par une remarque qui a déjà été faite mais qu'il est important de définir clairement car on commence tous par se tromper : Blender utilise deux API totalement indépendantes en ce qui concerne Python :
- BPY qui sert à créer des add-ons.
- BGE qui est utilisée avec le BGE.
Elles ont chacun leur rôle et ne peuvent pas en changer, c'est pourquoi BPY ne fonctionne pas avec Run Game et BGE ne fonctionne pas avec Run Script qui est réservé aux add-ons. En effet, un script pour le BGE nécessite un contexte et ne peut par conséquent pas être lancé indépendamment du jeu, il pourrait y avoir des situations illogiques.
Ces deux modules sont d'ailleurs clairement séparés dans la doc : http://www.blender.org/documentation/blender_python_api_2_58_release/
Nous n'utiliseront ici que les Game Engine modules et les Standalone modules qui peuvent être utilisés dans les deux API. C'est important pour ne pas se mélanger les pinceaux mais il me semble que tu l'avais compris.

Pour le mouvement, je suis l'idée d'Oracle qui est d'interpoler grâce à une fonction mais attention : comme l'a bien expliqué Speedlight, lorsque le script est exécuté, le jeu s'arrête. Donc ce qui se passe avec ta boucle, c'est qu'elle passe par toutes les étapes entre les deux rafraîchissement de l'écran ! Pour y remédier, il faut éliminer ta boucle et utiliser une variable globale servant de repère pour savoir à quelle étape du mouvement on est, une sorte de variable d'avancement. Une variable globale se définit comme ceci : bge.logic.variable = "une valeur" ou gl.variable si tu as choisi de remplacer bge.logic par gl en début de script grâce à la ligne « from bge import logic as gl ». (ou GameLogic.variable en 2.49)
Une fois cette variable définie, on peut la réutiliser dans la formule d'interpolation comme étant le X. Mais attention, si tu fais gl.avancement = 0 dans ton script, cette ligne sera lue à chaque fois et l'avancement restera à 0. Il y a donc deux possibilités :
- Ou tu crées un script Initialisation.py (ou Init.py ou ce que tu veux d'autre mais c'est plus ou moins une convention) qui ne s'exécute qu'une seule fois, tout au début du jeu, et tu y places la ligne de définition de gl.avancement ;
- Ou tu utilises une condition dans ton script qui permet de ne définir gl.avancement uniquement s'il n'existe pas encore. Pour cela, on utilise la fonction hasattr() qui permet de vérifier si un objet possède ou non un attribut (car une variable globale n'est ni plus ni moins qu'un attribut ajouté à l'objet bge.logic ou gl) :
if not hasattr(gl, "avancement") :
	gl.avancement = 0


Ensuite, cette variable globale peut être incrémentée à la fin du script pour que l'étape suivante fasse avancer l'objet.

Note :
Citation :
Note: "Sensor.NEGATIVE == True" n'existe pas, je pensais, mais non. Il se traduit simplement par "Sensor.POSITIVE == False"

Tu peux aussi utiliser « if not sensor.positive : », je trouve personnellement que c'est plus clair.

Contribution le : 31/08/2011 22:01
_________________
Tuto MaPZone
Créer un fichier PDF de la contribution Imprimer


Re: Simulateur d'entrepôt, script et BGE : comment faire bouger un objet ?
OverdOzed
Inscrit:
18/03/2007 16:25
De + De = Quat?
Post(s): 416
Cool, il y a enfin des réponses. J'en profite pour poser mes question alors.
Je pensais sincèrement pas que ma méthode était bonne pour le BGE. Du coup, je me demande s'il n'y aurait pas moyen d'utiliser l'avancement sur une IPO au lieu de faire un calcul à chaque frame. Comme ça, on pourrait par exemple utiliser une courbe de Gauss sans manger les fps...

Contribution le : 01/09/2011 07:01
Créer un fichier PDF de la contribution Imprimer


Re: Simulateur d'entrepôt, script et BGE : comment faire bouger un objet ?
OverdOzed
Inscrit:
24/07/2008 00:45
De Paris
Post(s): 3445
Entre lire une IPO et calculer un exp(-x²), ça se vaut je pense.

Contribution le : 01/09/2011 11:44
_________________
Tuto MaPZone
Créer un fichier PDF de la contribution Imprimer


Re: Simulateur d'entrepôt, script et BGE : comment faire bouger un objet ?
OverdOzed
Inscrit:
27/07/2005 12:25
De ce petit pays neutre avec des montagnes et du chocolat
Post(s): 4021
Citation :

Bobibou a écrit:
Entre lire une IPO et calculer un exp(-x²), ça se vaut je pense.


Calculer peut-être, mais insérer un temps d'attente à chaque itération pour pouvoir voir bouger l'objet en temps réel,
si je veux éviter les saccades, ça ne va pas être plus "lourd" que de définir (dynamiquement) et lire une F-Curve ?

En tout ca, merci de votre soutien. Je n'ai pas pu continuer pendant ma pause de ce midi, mais je m'y colle prochainement.

Contribution le : 01/09/2011 12:36
_________________
Sans difficulté il n'est point de progrès !
Créer un fichier PDF de la contribution Imprimer


Re: Simulateur d'entrepôt, script et BGE : comment faire bouger un objet ?
OverdOzed
Inscrit:
24/07/2008 00:45
De Paris
Post(s): 3445
Mais il n'y a pas de temps d'attente à ajouter normalement...

Contribution le : 01/09/2011 13:55
_________________
Tuto MaPZone
Créer un fichier PDF de la contribution Imprimer



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




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 Animation cycle de marche Fall Guys - Rigify 2 708 Aujourd'hui 08:42:06
Ediuire 
Hors Sujet !! Tuto Tips - Faire des coutures dans Blender - fabriquer un pouf 1 1080 27/09 14:34:24
perrin34 
Hors Sujet !! Alors elle est PUNK cette bande-annonce de palette CMJN 0 90 24/09 15:33:07
xorturion 
Questions & Réponses Effets sabre laser image par image 2 144 23/09 07:27:45
muthesaint 
Questions & Réponses [non résolu] Rendu vide pour une simple animation 0 114 20/09 09:57:55
Scandinaze 
Questions & Réponses [non résolu] comment engendrer un mouvement selon un autre dans un simple système 1 175 18/09 17:10:37
doraynico 
Questions & Réponses [non résolu] Comment fusionner deux fichiers .blend ? 2 208 18/09 16:53:07
doraynico 
Questions & Réponses Comment mettre un délai sur une animation contenue dans une instance de collection? 0 1063 18/09 16:31:16
doraynico 
[WIP] et travaux terminés [WIP] Super Blenderello.    [1][2][3]...[7] 60 35561 05/09 14:50:01
albron 
Questions & Réponses Comment percer une forme courbe 0 241 03/09 04:23:51
tymoon2000 
Questions & Réponses vertex weights 0 248 31/08 16:59:42
fenixdragon 
Questions & Réponses bagapie 0 264 31/08 16:12:59
zilou 
Questions & Réponses Remplissage objet 2 432 29/08 16:28:10
poppy 
[WIP] et travaux terminés [terminé] Tracking pour Ovni 0 273 29/08 09:48:46
vinceproduc 
Moteur de jeu GameBlender et alternatives Réflexions sur la démarche de création d'un jeu vidéo    [1][2][3]...[5] 48 82046 26/08 06:52:11
breakout_12 
Questions & Réponses Export png de mauvaise qualité 0 258 24/08 19:17:35
Vort 
Questions & Réponses Calcul de volume sur une zone définie d'un objet avec un important maillage 2 380 22/08 15:37:09
Cecile-Blabla 
Questions & Réponses [non résolu] Animation qui ne se finit pas 1 362 21/08 23:09:34
moonboots 
Questions & Réponses convertir displacement shader en displacement géométrie 1 366 21/08 14:20:32
yawdpwal 
Hors Sujet !! Japanese weather presenter 0 1851 20/08 16:40:57
xorturion 

Qui est en ligne
167 utilisateur(s) en ligne (dont 69 sur Forums)

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


plus...
Nouveaux membres
MacEisenbe 3/10/2023
OpalJonsso 3/10/2023
Scotty7425 3/10/2023
CindyDrans 3/10/2023
CaroleNix2 3/10/2023
AjaBardin6 3/10/2023
ReganCkj9 3/10/2023
DeeStillwe 3/10/2023
KristieGoo 3/10/2023
NealDoyne9 3/10/2023
Dernier Ajout
2020-09-24.jpg

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