it seem to be impossible to animate a falloff curve in blender, for example the falloff graph in the vg-edit modifier. Please prove me wrong…
This is quite a big deal if it’s the case, there’s tremendous potential in motion graphic wasted…
here are some examples with slope/aspect/height generated vertex group.(the graph you see is the graph from the vgedit modifier)
If you activate the AnimAll add-on, you can animate all kinds of properties, such as vertex colors and individual vertices, but I don’t know if graphs are supported as well.
I get that but well, animating graphs are quite a big deal in motion graphics isn’t it?
i don’t get the map_curve properties cannot be animated natively
Curves from curve widgets can not be animated.
Their points are representing 2D points.
That is different from Vertex (3D Points) and F-Curves (1D value evaluated according to time).
So, that requires an animation developer to pass time on subject to make it work.
That is not an exception about falloff of VW modifiers.
That is also the case for RGB Curves, Vector Curves nodes or Bevel Profiles.
The fact that work on Custom Bevel Profile was done during 2.8, 2.9 series, postponed the idea to animate them.
Yes. That would help a lot to have an animatable curve widget.
But, in future, the idea of different Curve widgets will probably be replaced by a unique node used for anything.
When would be done modifier nodes was a question without answer at beginning of 2.8 development.
At least, for Vertex Weight modifiers, you can animate a texture influencing VW modifier.
Just linked a bezier to a map_curve with python, updating on frame_pre handler
It’s still crazy to think that this is not supported by default
#there's some ugle try except it there, not sure how to avoid out of bounds error?
def clean_all_points(m):
"""only left 2 points in the graph"""
c = m.map_curve.curves[0]
iter = 0
while len(c.points) > 2: #(seam that cannot got lower and start from 0 ?)
for p in c.points:
try:
c.points.remove(p)
break
except: #unable to remove points for some reasons
pass
#emergency break
iter+=1
if iter==999:
break
return
def apply_matrix_to_graph(curve,matrix):
"""create graph from given location matrix"""
for i,p in enumerate(matrix):
x,y,*h = p
try:
curve.points[i].location = [x,y]
if h: #handle support, only "VECTOR" or "AUTO"
curve.points[i].handle_type = h[0]
except:
curve.points.new(x,y)
return None
def get_matrix_from_bezier_verts(o):
"""get matrix from curve verts"""
matrix = []
depsgraph = bpy.context.evaluated_depsgraph_get()
eo = o.evaluated_get(depsgraph)
ob = eo.to_mesh(preserve_all_data_layers=True, depsgraph=depsgraph)
for v in ob.vertices:
x = v.co.x
y = v.co.y
matrix.append([x,y,"VECTOR"])
return matrix
def clean_bezier_splines(o):
""" clean o splines data"""
for spline in o.data.splines:
o.data.splines.remove(spline)
return None
def linear_interpolation(v1,v2,k):
"""vector linear interpolation"""
return v1*k + v2*(1-k)
def update_bezier_from_matrix(o,matrix,name=""): #o = bpy.data.curves
"""update bezier data"""
handle_care = False
#create curve if needed
if o is None:
bpy.ops.curve.primitive_bezier_curve_add(location=(0, 0, 0),scale=(1, 1, 1))
o = bpy.context.object
o.name = "SCATTER_GRAPH_OBJECT"
# if name:
# o.name = "SCATTER_GRAPH_OBJECT " + name
#clean curve splines
clean_bezier_splines(o)
s = o.data.splines.new(type="BEZIER")
points = s.bezier_points
for i ,pt in enumerate(matrix) :
x,y,*h = pt
#add points if needed
try: _ = points[i]
except: points.add(1)
#change handle position
P = points[i]
P.co = (x,y,0)
#change handle type
if h is not None:
P.handle_left_type = h[0]
P.handle_right_type = h[0]
if h[0]=="AUTO":
handle_care=True
if not handle_care:
return o
#if handle set to auto, scale will be too large, need to scale down
#cannot scale down handle on auto, they need to be on free type
#if directly doing action right in loop above, weird api behavior. not possible.
for P in s.bezier_points:
CO = P.co
if P.handle_left_type=="AUTO":
P.handle_left_type ="FREE"
P.handle_left = linear_interpolation(P.handle_left, CO, 0.2,)
if P.handle_right_type=="AUTO":
P.handle_right_type ="FREE"
P.handle_right = linear_interpolation(P.handle_right, CO, 0.2,)
return o
You just have to make an addon that does that for all kind of Curve Widgets (modifiers’ ones, nodes’ ones & Bevel Profiles), submit it to developers and it could be bundled with next official release. https://developer.blender.org/project/view/3/
Not yet I’m still really busy on my main project
but i’m curious that no official devs took a look at this issue.
Also it seems that the vgedit modifier graphs are quite different from the other graphs editors.
not sure why there’s such difference, imo everything need to be centralized in one and only graph editor
Yeah i will do a free addon with this feature like I did with Lodify.
Just need to finish my main addon project first
Just an update on this
because i believe that the graphs editor differs from place to place (that’s a consistent inconsistency we got here) it might be tricky to implement such important functionality from python.
The best of the best would have to be a proper universal curve editor