« 1 2 3 (4) 5 6 »


Re: [WIP] Circuit porte conteneur
Fou Furieux du Clan
Inscrit:
03/04/2014 19:01
Post(s): 117
Hi,

Je sollicite encore de l'aide, je n'arrive a rien de rien. Ce n'est pas de la fainéantise, mais de incompétence total des que ça touche les briques logiques et python.

Je pense ne pas pouvoir aller plus loin sans connaissances supplémentaires. S'il y a beaucoup de ressource pour apprendre python sur le net, c'est confus pour un débutant pour une utilisation avec blender. Je ne sais pas par quel bout commencer. Quoi qu'il en soit si l'on peux déjà m'avancer sur point suivants :

1) j'ai placé des checkpoints invisibles (plan horizontal a traverser). J'aimerais que lorsqu'une voiture passe un checkpoint, l'objectif soit le suivant...jusqu'au checkpoint initial et cela indéfiniment. Le but étant d’éviter qu'un joueur ne triche en coupant la route et aussi de définir la position du joueur ainsi que le nombre de tours effectué…

2) Je peux désormais placer plusieurs voiture sur la piste et j'aimerais que la camera fixe non plus une voiture mais un point moyen qui est la moyenne de la positions de la voiture de tête et la dernière.

J'imagine que ma demande n'est pas de la tarte, merci d'avance a ceux qui pourront m'apporter des solutions

Contribution le : 19/05/2015 13:24
Créer un fichier PDF de la contribution Imprimer


Re: [WIP] Circuit porte conteneur
Fou Furieux du Clan
Inscrit:
21/05/2014 10:29
Post(s): 261
Salut.

1) tu peux utiliser le sensor "Collision" ou sinon en python (vu que tu devra faire une gestion plus poussée) : http://www.blender.org/api/blender_python_api_2_74_release/bge.types.KX_GameObject.html#bge.types.KX_GameObject.collisionCallbacks

2) utilise la brick logic "Camera" et fais suivre un empty, puis dans le jeu déplace cette empty avec au plus simple une petite fonction python que tu enregistrera comme callback dans : http://www.blender.org/api/blender_python_api_2_74_release/bge.types.KX_Scene.html#bge.types.KX_Scene.pre_draw (ou dans scene.pre_draw_setup pour la 2.75)

exemple :
def updateCamera():
    center = (obj1.worldPosition + obj2.worldPosition) / 2
    empty.worldPosition = center

scene.pre_draw.append(updateCamera)

Contribution le : 19/05/2015 13:47
Créer un fichier PDF de la contribution Imprimer


Re: [WIP] Circuit porte conteneur
Fou Furieux du Clan
Inscrit:
21/08/2014 10:50
Post(s): 128
Salut! Le problème si tu prends la moyenne de la position de tous les joueurs pour la position de la caméra, c'est que le premier peut sortir du champ de la caméra avant le dernier... A mon avis, il faut plutôt caler la position de la caméra sur le premier joueur (celui qui est en tête de la course). J'essaie de faire un exemple.

http://www.pasteall.org/blend/36135

C'est loin d'être parfait. Surtout au début il y a un petit bug avec la caméra, je ne sais pas d'où ça vient... Je regarderai... Ah oui c'est normal en fait... Il faudrait rajouter un petit bout de code pour "smoother" le mouvement de la camera.

Contribution le : 19/05/2015 15:03
Créer un fichier PDF de la contribution Imprimer


Re: [WIP] Circuit porte conteneur
Fou Furieux du Clan
Inscrit:
03/04/2014 19:01
Post(s): 117
Woaaaa merci beaucoup !!!

Avec vos exemple et bout de code j'ai tout en main pour me débloquer.

Je vais prendre le temps d'analyser tout ça, essayer de le comprendre, choisir ce qui semble le mieux et le transposer dans mon niveau.

En tout cas merci de votre réactivité

Contribution le : 19/05/2015 17:23
Créer un fichier PDF de la contribution Imprimer


Re: [WIP] Circuit porte conteneur
Fou Furieux du Clan
Inscrit:
21/08/2014 10:50
Post(s): 128
J'ai ajouté quelques commentaires pour expliquer mon code un peu barbare:

import bge
from mathutils import Vector
from random import uniform

cont = bge.logic.getCurrentController()
scene = bge.logic.getCurrentScene()
own = cont.owner

# La liste des joueurs
playerList = [p for p in scene.objects if p.name.startswith("player")]
# La liste des checkpoints triée par nom
checkPointsList = sorted([c for c in scene.objects if c.name.startswith("checkpoint")], key = lambda self: self.name)

# Le nombre de joueurs
playerNb = len(playerList)

# Pour chaque joueur on choisit une vitesse aleatoire entre 0.5 et 1
for p in playerList:
    
    p["speed"] = uniform(0.5, 1.0)

def cameraPosition():
    """ La camera va se caler sur la position du joueur en tête de la course"""  
    
    # On trie la liste des joueurs selon 2 critères: 
    # 1) chaque joueur "poursuit" un checkpoint. On cherche les joueurs 
    # qui "poursuivent" le checkpoint le plus avancé dans la liste des checkpoints triée par noms >
    # le checkpoint.005 est plus avancé que le checkpoint.004 par exemple
    # 2) parmi les joueurs qui "poursuivent" le checkpoint le plus avancé,
    # on cherche le joueur qui est le plus près du checkpoint (j'ai dû faire 
    # une petite manip (inverser (1/getdistanceTocheckpoint) puis réinverser (reverse = True)
    # pour faire coincider le tri par ordre de noms et le tri par distance jusqu'au checkpoint suivant
    sortedPlayerList = sorted(playerList, key = lambda self: (self["checkpoint"].name, 1/self.getDistanceTo(self["checkpoint"])), reverse = True)
    
    # La position du premier joueur de la liste triée
    firstPlayerPos = sortedPlayerList[0].worldPosition
    
    # On retourne la position du joueur en x et y et la position de la camera en z
    return [firstPlayerPos.x, firstPlayerPos.y, own.worldPosition.z]

def cameraLens(camPos):
    """ Cette fonction controle le zoom de la caméra"""
    
    # On calcule la distance entre le joueur le plus loin de la caméra et la caméra
    maxDist = max([p.getDistanceTo(camPos) for p in playerList])
    # On "dézoome" quand le joueur le plus loin s'éloigne et on zoome quand le joueur le plus loin se rapproche
    camLens = 5000/maxDist
    
    # On retourne la valeur du zoom
    return camLens

def steering():
    """ Cette fonction s'occupe de faire en sorte que chaque joueur suive un checkpoint. Quand il arrive près du checkpoint
    qu'il suit, sa cible (son checkpoint) est mise à jour (on passe au checkpoint quivant"""
    
    # Pour chaque joueur
    for p in playerList:
        
        # S'il n'a pas de checkpoint (de cible), on lui en assigne une: Le premier checkpoint
        if "checkpoint" not in p:
            
            p["checkpoint"] = checkPointsList[0]
        
        # Sinon    
        else:
            
            # S'il est tout près de son checkpoint, on change sa cible (prochain checkpoint)
            if p.getDistanceTo(p["checkpoint"]) < 0.5 and checkPointsList.index(p["checkpoint"]) < len(checkPointsList) -1:
                
                p["checkpoint"] = checkPointsList[checkPointsList.index(p["checkpoint"])+1]
            
            # Tant que le joueur n'a pas atteint le dernier checkpoint    
            if p.getDistanceTo(checkPointsList[-1]) > 0.5:
                
                # On lui applique un mouvement et une orientation (cette partie du code
                # ne sera pas nécessaire dans ta situation (puisque chaque joueur sera dirigé par quelqu'un)
                vec = p.getVectTo(p["checkpoint"])[1]
                p.applyMovement(vec*p["speed"], False)
                p.alignAxisToVect(vec, 1, 0.2)
                p.alignAxisToVect(Vector((0, 0, 1)), 2, 1)
            
def main():
    
    """ La fonction principale qui va exécuter les autres pour la gestion des mouvements de la caméra et des joueurs"""
    
    steering()
    own.worldPosition = cameraPosition()
    # own.lens = Focal Length de la caméra
    own.lens = cameraLens(own.worldPosition)

Contribution le : 19/05/2015 18:00
Créer un fichier PDF de la contribution Imprimer


Re: [WIP] Circuit porte conteneur
Fou Furieux du Clan
Inscrit:
03/04/2014 19:01
Post(s): 117
Salut

Merci Barbapapa pour tes explications !
Tu a produit un truc pas évident, je me demande combien de temps ça ta pris d’écrire ce code ?

Panzergame, qu'es ce qu'un callback ? J'ai trouvé une explication mais pas très claire.
Quoi qu'il en soit je n'ai pas su enregistré comme callback lol. J'ai donc repris l'idée de l'empty que j'ai mixer avec le script de barabapapa.

J'ai effectuer quelque modification sur le script de barbapapa ( au passage merci pour les explications).

Le problème de ton code est que la camera garde la même orientation. J'ai donc chercher en vain a le modifier pour la contraindre a suivre le premier joueur ( ou la moyenne des joueurs...on verra)

J'ai donc repris l'idée de panzergame, de placer un empty mais avec quasiment le même script que la camera de barbapapa. Puis j'ai utilisé la brick logic "Camera" et fais suivre l'empty.


import bge
from mathutils import Vector
from random import uniform

cont = bge.logic.getCurrentController()
scene = bge.logic.getCurrentScene()
own = cont.owner

playerList = [p for p in scene.objects if p.name.startswith("name")]
checkPointsList = sorted([c for c in scene.objects if c.name.startswith("check")], key = lambda self: self.name)

playerNb = len(playerList)


def emptyPosition():    
    
    sortedPlayerList = sorted(playerList, key = lambda self: (self["check"].name, 1/self.getDistanceTo(self["check"])), reverse = True)
    
    firstPlayerPos = sortedPlayerList[0].worldPosition
    
    secPlayerPos = sortedPlayerList[1].worldPosition
    
    maxDist = max([p.getDistanceTo(firstPlayerPos) for p in playerList])
    
    emptyX = (firstPlayerPos.x  + secPlayerPos.x)/2
    
    emptyY = (firstPlayerPos.y + secPlayerPos.y)/2
    
    emptyZ = ((firstPlayerPos.z + secPlayerPos.z)/2)
    
    return [emptyX, emptyY,emptyZ]


        


def steering():
    
    for p in playerList:
        
        if "check" not in p:
            
            p["check"] = checkPointsList[0]
            
        else:
            
            if p.getDistanceTo(p["check"]) < 0.5 and checkPointsList.index(p["check"]) < len(checkPointsList) -1:
                
                p["check"] = checkPointsList[checkPointsList.index(p["check"])+1]
                
def main():
    steering()
    own.worldPosition = emptyPosition()


le problème c'est que la brique logique camera est trop limité et je ne peux plus gérer la hauteur en fonction de la distance max entre les concurrents.

Contribution le : 21/05/2015 11:51
Créer un fichier PDF de la contribution Imprimer


Re: [WIP] Circuit porte conteneur
Fou Furieux du Clan
Inscrit:
21/08/2014 10:50
Post(s): 128
Salut! J'ai légèrement modifié le .blend que j'avais fait pour utiliser un actuator caméra qui suit un empty. L'empty se cale sur la position du premier joueur (D'ailleurs j'aurais pu faire en sorte que l'objet suivi par la caméra soit directement le premier joueur mais si tu veux que la caméra ne soit pas calée exactement sur le premier joueur, ça autorise un peu plus de souplesse):

http://www.mediafire.com/download/n8s99i4frypu4lw/rapido(1).blend

Le fait qu'il y ait un actuator caméra qui gère les mouvements de la caméra n'empêche pas par ailleurs d'écrire une fonction python qui gère le zoom de la caméra!

Pour le temps que ça m'a pris, je ne sais pas trop, j'ai pas regardé. Tout ce que je peux te dire, c'est de pas t'inquiéter de ne pas comprendre directement. C'est beaucoup plus facile d'écrire un script soi-même (quand on a un peu pratiqué le python Blender) que d'essayer de comprendre le script de quelqu'un d'autre.

Bon courage pour la suite!

Contribution le : 21/05/2015 14:28
Créer un fichier PDF de la contribution Imprimer


Re: [WIP] Circuit porte conteneur
Fou Furieux du Clan
Inscrit:
03/04/2014 19:01
Post(s): 117
Merci Barbapapa

Avant de te reposer une question merci pour tout, ça commence a être pas mal du tout.La camera se fait oublier, c'est bon signe. Je vais proposer à un amis de passer tester cela. Seul ce n'est pas évident de gérer deux contrôleurs et je verrais bien comment se comporte la cam dans les gros virages.

Je sollicite encore une fois ton aide donc car il y a un bug.
Le checkpoint cible reste le premier, la voiture en première position est donc celle qui se trouve le plus prêt du premier checkpoint.
Apres plusieurs essais je me suis rendu compte que c’était en supprimant la partie du code qui applique un mouvement aux players.

    # On lui applique un mouvement et une orientation (cette partie du code
                # ne sera pas nécessaire dans ta situation (puisque chaque joueur sera dirigé par quelqu'un)
                vec = p.getVectTo(p["checkpoint"])[1]
                p.applyMovement(vec*p["speed"], False)
                p.alignAxisToVect(vec, 1, 0.2)
                p.alignAxisToVect(Vector((0, 0, 1)), 2, 1)


Si je remet ce bout de code, ça marche mais je ne contrôle plus les voitures.

Contribution le : 22/05/2015 10:28
Créer un fichier PDF de la contribution Imprimer


Re: [WIP] Circuit porte conteneur
Fou Furieux du Clan
Inscrit:
21/08/2014 10:50
Post(s): 128
Salut! Il faut que tu supprimes tout ce bout de code:

# Tant que le joueur n'a pas atteint le dernier checkpoint    
            if p.getDistanceTo(checkPointsList[-1]) > 0.5:
                
                # On lui applique un mouvement et une orientation (cette partie du code
                # ne sera pas nécessaire dans ta situation (puisque chaque joueur sera dirigé par quelqu'un)
                vec = p.getVectTo(p["checkpoint"])[1]
                p.applyMovement(vec*p["speed"], False)
                p.alignAxisToVect(vec, 1, 0.2)
                p.alignAxisToVect(Vector((0, 0, 1)), 2, 1)


Ensuite, ici:

# S'il est tout près de son checkpoint, on change sa cible (prochain checkpoint)
            if p.getDistanceTo(p["checkpoint"]) < 0.5 and checkPointsList.index(p["checkpoint"]) < len(checkPointsList) -1:


tu peux faire comme disait Panzergame, c'est à dire remplacer la condition de distance (p.getDistanceTo(p["checkpoint"]) < 0.5) par une condition de collision avec le checkpoint. Sinon, tu peux augmenter la distance (0.5) pour que la voiture soit bien détectée quand elle passe à proximité du checkpoint (parce que pour l'instant, il faut vraiment qu'elle soit très très près du point d'origine du checkpoint pour qu'on passe au checkpoint suivant)

Contribution le : 22/05/2015 12:50
Créer un fichier PDF de la contribution Imprimer


Re: [WIP] Circuit porte conteneur
Fou Furieux du Clan
Inscrit:
21/05/2014 10:29
Post(s): 261
Dans le cas du checkpoint avec collision tu pourra le faire de la forme que tu veux (Cubique…)

Contribution le : 22/05/2015 15:32
Créer un fichier PDF de la contribution Imprimer



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




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
The Blender Clan 'tchat Blender Tribu, un nouveau forum 5 619 26/06 11:18:05
moonboots 
Questions & Réponses Machine distante puissante 1 87 25/06 13:33:05
sapajou 
Questions & Réponses Lattice cylindrique 2 75 25/06 12:33:08
kimlicrea 
[WIP] et travaux terminés Participation au concours Spark Avec Blender 2 150 25/06 11:51:13
ArnaudT 
Questions & Réponses [résolu] Transition couleur 7 360 23/06 23:13:47
yawdpwal 
Questions & Réponses Image étiré sur un objet 3 177 23/06 22:50:24
meltingman 
Questions & Réponses [non résolu] Mes UDIM ne se chargent pas automatiquement 2 132 23/06 18:00:47
Voltrum 
Questions & Réponses Je n'arrive pas à rendre mon animation, je n'obtiens que des images noires    [1][2] 16 64568 23/06 17:48:25
thomas56 
Questions & Réponses booleen: Faire une différence entre deux objet 4 280 21/06 00:08:50
BlendProblem 
Hors Sujet !! les tutos de Moonboots    [1][2][3]...[29] 284 40354 18/06 09:13:32
moonboots 
Questions & Réponses Panneau disparu en passant de 3.0 à 3.2 2 213 18/06 08:53:13
Horemheb 
The Blender Clan 'tchat Avenir du blender clan    [1][2][3]...[42] 415 58936 15/06 19:35:29
Teto45 
Questions & Réponses [résolu] effet de fumée: mon cube "domain" apparaît lors du render 2 299 14/06 09:42:07
PounchPounch 
[WIP] et travaux terminés [WIP] Les tests de mon gros projet (merci pour vos conseils)    [1][2][3][4] 33 51582 13/06 13:37:51
Lylo 
The Blender Clan 'tchat Leurre ?    [1][2][3] 22 1314 08/06 02:04:39
meltingman 
Moteur de jeu GameBlender et alternatives [non résolu] Cs (vaisseau)    [1][2][3]...[57] 567 185917 07/06 20:14:37
Redstar 
Questions & Réponses [non résolu] Cycle rendre une vitre de manière visible 0 183 06/06 10:33:25
Redstar 
The Blender Clan 'tchat VSE !!! 2 325 05/06 02:35:33
meltingman 
The Blender Clan 'tchat Inscription BlenderClan 6 1187 04/06 09:50:41
Redstar 
The Blender Clan 'tchat Les muets 0 235 03/06 23:04:31
Rimpotche 

Qui est en ligne
228 utilisateur(s) en ligne (dont 47 sur Forums)

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


plus...
Nouveaux membres
LuannWcp53 30/6/2022
LeonStarli 30/6/2022
MadelaineJ 30/6/2022
DoraHooten 30/6/2022
VickyCranw 30/6/2022
SusanneBri 30/6/2022
HeatherNai 30/6/2022
KKYHallie3 30/6/2022
OlivaZ9576 30/6/2022
GenevieveG 30/6/2022
Dernier Ajout
2020-09-24.jpg

Evènements à venir
Jui 30
Anniv des Jedi :-D
Jui 9
BUG de Lyon
Jui 23
Anniv du BlenderClan !
plus 238 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