#-------------------------
# 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)
|
Les questions concernant cette page
peuvent être posées sur :
news://news.zoo-logique.org/3D.Blender
|