예제 #1
0
파일: simu.py 프로젝트: lepieru/moribus
 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)
예제 #2
0
  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)
예제 #3
0
    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)))
예제 #4
0
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
예제 #5
0
파일: simu.py 프로젝트: lepieru/moribus
 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)
예제 #6
0
    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)
예제 #7
0
    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
예제 #8
0
    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
예제 #9
0
    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()
예제 #10
0
 def __init__(self):
     self.repere = geo.Repere()
     self.repere.placer(geo.Vec3((-5.0, 0.0, 1.6)))
     self.repere.orienter(0.0)
예제 #11
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
예제 #12
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()