Let’s say I have a sequence of png’s (001.png, 002.png, 003.png etc) and I have a plane texture mapped with this image sequence. Is it possible for me to have image change every 100 frames (ie every 5 seconds at 20fps or @ 0.2 fps)? I used to be under the impression that there was a way of choosing the frame rates for textures but obviously I was wrong! Anyone got any suggestions?
Of course there are alternatives: duplicate frames to 001.png becomes a sequence of indentical frames 001.png - 100.png, 002.png becomes 101.png - 200.png etc. This seems rather wasteful and tedious (is there an easy way?). Or if I could convert a video to 0.2 fps - again, unfortunately, I don’t know how to do this!
If this is not possible in Blender, can it be done with Virtualdub or Avisynth? Thanks in advance for your help.
Do you want the rest of the video to be rendered at 25 fps? If so, then how about you convert the image sequence to a movie (avi codec) with key frames every 4 seconds (at 25 fps). That will produce a very small file since there is no delta between keyframes, really just a compendium of your images). Then use that as your texture.
If you are using nodes, then a way that I can think of is to use the Time node to “switch in” each picture for the 100 frames (time node feeds the Fac on a Mix node). But you would need 15 per minute of video and 15 image inputs.
Do you want the rest of the video to be rendered at 25 fps?
Yup! I tried using the quicktime output format to change the keyframe ratio. I also tried using one of the .avi codecs but no success.
Your time node suggestion is interesting but may be a little inefficient. Personally I find the time node hard to manipulate.
Thanks for your help anyways!
EDIT: I suspect I may have to use Python (which I haven’t used in ages). From the API:
from Blender import Texture,Image,Material
footex = Texture.Get(‘foo’) # get texture named ‘foo’
footex.setType(‘Image’) # make foo be an image texture
img = Image.Load(‘test.png’) # load an image
footex.image = img # link the image to the texture
I’ll need a frame scriptlink and a looping index that increments when currentframe modulo 100 = 0.
While I can figure it out, I would be very appreciative if someone knowledgable in Python could bash it out!
Well, I forgot what a joy Blender Python is to use. Having forgotten everything, it only took an hour or so to find all I needed. Unfortunately, I couldn’t get the registry to work for persistent variables but there was a way round that. So here is the script!
from Blender import *
sce = Scene.Get('100 loop')
context = sce.getRenderingContext()
frame = context.currentFrame()
if frame%100 == 0:
index = frame/100
name = "C:/" + '%04d' % index + ".png"
footex = Texture.Get('Tex')
img = Image.Load(name)
footex.image = img
Hope that helps anyone else who comes across the same problem!
Ah! that approach reminds me of a slide-show I did where I just animated the color effect of an image texture. Limited to the 10 texture channels per material, but each plane would get you 1000 frames. you know, in the materials panel with that texture selected, set the color to 1.0 when you want that image visible, then back down to 0, and then move on to the next channel. You can even then do your own crossover/fade effect. IPO’s visible under Texture IPO type.