Blender 2.25/2.26/2.27... 
Python :
Changer de camera à la volée 

(English version)


    Début   Index
précédent Script Python
script: pointeur souris Suivant

 
Version <<Matrix>>
Version simple
Version simple bis : autoconnexion à la scène 
Le GUI pour blender 2.27 et inférieur.
 

Variation en utilisant le nom de la caméra pour stocker les frames 
de départ et d'arrêt

Sur la même thématique voir aussi : 
  Enregistrer une image de la scène courante
  Enregistrer une image de chaque caméra de la scène courante
  Enregistrer une image des  caméras définies dans une liste et la frame voulue (ou sur une série de frame)


#------------------------- 
# Changer de camera pendant 
# une animation.
# jm soler 04/06/2003.

# Effet matrix assisté par python.

# 1/  Noter qu'il faut qu'une caméra soit correctement attribuée 
#      avec "ctrl-0" avant de lancer l'animation. 
# 2/  La boucle d'animation obtenu par "alt-a" ne relancera pas 
#      automatiquement le script..Le script doit êtr elié à la scène pour être 
#     pris en compte . 
#------------------------- 
import Blender 
VERSION=Blender.Get('version') 
#------------------------- 
# On remplit la liste des noms 
# d'objets camera.
#------------------------- 
c=[] 
for n in range(1,26): 
    c.append("Camera.%03d"%n) 
print c 
rythmedechangement=4 
maxframe=(len(c)-1)*rythmedechangement 
print maxframe 
#------------------------- 
# Relever le numéro de frame 
# courant.
#------------------------- 
if VERSION >=228: 
   frame=Blender.Get('curframe') 
else: 
   frame=Blender._Blender.Get('curframe') 

#------------------------- 
# Tester ce qui doit être fait 
# pour la frame courante.
#------------------------- 
print frame%rythmedechangement, c[frame/rythmedechangement] 
if frame%rythmedechangement==0: 
       Blender.Scene.getCurrent().setCurrentCamera(Blender.Object.Get(c[frame/rythmedechangement])) 
 


Essayer le fichier Blender associé à cette page: Changer de camera
 


#------------------------- 
# Changer de camera pendant 
# une animation (version simple) 
# jm soler 06/2003 
#------------------------- 
import Blender 
VERSION= Blender.Get('version') 
#------------------------- 
# on remplit la liste des noms 
# d'objets camera.
#------------------------- 
c=["Camera.001", 
                 "Camera.06", 
                 "Camera.012", 
                 "Camera.018", 
                 "Camera.024"] 
#------------------------- 
# Relever le numéro de frame 
# courant.
#------------------------- 
if VERSION < 228 : 
   frame=Blender._Blender.Get('curframe') 
else: 
   frame=Blender.Get('curframe') 

#------------------------- 
# Recupérer l'objet scene courant.
#------------------------- 
  Sc=Blender.Scene.getCurrent() 

#------------------------- 
# Tester ce qui doit être fait 
# pour la frame courante.
#------------------------- 
if frame==20: 
                 Sc.setCurrentCamera(Blender.Object.Get(c[1])) 
elif frame==40: 
                 Sc.setCurrentCamera(Blender.Object.Get(c[2])) 
elif frame==80: 
                 Sc.setCurrentCamera(Blender.Object.Get(c[3])) 
elif frame==100: 
                 Sc.setCurrentCamera(Blender.Object.Get(c[4])) 
elif frame==1: 
                 Sc.setCurrentCamera(Blender.Object.Get(c[0]))

Version simple effectuant sa connexion à la scène automatiquement . Donc faire un alt-p sur la fenêtre de script avant utilisation .  Cette opération ne sera plus nécessaire par la suite . Alt-a et l'utilisation du bouton Anim permettront de visualiser  les changements  .
 

#------------------------- 
# debut du script
#------------------------- 
#------------------------- 
# Changer de camera pendant 
# une animation (version simple) 
# jm soler 06/2003 
#------------------------- 
import Blender 
#------------------------- 
# le script se lie automatiquement avec la 
# scene, donc il faut faire un alt-p 
#------------------------- 
EVENT='FrameChanged'
# Le chargement de ce script dans une fenetre texte est 
# obligatoire .
NAME='camera.py'
#------------------------- 
# Recupérer l'objet scene courant.
#------------------------- 
Sc=Blender.Scene.getCurrent() 
scriptlink=Sc.getScriptLinks(EVENT)
if scriptlink and NAME  in scriptlink:
   pass
else:
   # Erreur si NAME ne se trouve pas dans la liste
   # des fichiers texte.
   Sc.addScriptLink(NAME,EVENT)

frame=Blender.Get('curframe') 
#------------------------- 
# Tester ce qui doit être fait 
# pour la frame courante.
#------------------------- 
if frame==20:    # indiquer le numero de frame 
     Sc.setCurrentCamera(Blender.Object.Get('Camera.001')) # indiquer le nom de camera
elif frame==40:  # indiquer le numero de frame 
     Sc.setCurrentCamera(Blender.Object.Get('Camera.002')) # indiquer le nom de camera
elif frame==80:  # indiquer le numero de frame 
     Sc.setCurrentCamera(Blender.Object.Get('Camera.003')) # indiquer le nom de camera
elif frame==100: # indiquer le numero de frame 
     Sc.setCurrentCamera(Blender.Object.Get('Camera.004')) # indiquer le nom de camera
elif frame==1:   # indiquer le numero de frame 
     Sc.setCurrentCamera(Blender.Object.Get('Camera.005')) # indiquer le nom de camera
#------------------------- 
# ... etc .
# ajouter autant de ligne "elif frame==" suivie de la ligne "Sc.setCurrentCamera(Blende"
# qu'il y a de camera à traiter 
#------------------------- 
#------------------------- 
# fin de script
#------------------------- 
 


 


Graphic User Interface (réservée blender 2.27 et en dessous)

La création d'une GUI pour un script <<liée>> demande une organisation un peu plus complexe que celle utilisée pour les scripts classiques.

En fait, il va être nécessaire de créer deux scripts : un pour la GUI et un second qui sera lié à la scène. On peut facilement imaginer qu'un script qui demanderait le réaffichage d'un fenêtre interactive à chaque frame poserait des problèmes, au moins de ralentissement de l'affichage.

La difficulté majeure sera de passer des informations d'un script à l'autre, car à chaque exécution de script , l'espace de nom de variable du python est nettoyé. On ne peut donc pas garder de valeur dans une variable globale d'un script à l'autre. Le seul espace de nom qui n'est pas remis à jour est celui du module  Blender lui-même. L'astuce consiste à lui accrocher les informations.

Pour comprendre ce qui est réalisé, il faut décomposer le script. En voici l'expression la plus simple possible:
 
 


import Blender 
c=[ # nom  d'objet , frame 
    ["Camera.001"  ,   1 ], 
    ["Camera.002"  ,   10], 
    ["Camera.001"  ,   20], 
    ["Camera.002"  ,   50], 
 ] 
frame=Blender._Blender.Get('curframe') 
Sc=Blender.Scene.getCurrent() 
for c_ in c: 
  if frame==c_[1]: 
     Sc.setCurrentCamera(Blender.Object.Get(c_[0]))

D'un coté les données: le nom de l'objet et le numéro de frame.
 
 
 


c=[ # nom  d'objet , frame 
    ["Camera.001"  ,   1 ], 
    ["Camera.002"  ,   10], 
    ["Camera.001"  ,   20], 
    ["Camera.002"  ,   50],
 ]

D'un autre les opérations effectuées sur ces données.
 
 


import Blender 
frame=Blender._Blender.Get('curframe') 
Sc=Blender.Scene.getCurrent() 
for c_ in c: 
  if frame==c_[1]: 
     Sc.setCurrentCamera(Blender.Object.Get(c_[0]))

Les données doivent être construites à part. C'est le travail effectué au travers de l'interface graphique. Comme cela a été annoncé, une liste (nommée c) est connectée au module Blender principal:
 
 


#---------------------------------------- 
# GUI pour Changer de camera pendant 
#---------------------------------------- 
import Blender
... 
Blender.c=[]
...

Dans cette liste, on range le nom de l'objet et le numéro de la frame sous la forme d'une nouvelle liste constituée de ces deux seuls éléments.
 
 


       try: 
          name=Blender.Object.getSelected()[0].name 
          Blender.c.append([name,frame.val])

Une fois dans la liste Blender.c , ces données sont disponibles, en lecture et en écriture, pour tous les les autres scripts qui pourraient être lancés simultanément  (ou simplement après) a la GUI.
 
 


#------------------------- 
# Changer de camera pendant 
# une animation : version pour 
# la GUI. Attention ce fichier doit 
# être << lié >> a la scene avec 
# l'option "framechanged  ".

# jm soler 05/06/2003 
#------------------------- 
import Blender 
#------------------------- 
# On remplie la liste des noms 
# d'objets camera.
#------------------------- 
try: 
  c=Blender.c
except: 
  pass 
... 
try: 
  for c_ in c:

Si l'interface Graphique est relancée, dans sa forme actuelle, la liste est vidée.
Rien n'interdit d'ajouter les contrôles nécessaires à des opérations d'effacement, de gestions et de maintenance. Ce devrait être disponible dans la version 0.2

 (Essayer le fichier Blender associé à ces deux scripts: Changer de camera GUI )

Première partie:
 
 


#----------------------------- 
# GUI pour Changer de camera pendant 
# une animation.
# jm soler 05/06/2003.
#------------------------------ 
# Avant de commencer vérifiez 
# que le script "cancam4gui.py" est bien 
# lié à la scene avec l'option 
# "frameChanged". Ensuite procédez de la 
# manière suivante : 

# 1/ Lancer le GUI  : "alt-p". 
# 2/ Sélectionnez un objet.
# 3/ Appuyez sur view pour 
#    afficher le nom. 
# 4/ Modifiez la valeur de frame 
#     avec le sider .
# 5/ Appuyez sur le bouton select 
#    object pour enregistrer.

# Dans la fenêtre 3D, passez en 
# vue camera, et testez le résultat 
# avec la combinaison de touche "alt-a". 
#------------------------------ 
import Blender 
from Blender import Object 
from Blender.Object import * 
from Blender.Draw import * 
from Blender.BGL import * 

Blender.c=[] 

objet_camera=Create(0) 
frame=Create(0) 
name="" 
def draw(): 
    global objet_camera,frame,name 
    glClear(GL_COLOR_BUFFER_BIT) 
    glRasterPos2f(20, 210) 
    Text("Script Python de Changement de Camera") 
    glRasterPos2f(20, 190) 
    Text("Jean-michel Soler, juin 2003") 
    objet_camera=Button("Select objet : "+name, 3, 20, 160, 200, 18) 
    objet_camera=Button("view", 2, 220, 160, 60, 18) 

    frame=Slider("frame : ", 2, 20, 140, 240, 18, frame.val, 1, 256) 

    #boutons de sortie 
    Button("Exit", 1, 40, 10, 80, 19) 

def event(evt, val): 
    if (evt== QKEY and not val): Exit() 

def bevent(evt): 
    global objet_camera,objet_camera, name 
    if   (evt== 1): 
        Exit() 
    if   (evt== 2): 
          name=Blender.Object.getSelected()[0].name 
          Blender.Redraw() 
    elif (evt== 3): 
        try: 
          name=Blender.Object.getSelected()[0].name 
          Blender.c.append([name,frame.val]) 
          Blender.Redraw() 
        except: 
          pass 
    elif (evt==5): 
        Blender.Redraw() 

Register(draw, event, bevent)

Seconde partie:



#------------------------- 
# Changer de camera pendant 
# une animation : version pour 
# la GUI. Attention ce fichier doit 
# être << lié >> à la scene avec 
# l'option "framechanged".

# jm soler 05/06/2003 
#------------------------- 
import Blender 
#------------------------- 
# On remplie la liste des noms 
# d'objets camera.
#------------------------- 
try: 
  c=Blender.c 
except: 
  pass 
#------------------------- 
# Relever le numéro de frame 
# courant.
#------------------------- 
frame=Blender._Blender.Get('curframe') 
#------------------------- 
# Recupérer l'objet scene courant.
#------------------------- 
Sc=Blender.Scene.getCurrent() 
#------------------------- 
#Tester ce qui doit être fait 
# pour la frame courante.
#------------------------- 
try: 
  for c_ in c: 
     print c_ 
     if frame==c_[1]: 
        Sc.setCurrentCamera(Blender.Object.Get(c_[0])) 
except: 
 pass

GUI V 0.2






Variation en utilisant le nom de la caméra pour stocker les frames de départ et d'arrêt
 
 
 

 
#!BPY

""" Registration info for Blender menus: <- these words are ignored
Name: 'Camera Changer'
Blender: 246
Group: 'Animation'
Tip: 'Using the camera\'s name, it creates a list of duration which are tested during the animation to set the active camera'
"""

__author__ = ['JMS, Jm Soler','jerome le chat']'
__version__ = '1.01'
__url__ = ["Author's site , http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_changerdecamera.htm", "French Blender support forum, http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender"]
__email__=["jms, jmsoler [at] free.fr"]
 

__bpydoc__ = """\

Caution : this is mainly bound to be used in a distributed rendered work.

How to :

Usind the name of camera, this script creates a dictionnary in which are 
logged all the modifications  of the active camera. Then the script links 
 a blender text to the scene with the  Render events.

Usage:

1/  rename the camera with the model : name, frame n, frame n1, frame n2

2/ Run the script. 
A dictionnary with the time measured in number of frame is created 
   and a script is linked to the scene. Each time the  scene 
   is rendered, the script compares the current frame to the entries 
   in the dictionnary and if it find a duration that contains the current
   frame it sets as the active camera, the camera attached to this entry.

Example :
   the camera  : "Camera,18,35,75" and "Camera.001,1,25" will give 
   the dictionnary :
    changercamera={
       ('1', '18'): 'Camera.001,1,25', 
      ('35', '74'): 'Camera,18,35,75', 
     ('25', '34'): 'Camera.001,1,25', 
     ('18', '24'): 'Camera,18,35,75'
     }
 

known Problems

 if you change the number of a frame in the name of a camera you have 
 to restart manually the script. 

"""

# --------------------------------------------------------------------------
# ***** BEGIN GPL LICENSE BLOCK *****
#
# Copyright (C) 2003-2008: Jm Soler
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 3
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
#
# ***** END GPL LICENCE BLOCK *****
# --------------------------------------------------------------------------

#---------------------------------
# Pour faciliter son utilisation ce script utilise le meme format de nom 
# de camera que celui du script de Regis Montoya mais ce qu'il en fait
# est tres différent.
#---------------------------------

import Blender

Sc=Blender.Scene.getCurrent() 
 

changercamera={} 
ob_cam = [ob for ob in Sc.objects if ob.type == 'Camera']
changercamera={}
camera=[]
for c in  ob_cam:
  cam=c.name.split(',')
  for (n,c0) in enumerate(cam):
   if n>0:
    camera.append([int(c0),c.name]) 
camera.sort()
for n,c in enumerate(camera[:-1]): 
 changercamera[c[0],camera[n+1][0]-1]=c[1]
 

texte="""
import Blender
Sc=Blender.Scene.getCurrent() 
frame=Blender.Get('curframe') 
changercamera=%s
for (n,c) in changercamera.iteritems(): 
 t = range(int(n[0]),int(n[1])+1)
 if frame in t: 
   Sc.setCurrentCamera(Blender.Object.Get(c))
"""%(str(changercamera))

try:
 scripting=Blender.Text.Get('changecamera.py')
 scripting.clear()
 scripting.write(texte) 
except: 
 scripting=Blender.Text.New('changecamera.py')
 scripting.write(texte)

EVENT='Render'  #ou framechanged au choix, Render semble plus sur...
NAME='changecamera.py'
scriptlink=Sc.getScriptLinks(EVENT)
if scriptlink and NAME  in scriptlink:
   pass
else:
   Sc.addScriptLink(NAME,EVENT)

 


 
 
précédent : Script Python
 script: pointeur souris Suivant
Vers le  Haut de page

Les questions concernant cette page  peuvent être posées sur  :
 news://news.zoo-logique.org/3D.Blender


 

 

Livre en français
Blender : apprenez, pratiquez, Créez, livre, Ed. Campus Press, coll. Starter Kit
Blender Starter Kit

Forum
FAQ
Lexique
Didacticiels
Compilations
Blender2KT
Débuter
Modelage
Blender python
Materiaux
Lumière
Animation
API python (eng)
Archives nzn
Statistiques
Doc flash Sculptris
Galerie Sculptris

mon site de démos sur youtube