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.

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;