Timing for a growing tree

I have tree (a trunk and a single branch) made from two curves. The tree “grows” by having the taper object for the trunk and branches which is animated with hooks.

I am using the same taper object for both the tree trunk and the branch, but if the branches start growing at the same time as the trunk, then they are too early and the branches start forming in mid-air. My instinctive approach would be to make separate taper objects of different timings for all the branches, though this could be time consuming for a complex tree.

I’m wondering if there’s a more efficient offset-based way to achieve the same result, so that the same taper object animation can be used for all branches but at different times?

Attachments

growing_tree.blend (77.4 KB)

Don’t know how plausible this is as an idea but how about using a null along the path of the tree and when it gets to a certain point on the path it sets a driver to on for the branch animation ? don’t ask me how to make it though as its just an idea I came up with and drivers still hurt my brian :spin:

Hi jonathandone, thanks for replying :slight_smile: - I thought this wasn’t going to get any attempts. Nice idea, I think you mean to have taper paths triggered from the movement of another object? Not quite sure how I’d set that up… wondering if it would be more economical than a whole bunch of separate animated tapers? If you could make it so that the taper object took its driven keys offset by its own location (e.g. python expression calculated from x,y or z axis Loc) then I guess it might mean that multiple copying of the same taper object and repositioning might work… but yes, could be a bit to get working and I’m not sure on all the steps as yet.

Here’s another go at it. Could be more polished (branches kind of appear as opposed to grow). This time I have multiple branches taking their timing from three taper objects; one for the main trunk, another setting the timing for branches, and then another for the twigs. If I had a few different “levels” of branches (depending on how hight they are up the trunk) it might work.

Attachments

growing_tree2.blend (87.7 KB)

Hi lancer hows things going down your end of the Island ? man the weathers been total crap up this way, finaly some sun today which is always a bonus for thawing out ha ha.

I decided to try and make a visual rep of my idea might help with ideas or at the very least give you a good laugh :smiley:

Attachments

Tree_Idea_.blend (67.5 KB)

Yes, that was something like I thought you meant… nice illustration. Looks like something which might be possible in the game engine with collision detection creating new growing branch instance (the original branch would have to be on another layer for this to work)

Thanks for the look Atom.

The result is kind of screwed up as you say… the RE:lay method still relies on individual curves for different branches, correct? I’m wondering if it might be more efficient to group / clone the taper object curves and then manually offset.

This kind of animation is tricky. Even on my second example, the trunk “grows” whereas the branches more or less “appear”. It’s delicate animation and would be nice to be able to recycle parts. What would be really cool is if Blender had a timing offset switch directly under the taper object option. Tis would mean that the trunk, branches and twigs could all feed from a single animated curve. Looks like it’s a feature not yet made.

still relies on individual curves for different branches, correct?

I did not add any more curves than you already had in the scene. I simply mapped the hook/empties using RE:Lay. They all still move from a single animation but with the requested offset as you suggest. It is possible to use multiple RE:Lay objects if you need one hook moving along X and the other along Y. Or use the axis filtering options that each RE:Lay list entry contains.

Ah yes, though I think you modeled from my growing_tree2.blend version, which was an example of the “solution” of using multiple taper curves, but is what I’d like to avoid. Sorry about the confusion. (Mind you, even my first version has a separate taper curve for the branches so it’s probably not that clear as an example of the kind of solution I was trying to achieve)

I’d like to know if it’s possible to work with minimal taper curves (perhaps only one) and simply apply an offset to when they are active.

See here, in this version (growing_tree3.blend) the trunk, branches and twigs are working from one taper curve with disastrous timing result. Would your timing offset method be able to displace the timing but without new taper curves being added?

…might not be possible?

P.S. I wish I knew python to the level that you must have in order to make that script… nice work.

Attachments

growing_tree3.blend (85 KB)

@Lancer: I don’t think RE:Lay will help out any with the growing_tree3.blend file. There is only one empty to affect. I think three curves per tree might be doable and would allow for some offsetting. A trunk curve, a branch curve and a twig curve.

Cheers Atom. Offset Taper Object does look like another feature for the “maybe someday Blender might have it” list. Thanks for your input.

Here is kind of what I was thinking when I mentioned the RE:Lay integration, although it is not a tree.

I kept the same tree objects from your scene, but wrote a little script(included) to generate a 6 point taper curve. This allows me to connect two hooks to each taper curve.A start and an end empty. This was done for trunk, branch and twig. So six new empties are in the scene. I replaced the tapers in your original scene with these newly created tapers.

I added the RE:Lay object and animated it basically moving right to left with a little lift then drop.
I Sampled the animation (button in RE:Lay panel of object) and added 5 more slots to the list for a total of 6.
In each RE:Lay target I typed in the name of the hook empties attached to the taper curves.
I set the offsets and time stretch value different for each of the RE:Lay list items
This produces a staggered offset animation from a single animated source (i.e. the RE:Lay object) that you can view in the BLEND file.

If you change the offsets, the animation changes, no ReSample needed.
If you change the animation of the RE:Lay object remember to ReSample so the object can relay the new animation to it’s managed list.

Attachments

25_relay_growing_tree4.blend (150 KB)

Thanks Atom, that’s looking interesting.

You’ve got me thinking now about displacement methods. I’m wondering if the empties might have driven keys off each other but then somehow offset the timing of the driven key? Is this possible? I’m not certain whether it might be efficient… perhaps multiple taper curves could be group instanced with their own delayed taper objects, each reading their shapes from separate delayed empties?

In this example I have made driven keys for LocX and LocY where a cube is made to copy the XY movement of a sphere. How might I go about displacing the timing within the key so that the cube follows the sphere?

Attachments

simple_drivenkey.blend (77.8 KB)

Remember, RE:Lay works by scanning for objects named like relay_

So I installed the AddOn and threw away the default relay_animate_me object that the AddOn creates.
I renamed your Leader object to relay_Leader. Just renaming an object with the relay_ prefix makes it a RE:Lay object.
Then I added Follower to the list of managed objects inside the properties panel of realy_Leader.

Now the follower tracks the leader in a delayed fashion.

perhaps multiple taper curves could be group instanced with their own delayed taper objects, each reading their shapes from separate delayed empties?
That is kind of what I was going for in the growing4 version I posted above. However, the hooks for all tapers are just following a single leader in that example. Creating a leader for each taper type (trunk, branch, twig) and adding the related hooks to their list for delaying might approximate what you describe.

Attachments

25_relay_simple_drivenkey.blend (126 KB)

That flows nicely.

Holy smoke - just woke up to see both of these solutions.

Atom; that’s a very useful technique right there. I’m not 100% sure yet how it works (something for me to study) but it certainly creates a convincingly organic looking movement. The follower seems to exaggerate the movement of the leader? (I’m looking at the how it makes a bigger swish towards the end of the animation - seems “stretch” affects both positioning and timing). The displacement looks a little like boids movement, which can be a good thing in many scenarios.

liero; that’s pretty much exactly what I’m looking for. Again, I’m just up and haven’t properly studied how you went about this as yet, and will need to pay attention to what you have written. Looks like you’ve somehow cloned the initial taper as separate entities to each branch and then manually offset the timings by sight. Manual animation / offsets is better than automatic (because human animators can make it at least look like it’s following a few essential timing principles) though I’m very interested in seeing how you’ve simplified the initial duplication process… time for me to learn something here.

Thanks both of you :cool: :cool: