changing camera issues

hello every one ! =)
i’m a student from Brasil, and i’m currently studing Panda3D with python.
I’m trying to make a game in third person camera, but when the player press a button, this camera has to change to a Orthographic view.
i’m having difficulties to write this code. At least i wrote this, but its not working, can somebody help me:

    def anexaCamera(self,task):
        if (self.estados["mudar_cam"] == False):
            base.camera.setY (20)
            base.camera.setP (165)
            base.camera.setR (180)
            base.camera.setZ (-3)
            
            dummy = NodePath ("dummy")
            dummy.reparentTo (self.persona)
            
            base.camera.reparentTo (dummy)
            dummy.setP (30)
            
            
            lente = base.cam.node().getLens()
            lente.setFov(40)
            
        if (self.estados["mudar_cam"] == True):
            lens = OrthographicLens()
            ratio = base.getAspectRatio()
            lens.setFilmSize(100.0, 100.0/ratio)
            base.camera.node().setLens(lens)
            base.camera.setPos(0, -100, 0)
        else:
            self.estados["mudar_cam"] == True
            
            
        return Task.cont

It would be helpful if you told us what exactly isn’t working.

Looking at your code, I see several problems with it. But, most importantly, it doesn’t look like solution to you problem at all. I would do something like:

    self.mudar_cam = True
    base.accept("enter", self.toggleCam)
    def toggleCam(self):
        if self.mudar_cam:
            # set the camera mode 1
            base.camera.setY(20)
            base.camera.setP(165)
            base.camera.setR(180)
            base.camera.setZ(-3)
            dummy = NodePath("dummy")
            dummy.reparentTo(self.persona)
            base.camera.reparentTo(dummy)
            dummy.setP(30)
            lente = base.cam.node().getLens()
            lente.setFov(40)
        else:
            # set camera mode 2
            lens = OrthographicLens()
            ratio = base.getAspectRatio()
            lens.setFilmSize(100.0, 100.0/ratio)
            base.camera.node().setLens(lens)
            base.camera.setPos(0, -100, 0)
        # update self.mudar_cam variable
        self.mudar_cam = not self.mudar_cam

i try do like you said birukoff, but i got this error:

File "panda01.py", line 360, in <module>
    objetoAvatar = Avatar()
  File "panda01.py", line 91, in __init__
    self.toggleCam()
  File "panda01.py", line 201, in toggleCam
    if self.mudar_cam:
AttributeError: Avatar instance has no attribute 'mudar_cam'

i probably did wrong, this is my Avatar class:

class Avatar(DirectObject):
    def __init__(self):
        
        
        
        
        
        
        self.pizzaImagem = ["texturas/Saude0.png",
                            "texturas/Saude1.png",
                            "texturas/Saude2.png",
                            "texturas/Saude3.png",
                            "texturas/Saude4.png",
                            "texturas/Saude5.png",
                            "texturas/Saude6.png"]

        self.saude = 1
        self.estados = {"direita":0, "esquerda":0,
                        "pular":False, "cair":0,
                        "X":0, "mudar_cam":True}

        self.velocidade=9
        self.pontoBase = 0
        self.pontoAuge = 0
        self.forcaEmpuxo=0.3
        self.alturaMaxima = 3
        

        #animacao
        self.blenAnim = [1.0, 0.0, 0.0]#idle run jump
        self.estaSeMovendo = False
        self.estaNoAr = True
        
        self.toggleCam()
        self.carregaAtor()
        self.capturaEventos()
        self.criaColliders()
        self.exibeGUI()

        taskMgr.add(self.mover, "moverPersona")
        ## taskMgr.add(self.anexaCamera, "dummy")

    def exibeGUI(self):
        self.graficoSaude = OnscreenImage( image= self.pizzaImagem[self.saude], pos=(-1,0,-0.7), scale=(0.2) )
        self.graficoSaude.setTransparency( TransparencyAttrib.MAlpha )

        self.graficoNum = OnscreenText( text= str(self.saude), pos=(-1,-0.73,0), scale=(0.1), fg=(1,1,1,1) )

    def atualizaGUI(self):
        self.graficoSaude.setImage( self.pizzaImagem[self.saude] )
        self.graficoSaude.setTransparency(TransparencyAttrib.MAlpha)

        self.graficoNum.destroy()
        self.graficoNum = OnscreenText( text=str(self.saude), pos=(-1,-0.73,0), scale=(0.1), fg=(1,1,1,1) )


    def criaColliders(self):
        #ESFERA + PUSHER
        self.avatarEsferaCN = CollisionNode("avatarEsfera")
        self.avatarEsferaCN.addSolid( CollisionSphere(0,0,1.5, .8) )
        self.personaEsfNP = self.persona.attachNewNode(self.avatarEsferaCN)
        self.personaEsfNP.show()
    
        
        base.cTrav.addCollider( self.personaEsfNP, base.pusher )
        base.pusher.addCollider( self.personaEsfNP, self.persona )

        #RAY + FLOOR
        self.raio = CollisionRay(0,0,0.5 , 0,0,-1)
        self.avatarRaioCN = CollisionNode("avatarRaio")
        self.avatarRaioCN.addSolid( self.raio )

        self.personaRaioNP = self.persona.attachNewNode( self.avatarRaioCN )
        self.personaRaioNP.show()

        base.cTrav.addCollider( self.personaRaioNP, base.floor )
        base.floor.addCollider( self.personaRaioNP, self.persona )

        #ESFERA + Eventos
            # --- PE
        self.cNodeEsferaPe = CollisionNode("avatarPe")
        self.cNodeEsferaPe.addSolid( CollisionSphere(.5,0,0, .1) )
        self.personaPe = self.persona.attachNewNode( self.cNodeEsferaPe )
        self.personaPe.show()

        base.cTrav.addCollider(self.personaPe, base.collEvent2)

    def carregaAtor(self):
        self.persona = render.attachNewNode("persona")

        self.personaActor = Actor("eggs/personagem.egg",
                             {"idle":"eggs/personagem-parado",
                              "run" :"eggs/personagem-correr",
                              "jump":"eggs/personagem-pular"}
                             )
        self.personaActor.setScale(.3)
        self.personaActor.loop("idle")
        self.personaActor.reparentTo(self.persona)
        self.personaActor.setPos(0,0,1.5)

        self.personaActor.enableBlend()
        self.personaActor.loop("idle")
        self.personaActor.loop("run")
        self.personaActor.loop("jump")

        self.persona.setPos(0,30,0)
        self.persona.setH(90)

    def capturaEventos(self):
        self.accept("arrow_right", self.alteraEstado, ["direita",1] )
        self.accept("arrow_left", self.alteraEstado, ["esquerda",1] )
        self.accept("arrow_up", self.alteraEstado, ["pular",True] )
        ## self.accept("a", self.alteraEstado, ["mudar_cam", True])
        base.accept("enter", self.toggleCam)
        self.accept("arrow_right-up", self.alteraEstado, ["direita",0] )
        self.accept("arrow_left-up", self.alteraEstado, ["esquerda",0] )

        #Colisoes
        self.accept("col-celula-avatar", self.saudeAvatar)

        self.accept("into-plataforma", self.tocaSolo )
        self.accept("outof-plataforma", self.saiSolo )

    def saudeAvatar(self, carga):
        print "Saude Avatar:"
        print self.saude
        print "nova carga:"
        print carga
        self.saude = self.saude + carga
        print "nova saude:"
        print self.saude
        self.atualizaGUI()

    def alteraEstado(self, chave, valor):
        if chave == "pular":
            if self.estados["cair"]==1:
                self.estados["pular"] = False
            else:
                self.estados[chave] = valor
        else:
            self.estados[chave] = valor

    def toggleCam(self):
        if self.mudar_cam:
            # set the camera mode 1
            base.camera.setY(20)
            base.camera.setP(165)
            base.camera.setR(180)
            base.camera.setZ(-3)
            dummy = NodePath("dummy")
            dummy.reparentTo(self.persona)
            base.camera.reparentTo(dummy)
            dummy.setP(30)
            lente = base.cam.node().getLens()
            lente.setFov(40)
        else:
            # set camera mode 2
            lens = OrthographicLens()
            ratio = base.getAspectRatio()
            lens.setFilmSize(100.0, 100.0/ratio)
            base.camera.node().setLens(lens)
            base.camera.setPos(0, -100, 0)
        # update self.mudar_cam variable
        self.mudar_cam = not self.mudar_cam

[/code]

Birukoff probably meant to replace self.mudar_cam by self.estados[“mudar_cam”] in his code (whatever ‘estados’ means).

Yes, sorry for confusion.
Something like this would help:

    self.accept("enter", self.toggleCam)
    def toggleCam(self):
        if self.estados["mudar_cam"]: # if True:
            # set the camera mode 1
            lens = PerspectiveLens() # don't forget to change the lens type
            lens.setFov(40) # set lens properties
            base.cam.node().setLens(lens) # update camera with new lens
            # now, set all other properties... I don't include them here
        else:
            # set camera mode 2
            lens = OrthographicLens()
            ratio = base.getAspectRatio()
            lens.setFilmSize(100.0, 100.0/ratio)
            base.cam.node().setLens(lens)
        # update self.estados["mudar_cam"] variable
        self.estados["mudar_cam"] = not self.estados["mudar_cam"]