forked from bartvdbraak/blender
Script to set timeoffset of all selected objects using the animated path of an active object.
This means you can have 100's of objects animations run by animating an empty over them, (needs docs to explain really) ... Easy to setup and time a Mexican wave for instance ;)
This commit is contained in:
parent
ec04c09365
commit
38255fcc6f
107
release/scripts/object_timeofs_follow_act.py
Normal file
107
release/scripts/object_timeofs_follow_act.py
Normal file
@ -0,0 +1,107 @@
|
||||
#!BPY
|
||||
"""
|
||||
Name: 'TimeOffset follow Active'
|
||||
Blender: 245
|
||||
Group: 'Object'
|
||||
Tooltip: 'ActObs animated loc sets TimeOffset on other objects at closest frame'
|
||||
"""
|
||||
__author__= "Campbell Barton"
|
||||
__url__= ["blender.org", "blenderartists.org"]
|
||||
__version__= "1.0"
|
||||
|
||||
__bpydoc__= """
|
||||
"""
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# Drop Objects v1.0 by Campbell Barton (AKA Ideasman42)
|
||||
# --------------------------------------------------------------------------
|
||||
# ***** BEGIN GPL LICENSE BLOCK *****
|
||||
#
|
||||
# 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 2
|
||||
# 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 *****
|
||||
# --------------------------------------------------------------------------
|
||||
|
||||
import Blender
|
||||
from Blender import Image, sys, Draw, Window, Scene, Group
|
||||
import bpy
|
||||
import BPyMessages
|
||||
|
||||
|
||||
def main():
|
||||
|
||||
sce = Scene.GetCurrent()
|
||||
|
||||
ob_act = sce.objects.active
|
||||
|
||||
if not ob_act:
|
||||
Draw.PupMenu("Error%t|no active object")
|
||||
return
|
||||
|
||||
objects = list(sce.objects.context)
|
||||
|
||||
try: objects.remove(ob_act)
|
||||
except: pass
|
||||
|
||||
if not objects:
|
||||
Draw.PupMenu("Error%t|no objects selected")
|
||||
return
|
||||
|
||||
curframe = Blender.Get('curframe')
|
||||
|
||||
FRAME_START= Draw.Create( Blender.Get('staframe') )
|
||||
FRAME_END= Draw.Create( Blender.Get('endframe') )
|
||||
|
||||
# Get USER Options
|
||||
pup_block= [\
|
||||
('Start:', FRAME_START, 1, 300000, 'Use the active objects position starting at this frame'),\
|
||||
('End:', FRAME_END, 1, 300000, 'Use the active objects position starting at this frame'),\
|
||||
]
|
||||
|
||||
if not Draw.PupBlock('Set timeoffset...', pup_block):
|
||||
return
|
||||
|
||||
FRAME_START = FRAME_START.val
|
||||
FRAME_END = FRAME_END.val
|
||||
|
||||
if FRAME_START >= FRAME_END:
|
||||
Draw.PupMenu("Error%t|frames are not valid")
|
||||
|
||||
|
||||
# Ok - all error checking
|
||||
locls_act = []
|
||||
for f in xrange((FRAME_END-FRAME_START)):
|
||||
i = FRAME_START+f
|
||||
Blender.Set('curframe', i)
|
||||
locls_act.append(ob_act.matrixWorld.translationPart())
|
||||
|
||||
for ob in objects:
|
||||
loc = ob.matrixWorld.translationPart()
|
||||
best_frame = -1
|
||||
best_dist = 100000000
|
||||
for i, loc_act in enumerate(locls_act):
|
||||
dist = (loc_act-loc).length
|
||||
if dist < best_dist:
|
||||
best_dist = dist
|
||||
best_frame = i + FRAME_START
|
||||
|
||||
ob.timeOffset = float(best_frame)
|
||||
|
||||
# Set the original frame
|
||||
Blender.Set('curframe', curframe)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
Loading…
Reference in New Issue
Block a user