Introdução a programação 3D – VPhyton

Publicado: 22 de março de 2014 em 3D

VPython é a linguagem de programação Python, adicionada de um módulo de gráficos 3D chamado Visual. VPython permite aos usuários criar objetos como esferas e cones no espaço 3D e exibe esses objetos em uma janela. Isto torna mais fácil para criar visualizações simples, permitindo que os programadores se concentrar mais no aspecto computacional de seus programas. A simplicidade de VPython tornou uma ferramenta para a ilustração de física simples, especialmente no ambiente educacional.

Controles

  • Rotação : use o botão direito do mouse para girar o objeto 3D
  • Zoom: use os dois botões do mouse simultaneamente para dar zoom, posicionando o mouse para frente e para traz.

Requisitos

  • Sistema Operacional  – Windows, Linux ou Mac.
  • Python Versão 2.75
  • VPython 6
  • VIDLE – Ide Visual Python

Downloads

Python e VPython

Windows: http://www.vpython.org/contents/download_windows.html

Linux: http://www.vpython.org/contents/download_linux.html

Mac: http://www.vpython.org/contents/download_mac.html

Instalação

Primeiro você precisa instalar o Python 2.75 para o seu sistema operacional, depois instale o Vpython. O VPython utiliza sua própria IDE, ao invés de usar a IDE visual tradicional para o Python chamada IDLE, você precisa usar a IDE que é instalada automaticamente com o VPython chamada VIDLE.

Recomendação

É necessário saber o básico da linguagem Python, para isto use nosso Walktrought Python, usando o menu do lado esquerdo do site chamado Categoria e escolha a opção Python, os posts mais recentes vem em primeiro lugar, caso queira iniciar na linguagem Python vá para o primeiro post.

Exemplo:

Após a instalação do VPython, abra a IDE VIDLE e use o exemplo abaixo para testar o VPython, use os controles para efeito de zoom e rotação dos objetos 3D. Este exemplo ilustra a Lei de Faraday usada na área da Física.

intro

Lei de Faraday

A lei de Faraday-Neumann-Lenz, ou lei da indução eletromagnética, é uma das quatro equações de Maxwell que regem o eletromagnetismo clássico. É com essa lei que se entende a produção de corrente elétrica em um circuito colocado sob efeito de um campo magnético variável ou por um circuito em movimento em um campo magnético constante. É a base do funcionamento dos alternadores, dínamos e transformadores.

VPython

from visual import *
#needs a code clean-up (seems to now work on Python 2.4/VPython 3.2.9)

print """
Electromagnetism: Faraday Law (v2.76) 2008-02-29
Rob Salgado (salgado@physics.syr.edu)

Electric Field vectors are blue. Magnetic Field vectors are red.

  The thick green vector representing
d|B|/dt ("time-rate-of-change-of-the-magnitude-of-the-magnetic-field")
is associated with the spatial arrangement of the electric field according to
the FARADAY Law (as evaluated on the green loop).
[The sense of circulation on the green loop (by the RightHandRule) determines
the direction of change of the magnetic field... OPPOSITE to your thumb.]

      CLICK the mouse to start and stop the animation
      TOGGLE: (f)araday
              (d)im-fields (n) color-scheme  (v)erbose"""

scene=display(
    width=800,height=600,
    x=0, y=0)

colorScheme=0          #key n (negative)
colorBackground=[color.black,color.white]
colorEdimmed=[(0.0,0,0.4),(0.5,0.5,1)]
scene.ambient=0.4
Ecolor=[color.blue,(0.5,0.5,1),color.green]
Ecolor[1]=colorEdimmed[colorScheme]

scene.background=colorBackground[colorScheme]
scene.background=color.black; Ecolor=[color.blue,(0,0,.4),color.green]
#scene.background=color.white; Ecolor=[color.blue,(0.9,0.9,0.9),color.yellow]
scene.title="FARADAY: Changing-Bs are associated with Curly-Es"
scene.range=(2.5,2.5,2.5)
scene.forward=(-2.85804, -1.26038, -2.96742)

#scene.forward=(0.089623,4.193811,0.983082)

#scene.range=(1.5,1.5,1.5)
#scene.forward=(2.102859,-3.185552,1.998194)

showFaraday=0
dimFields=0

B=[]
B.append( arrow(pos=vector(0.25,0,0),axis=vector(0,0,1e-3), shaftwidth=0.04,fixedwidth=1, color=color.red)  )
B.append( arrow(pos=vector(-0.25,0,0),axis=vector(0,0,1e-3),shaftwidth=0.04,fixedwidth=1, color=color.red)  )
B.append( arrow(pos=vector(0,0.25,0),axis=vector(0,0,1e-3), shaftwidth=0.04,fixedwidth=1, color=color.red)  )
B.append( arrow(pos=vector(0,-0.25,0),axis=vector(0,0,1e-3), shaftwidth=0.04,fixedwidth=1, color=color.red)  )
B.append( arrow(pos=vector(0.25,0,-2),axis=vector(0,0,1e-3), shaftwidth=0.04,fixedwidth=1, color=color.red)  )
B.append( arrow(pos=vector(-0.25,0,-2),axis=vector(0,0,1e-3),shaftwidth=0.04,fixedwidth=1, color=color.red)  )
B.append( arrow(pos=vector(0,0.25,-2),axis=vector(0,0,1e-3), shaftwidth=0.04,fixedwidth=1, color=color.red)  )
B.append( arrow(pos=vector(0,-0.25,-2),axis=vector(0,0,1e-3), shaftwidth=0.04,fixedwidth=1, color=color.red)  )

N=8
dBdt=0.2
E=[]
Ebox=[]

for z in [0]:
    for r in [0.5]:
        for i in arange(0,N):
            theta=2.*pi*i/N
            theta_hat=vector(-sin(theta), cos(theta), 0)
            Efield= -dBdt*theta_hat/r
            A=arrow(pos=vector(r*cos(theta),r*sin(theta),z) , axis=Efield,shaftwidth=0.04,fixedwidth=1,color=color.blue)
            E.append(A)
            Ebox.append( box(pos=A.pos+A.axis/4.,axis=A.axis,length=mag(A.axis)/2.,height=0.04,width=0.04,color=color.blue) )
    for r in [1,1.5]:
        for i in arange(0,N):
            theta=2.*pi*i/N
            theta_hat=vector(-sin(theta), cos(theta), 0)
            Efield= -dBdt*theta_hat/r
            A=arrow(pos=vector(r*cos(theta),r*sin(theta),z) , axis=Efield,shaftwidth=0.04,fixedwidth=1,color=color.blue)
            E.append(A)
            Ebox.append( box(pos=A.pos+A.axis/4.,axis=A.axis,length=mag(A.axis)/2.,height=0.04,width=0.04,color=color.blue) )

for z in [-0.5,0.5,-1,1]:
    for r in arange (.5,1.5,.5):
        for i in arange(0,N):
            theta=2.*pi*i/N
            theta_hat=vector(-sin(theta), cos(theta), 0)
            Efield= -dBdt*theta_hat/r
            A=arrow(pos=vector(r*cos(theta),r*sin(theta),z) , axis=Efield,shaftwidth=0.04,fixedwidth=1,color=color.blue)
            E.append(A)
            Ebox.append( box(pos=A.pos+A.axis/4.,axis=A.axis,length=mag(A.axis)/2.,height=0.04,width=0.04,color=color.blue) )

hcolor=Ecolor[2]

Bp=[]
for b in B:
    Bp.append( arrow(pos=b.pos+b.axis,axis=dBdt*norm(b.axis),
                     #length=dBdt,
                     fixedwidth=1, color=hcolor, shaftwidth=0.07,headwidth=0.14, visible=showFaraday)  )

Eloop_rad=mag(E[0].pos)
FaradayLoop=curve(color=hcolor, x=Eloop_rad*cos(2.*pi*arange(40)/40.), y=Eloop_rad*sin(2.*pi*arange(40)/40.), visible=showFaraday )

#I=cylinder(radius=0.04,pos=vector(0,0,-2),axis=vector(0,0,4), color=color.yellow)
#chgpos=[]
#chg=[]
#for i in arange(0,N):
#    chgpos.append(vector(I.pos+I.axis*i/N))
#    chg.append(sphere(pos=chgpos[-1],radius=0.05,color=I.color))

t=9.50
#t=10.0
#t=10.5

dt=1

#Now... WHEN AN OBJECT IS PICKED,
#TRANSLATE THE scene.center TO THE OBJECT'S POSITION
while 1:
    rate(10)
    t += dt
##    for i in arange(0,N):
##        chg[i].pos = chgpos[i]+(t%4)*vector(0,0,.125)
    bcount=0
    for b in B:
        b.length = (t%20)/10.+1e-3
        Bp[bcount].pos=b.pos+b.axis; bcount +=1

    if scene.mouse.clicked:
        scene.mouse.getclick()
        newPick=scene.mouse.pick
        if newPick !=None:
            ### ANIMATE TO SELECTED POSITION
            tempcolor=newPick.color
            newPick.color=color.yellow
            target=newPick.pos
            step=(target-scene.center)/20.
            for i in arange(1,20,1):
                rate(10)
                scene.center +=step
                scene.scale *= 1.037  #(1.037**19=1.99)
            newPick.color=tempcolor

    if scene.kb.keys: # is there an event waiting to be processed?
        s = scene.kb.getkey() # obtain keyboard information
        if s=='f':
            showFaraday +=1; showFaraday %=2; FaradayLoop.visible=showFaraday
            for i in Bp:
                i.visible=showFaraday

            if showFaraday==1:
                for i in arange(0,N):
                    E[i].color=hcolor
                    Ebox[i].color=hcolor
            else:
                for i in arange(0,N):
                    E[i].color=color.blue
                    Ebox[i].color=color.blue

        if s=='d':
            dimFields +=1; dimFields %=2;

            for i in arange(N,len(E)):
                E[i].color=Ecolor[dimFields]
                Ebox[i].color=Ecolor[dimFields]
            for i in arange(1,4*N+1):
                E[-i].visible=(1-dimFields)
                Ebox[-i].visible=(1-dimFields)

        if s=='n':
            colorScheme = (colorScheme+1)%2 #TOGGLE colorScheme
            scene.background=colorBackground[colorScheme]
            Ecolor[1]=colorEdimmed[colorScheme]
            scene.background=colorBackground[colorScheme]

            for i in arange(N,len(E)):
                E[i].color=Ecolor[dimFields]
                Ebox[i].color=Ecolor[dimFields]
            for i in arange(1,4*N+1):
                E[-i].visible=(1-dimFields)
                Ebox[-i].visible=(1-dimFields)

        if s=='z':
            print "scene.center=(%f,%f,%f)"  % tuple(scene.center)
            print "scene.forward=(%f,%f,%f)"  % tuple(scene.forward)
            print "scene.range=(%f,%f,%f)"  % tuple(scene.range)
            print "t=%f\n" %t

        if s==' ':
            dt  +=1; dt %=2;

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s