# How to animate vertex colors using animation nodes

How can animation nodes drive vertex colors on an object?

Details

I have a time varying dataset the defines the color for each vertex in a model. I'd like to use animation nodes to drive the colors of the vertices.

The best solution found so far requires a very complex setup. It requires defining vertex groups and assigning colors to the vertex groups. This could require assigning a larger number of vertex groups. The preferred solution is to work directly with the vertices.

2. Assign vertex groups. These are used to get access to the vertices.

1. Assign a texture to the object using vertex colors.

1. Setup animation nodes using a script to assign colors to the vertex groups. In this example, instead of colors, a temperature is used, and converted to a color.

1. A script is used to assign the list of values passed to colors for the vertex groups.
def fraction(x,idx,n):
# on a domain of 0,1 with n center points and
center = idx/(n-1)
dist_2_center = center-x
portion = 1-abs(dist_2_center*(n-1))
fract = max(0,portion)
return fract

def find_color(x,colors):
n = len(colors)
f = [fraction(x,idx,n) for idx in range(n)]
c = [0,0,0,0]
for ii,ff in enumerate(f):
for jj,cc in enumerate(c):
c[jj] += ff*colors[ii][jj]
return c

def t_color(t):
colors = [ (0,0,0,1),(0,0,1,1),(0,1,1,1),(0,1,0,1),(1,1,0,1),(1,0,0,1),(1,1,1,1)]
c = find_color(t,colors)
return c

####################################################################

import bmesh

o = Object       # passed into node

colors = [t_color(t) for t in Temps]   # passed into node

#print(colors)

#########################
mesh = o.data        # get the mesh
bm = bmesh.new()     # place holder for working bmesh
bm.from_mesh(mesh)   # create a copy of the mesh

#build list of vertex indices in each group
vert_group_indices = []
for vg in o.vertex_groups:
# check if vertex is in this vertext group using indexes
vert_indices = [v.index for v in o.data.vertices if vg.index in [ vv.group for vv in v.groups]]
vert_group_indices += [vert_indices]

# walk list of vertex groups, assign colors based on vertext groups

#colors = [(0,0,0,1),(1,0,0,1),(0,1,0,1),(0,0,1,1)]
color_layer = bm.loops.layers.color[0] # use first color layer
for vg_idx,vert_indices in enumerate(vert_group_indices):
c = colors[vg_idx]
for face in bm.faces:
for loop in face.loops:
if loop.vert.index in vert_indices:
loop[color_layer] = c

bm.to_mesh(mesh)   # put mesh in the object

1. The result is an object with vertex group assigned colors that can be animated.

Is there any easier way? Is there a way to assign colors to vertices without using vertex groups when using animation nodes? Is there anything in animation nodes that makes this easier?

A sample file with this setup from Blender 2.83 is here :

Animation nodes have Set Vertex Color node which can assign colors to vertices, loops or polygons.