« 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
Questions & Réponses problème d'apparence (remesh ??) 3 69 Hier 21:25:41
meltingman 
[WIP] et travaux terminés Mes guitares 5 114 Hier 19:42:01
Rimpotche 
Questions & Réponses debutant- engrenage en pointe    [1][2] 12 628 Hier 12:12:33
CBY 
Questions & Réponses Raccourcis clavier qui ne marchent plus v 2.93.4 4 303 07/12 19:46:04
GFC 
[WIP] et travaux terminés Nature - Court-métrage    [1][2][3] 29 4053 07/12 19:22:05
Bibi09 
Hors Sujet !! les tutos de Moonboots    [1][2][3]...[25] 243 26041 07/12 13:01:21
moonboots 
Le coin des geeks win10 - avoir visuel d'un fichier blend ? 8 175 06/12 21:32:52
sapajou 
Questions & Réponses Contraindre les valeurs de Shape Key d'un Lattice 2 86 06/12 00:18:32
Horemheb 
Graphisme alternatif Choix des couleurs 0 83 04/12 20:23:42
BlendSkill 
Questions & Réponses Placer un objet par rapport à un autre objet 7 221 04/12 14:29:56
BlendProblem 
The Blender Clan 'tchat Blender 2.8x : Actus, tests, feedback..    [1][2][3]...[10] 97 54014 04/12 09:47:10
Bibi09 
The Blender Clan 'tchat le topic de l'impression 3D    [1][2][3]...[125] 1248 394732 04/12 09:01:12
Redstar 
Moteur de jeu GameBlender et alternatives [WIP] Godot Engine - Projet Arsenal    [1][2][3] 23 2579 03/12 17:18:28
Redstar 
Questions & Réponses [non résolu] Addon Mb-Lab 3 160 03/12 14:05:26
Guiu 
Questions & Réponses Récupérer la couleur en sortie de shader    [1][2] 12 475 03/12 10:51:49
Horemheb 
Questions & Réponses Sapling tree gen, comment le récupérer 0 88 02/12 20:30:18
Lylo 
Questions & Réponses [résolu] X-Ray uniquement en mode Solid 3 222 02/12 20:05:12
Horemheb 
The Blender Clan 'tchat Folle souris 3 206 02/12 12:43:22
Rimpotche 
Questions & Réponses [résolu] Ngons 6 257 01/12 19:00:13
Rimpotche 
Questions & Réponses [WIP] animatique vers projet réél : comment concilier les fichiers ? 4 167231 30/11 21:38:43
doudoulolita 

Qui est en ligne
128 utilisateur(s) en ligne (dont 59 sur Forums)

Membre(s): 4
Invité(s): 124


EltonCalla, LinnieLon1, JenniSumpt, Charlie27O, plus...
Nouveaux membres
AlissaPett 9/12/2021
Elliott468 9/12/2021
JulieMcCre 9/12/2021
DoreenCole 9/12/2021
JuanaYount 9/12/2021
MiloDelong 9/12/2021
MarissaCyx 9/12/2021
PenneyStei 9/12/2021
FideliaMcC 9/12/2021
FloraDarcy 9/12/2021
Dernier Ajout
2020-09-24.jpg

Evènements à venir
Dec 29
Anniversaire d'ebrain
Jan 8
BUG de Lyon
Fev 15
Anniversaire de Dany
plus 246 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