def calculerACam(self): """ Calcul l'angle entre le pingouin et la camera de l'avatar """ vp = geo.Vec3((0.0, 0.0, 0.0)) vp.moins(self.pingouin.repere.o, self.camera.repere.o) camera_angle = self.camera.repere.angle va = geo.Vec3((math.cos(camera_angle), math.sin(camera_angle), 0.0)) self.aCam = va.angleEntre(vp)
def fabriquer(self): le_sol = visu.Objet(maillage=visu.Sol()) self.monde.ajouter(decor=le_sol) le_ciel = visu.Objet(maillage = visu.Ciel()) self.monde.ajouterTransparent(decor=le_ciel) os.chdir("../data/images") for directory in ("Automobile", "Loisirs", "Mode", "Politique", "Spectacle", "Sport", "Tableaux"): os.chdir(directory) for file in glob.glob("*.jpg"): self.textureNames.append(directory + "/"+ file) os.chdir("..") os.chdir("../../src") print len(self.textureNames), len(self.tableauCoord) for indexTableau in range(len(self.textureNames)) : self.tableaux.append(visu.Objet(maillage=visu.Tableau(recto="../data/images/" + self.textureNames[indexTableau],\ verso="../data/images/" +self.textureNames[indexTableau],\ largeur=1.0,hauteur=1.0,epaisseur=0.1))) self.tableaux[indexTableau].orienter(self.rotationTab[indexTableau]) if (self.rotationTab[indexTableau] != 0): self.tableauCoord[indexTableau] = (self.tableauCoord[indexTableau][0] + 0.5,self.tableauCoord[indexTableau][1]- 0.5, self.tableauCoord[indexTableau][2]) self.tableaux[indexTableau].placer(geo.Vec3(self.tableauCoord[indexTableau])) self.monde.ajouter(decor=self.tableaux[indexTableau]) for piece in self.maison.keys(): self.maisonModels[piece] = visu.Objet(maillage=visu.ObjY(url="../data/baker/"+piece+".obj")) self.maisonModels[piece].placer(geo.Vec3((self.maison[piece]))) self.monde.ajouter(decor=self.maisonModels[piece]) for piece in self.transparentMaison.keys(): self.maisonModels[piece] = visu.ObjetBougeant(maillage=visu.ObjY(url="../data/baker/"+piece+".obj")) self.maisonModels[piece].placer(geo.Vec3((self.transparentMaison[piece]))) self.monde.ajouterTransparent(decor=self.maisonModels[piece]) le_visiteur = visu.Objet(maillage=visu.Obj(url="../data/obj/pingouin/p.obj")) le_visiteur.placer(geo.Vec3((6.6,-0.5,0.1))) le_visiteur.orienter(90*math.pi/180.0) self.monde.ajouter(decor=le_visiteur) suivi_visiteur = simu.ActiviteVisiteur(id="visite_pingouin", objet=le_visiteur, camera=self.monde.camera) suivi_visiteur.start() self.monde.ajouter(activite=suivi_visiteur) self.monde.visiteur = le_visiteur le_guide = visu.Objet(maillage=visu.Obj(url="../data/obj/pingouin/p.obj")) #le_guide.placer(geo.Vec3((6.3,1.1,0.1))) #le_guide.orienter(90*math.pi/180.0) self.monde.ajouter(decor=le_guide) deplacements_guide = simu.ActiviteGuide(id="guide_pingouin", objet=le_guide, visiteur=le_visiteur) deplacements_guide.start() self.monde.ajouter(activite=deplacements_guide)
def actualiser(self, t, dt): self.cam.orienter(self.objet.repere.angle) self.objet.orienter(self.objet.repere.angle) xCam = self.objet.repere.o.x - self.cam.dist * math.cos( self.objet.repere.angle) yCam = self.objet.repere.o.y - self.cam.dist * math.sin( self.objet.repere.angle) z = self.objet.repere.o.z if self.objet.repere.o.x >= 5.1 and self.objet.repere.o.x <= 7.7 and self.objet.repere.o.y >= 5.1 and self.objet.repere.o.y <= 10.2 and self.objet.repere.o.z <= 2.8: z = 0.1 + (2.8 - 0.1) * (self.objet.repere.o.y - 5.1) / (10.2 - 5.1) self.objet.placer( geo.Vec3((self.objet.repere.o.x, self.objet.repere.o.y, z))) if self.objet.repere.o.x >= 7.2 and self.objet.repere.o.x <= 7.88 and self.objet.repere.o.y <= 16.4 and self.objet.repere.o.y >= 16.16: self.etat = "zone_escalier2_bas" if self.objet.repere.o.x >= 4.76 and self.objet.repere.o.x <= 5.61 and self.objet.repere.o.y <= 16.67 and self.objet.repere.o.y >= 16.55: self.etat = "zone_escalier2_haut" if self.dernier_etat == "zone_escalier2_bas": if self.objet.repere.o.y >= 16.4: self.etat = "escalier2" elif self.objet.repere.o.y <= 16.16: self.etat = "hors_escalier" z = 2.8 self.objet.placer( geo.Vec3( (self.objet.repere.o.x, self.objet.repere.o.y, z))) if self.dernier_etat == "zone_escalier2_haut": if self.objet.repere.o.y >= 16.67: self.etat = "escalier2" elif self.objet.repere.o.y <= 16.55: self.etat = "hors_escalier" z = 5.1 self.objet.placer( geo.Vec3( (self.objet.repere.o.x, self.objet.repere.o.y, z))) self.dernier_etat = self.etat if self.etat == "escalier2": z = 2.8 + (5.1 - 2.8) * (7.88 - self.objet.repere.o.x) / (7.88 - 5.61) if self.objet.repere.o.x >= 7.5 and self.objet.repere.o.x < 8: y = 16.3 elif self.objet.repere.o.x >= 6.2 and self.objet.repere.o.x < 7.5: y = 17.59 elif self.objet.repere.o.x >= 5 and self.objet.repere.o.x < 6.2: y = 16.60 else: y = 16.60 self.objet.placer(geo.Vec3((self.objet.repere.o.x, y, z))) self.cam.placer(geo.Vec3((xCam, yCam, self.objet.repere.o.z + 0.8)))
def lireGrapheNavigation(nomFichier): gr = Graphe(oriente=False) f = open(nomFichier,"r") for ligne in f : mots = ligne.split() if len(mots) > 0 : if mots[0]=='#': pass elif mots[0]=='s': nom = mots[1] x = float(mots[3]) y = float(mots[4]) z = float(mots[5]) gr.ajouterSommet(nom,geo.Vec3((x,y,z))) elif mots[0] == 'a': ori = mots[1] ext = mots[2] p1 = gr.etiquette(ori) p2 = gr.etiquette(ext) dist = p1.distance(p2) gr.ajouterArc(ori,ext,dist) f.close() return gr
def calculerV(self): """ Calcul la vitesse de l'avatar """ if not hasattr(self, "anciennePosition"): self.anciennePosition = geo.Vec3((0.0, 0.0, 0.0)) self.anciennePosition.copier(self.camera.repere.o) self.v = self.camera.repere.o.distance(self.anciennePosition) * 20 self.anciennePosition.copier(self.camera.repere.o)
def fabriquer(self): le_sol = visu.Objet(maillage=visu.Sol()) self.monde.ajouter(decor=le_sol) le_tableau = visu.Objet( maillage=visu.Tableau(recto="../data/textures/gris.jpg", verso="../data/textures/Ceramic.jpg", largeur=2.0, hauteur=3.0, epaisseur=0.1)) le_tableau.placer(geo.Vec3((0.0, 0.0, 2.0))) self.monde.ajouter(decor=le_tableau) le_tableau = visu.Objet( maillage=visu.Panneau(recto="../data/textures/tree1.png", verso="../data/textures/tree1.png", largeur=6.0, hauteur=12.0, epaisseur=0.1)) le_tableau.placer(geo.Vec3((5.0, 5.0, 0.0))) self.monde.ajouter(decor=le_tableau) le_pingouin = visu.Pinguin(maillage=visu.Obj( url="../data/avatars/p.obj")) le_pingouin.placer(geo.Vec3((-2.0, 3.0, 0.0))) le_pingouin.orienter(45.0 * math.pi / 180.0) self.monde.ajouter(decor=le_pingouin) self.monde.pinguin = le_pingouin une_activite = simu.Activite(id="act-01") # une_activite.start() self.monde.ajouter(activite=une_activite) une_activite = simu.Fou(id="act-02", objet=le_pingouin) une_activite.start() self.monde.ajouter(activite=une_activite)
def fabriquer(self): sol = visu.Objet(maillage=visu.Sol()) arbre = visu.Objet( maillage=visu.Panneau(recto="data/textures/tree1.png", verso="data/textures/tree1.png", largeur=6.0, hauteur=12.0, epaisseur=0.1)) arbre.placer(geo.Vec3((5.0, 5.0, 0.0))) pingouin = visu.Objet(maillage=visu.Obj(url="data/obj/pingouin/p.obj")) pingouin.placer(geo.Vec3((-1.0, 0.0, 0.0))) pingouin.orienter(45.0 * math.pi / 180.0) activite_effraye = simu.Effaye(id="effraye", objet=pingouin, monde=self.monde) activite_aggressif = simu.Aggressif(id="aggressif", objet=pingouin, monde=self.monde) activite_curieux = simu.Curieux(id="curieux", objet=pingouin, monde=self.monde) activite_pose = simu.Pose(id="pose", objet=pingouin, monde=self.monde) self.monde.ajouter(decor=sol) self.monde.ajouter(decor=arbre) self.monde.ajouter(decor=pingouin) self.monde.ajouter(activite=activite_effraye) self.monde.ajouter(activite=activite_aggressif) self.monde.ajouter(activite=activite_curieux) self.monde.ajouter(activite=activite_pose) self.monde.pingouin = pingouin
def __init__(self, id=None, objet=None, visiteur=None): Activite.__init__(self, id, objet) self.etat = "aller" self.visiteur = visiteur self.visite = ("entree_rdc_1", "salle2_rdc_couloir", "salle1_rdc_salle2", "cuisine_rdc_couloir", "chambre1_rdc_couloir", "chambre2_rdc_couloir", "cave1_rdc_couloir", "chambre3_rdc_couloir", "garage_rdc_exterieur", "cave2_rdc_couloir", "salle1_f1_eau", "cafe_f1_petitsalon", "petit_salon_f1_cafe", "salon_f1_1", "salle2_f1_salon", "salle1_f2_couloir", "salle2_f2_couloirb", "piscine_f2_manger", "cafe_f2_manger", "manger_f2_couloir", "sol_f2_couloir", "entree_rdc_1") self.visiteSuite = 1 self.graphe = graphe.lireGrapheNavigation("graphe.nav") self.dij = graphe.Dijkstra(self.graphe) self.noeudCourant = self.visite[0] self.objet.placer( geo.Vec3((self.graphe.etiquette(self.noeudCourant).x, self.graphe.etiquette(self.noeudCourant).y, self.graphe.etiquette(self.noeudCourant).z))) self.objet.orienter(math.pi / 2) self.noeudCible = self.visite[1] self.parcoursListe = self.dij.trouverChemin(de=self.noeudCourant, a=self.noeudCible) self.posList = 0 self.pointCible = self.parcoursListe[1] #self.pointCible.y = self.pointCible.y + 1 self.attenteEnCours = False self.tempsAttente = 3 self.dernierTemps = 0 self.seuilRaccourcis = 0 self.tempsNouvelleVisite = time.time() self.tempsEchecProposition = 5 self.distanceEchecProposition = 8
def actualiser(self, t, dt): dist = self.objet.repere.o.distance(self.visiteur.repere.o) dist2 = self.pointCible.distance(self.visiteur.repere.o) if dist > self.distanceEchecProposition and dist2 > self.seuilRaccourcis and time.time( ) > self.tempsNouvelleVisite + self.tempsEchecProposition: self.etat = "raccourcis" if self.etat == "aller": dr = dt atteint = False xc = self.objet.repere.o.x - self.pointCible.x yc = self.objet.repere.o.y - self.pointCible.y r = math.sqrt(xc * xc + yc * yc) if xc > 0: theta = math.atan(yc / xc) elif xc == 0 and yc > 0: theta = math.pi / 2.0 elif xc == 0 and yc < 0: theta = -1.0 * math.pi / 2 elif xc == 0 and yc == 0: theta = 0 elif yc >= 0: theta = math.atan(yc / xc) + math.pi elif yc < 0: theta = math.atan(yc / xc) - math.pi if r > dr: r = r - dr else: atteint = True xc = r * math.cos(theta) yc = r * math.sin(theta) if math.fabs(self.objet.repere.o.z - self.pointCible.z) > dr: if self.objet.repere.o.z >= self.pointCible.z: dz = -0.5 * dr else: dz = 0.5 * dr atteint = False else: dz = 0 self.objet.placer( geo.Vec3((xc + self.pointCible.x, yc + self.pointCible.y, dz + self.objet.repere.o.z))) if self.objet.repere.angle > theta + 1.1 * math.pi: self.objet.orienter(self.objet.repere.angle - math.pi / 30.0) elif self.objet.repere.angle < theta + 0.9 * math.pi: self.objet.orienter(self.objet.repere.angle + math.pi / 30.0) if atteint: self.posList += 1 if self.posList + 1 >= len(self.parcoursListe): self.etat = "attendre" else: self.pointCible = self.parcoursListe[self.posList + 1] elif self.etat == "attendre": if not self.attenteEnCours: self.dernierTemps = time.time() self.attenteEnCours = True if time.time() > self.dernierTemps + self.tempsAttente: self.attenteEnCours = False if self.visiteSuite + 1 < len(self.visite): self.noeudCourant = self.visite[self.visiteSuite] self.visiteSuite += 1 self.noeudCible = self.visite[self.visiteSuite] self.parcoursListe = self.dij.trouverChemin( de=self.noeudCourant, a=self.noeudCible) self.posList = 0 self.pointCible = self.parcoursListe[1] self.etat = "aller" else: self.etat = "fini" elif self.etat == "fini": pass elif self.etat == "raccourcis": bestI = 0 i = 0 best = 5000 for point in self.visite: d = self.graphe.etiquette(point).distance( self.visiteur.repere.o) if d < best: best = d bestI = i i = i + 1 self.seuilRaccourcis = best * 1.3 self.noeudCible = self.visite[bestI] self.parcoursListe = self.dij.trouverChemin(de=self.noeudCourant, a=self.noeudCible) self.posList = 0 self.visiteSuite = bestI if len(self.parcoursListe) >= 2: self.pointCible = self.parcoursListe[1] else: self.pointCible = self.parcoursListe[0] self.etat = "aller" self.tempsNouvelleVisite = time.time()
def __init__(self): self.repere = geo.Repere() self.repere.placer(geo.Vec3((-5.0, 0.0, 1.6))) self.repere.orienter(0.0)
def __init__(self): self.repere = geo.Repere() self.repere.placer(geo.Vec3((-5.0, 0.0, 1.6))) self.repere.orienter(0.0) self.vitesse = 0.0 self.angleDegre = 0.0
def getDistance(self, obj): distance = geo.Vec3((0.0, 0.0, 0.0)) distance.moins(self.repere.getO(), obj.repere.getO()) return distance.norme()