Skip to main content
added 2480 characters in body
Source Link

A single vertex can have multiple colors at the same time, because it can belong to multiple faces (with different colors). The vertex colors are also stored inper face loops and not in vertices themselves.:

There is no way to set color to single face-loop element in UI, you surelyenter image description here

Vertex colors can set vertex color to vertex (which will propagate to all the associated face-loops vertices) by drawing over itbe viewed in Vertex Paint mode. This results in the color being interpolated over all the surrounding facesIn this mode individual vertices can also be edited with brushes:

But you can limit theThe drawing onlycan be constrained to selected faces, but not individualselected vertices. Blender doesn't allow this from the UI like other software you mentioned (Max).

With thisHere is a script that when run in Text editor will add panel to properties (N) so you can also achieve non-smoothassign vertex colors (here some vector displacement visualized on faces)to vertices in edit-mode:

enter image description hereenter image description here

The viewing of vertex colors is still best in vertex paint mode, having this in panel would clutter it.

Code:

import bpy
import bmesh

class VertexColEditPanel(bpy.types.Panel):
    bl_label = "Vertex Colors"
    bl_space_type = "VIEW_3D"
    bl_region_type = "UI"
    
    @classmethod
    def poll(self, context):
        ob = context.active_object
        try:
            return ob and ob.type == 'MESH' and ob.mode == 'EDIT'
        except (AttributeError, KeyError, TypeError):
            return False
    
    def draw(self, context):
        layout = self.layout
        bm = bmesh.from_edit_mesh(context.active_object.data)
        if bm.select_mode != {'VERT'}:
            layout.label("Vertex select only", icon = 'INFO')
            return
        selected = [vert.index for vert in bm.verts if vert.select]
        if not selected:
            layout.label("Nothing selected", icon = 'INFO')
        else:
            layout.template_list("MESH_UL_uvmaps_vcols", "vcols", context.active_object.data, "vertex_colors", context.active_object.data.vertex_colors, "active_index", rows=1)
            row = layout.row(align=True)
            row.prop(context.scene, 'color_picker', text="")
            row.operator("vertex_col.apply")

class ApplyVertCol(bpy.types.Operator):
    bl_idname = "vertex_col.apply"
    bl_label = "Assign"
    bl_description = "Assign color to selected vertices for selected vertex color layer"
    
    def execute(self, context):
        me = context.active_object.data
        bm = bmesh.from_edit_mesh(me)
        selected = [vert.index for vert in bm.verts if vert.select]
        bpy.ops.object.mode_set(mode='EDIT', toggle=True)
        for face in me.polygons:
            for vert_idx, loop_idx in zip(face.vertices, face.loop_indices):
                if vert_idx in selected:
                    me.vertex_colors[me.vertex_colors.active_index].data[loop_idx].color = context.scene.color_picker
        bpy.ops.object.mode_set(mode='EDIT', toggle=True)
        return{'FINISHED'}

bpy.utils.register_module(__name__)
bpy.types.Scene.color_picker = bpy.props.FloatVectorProperty(subtype='COLOR_GAMMA', default=(1,1,1), min=0.0, max=1.0, description="Color Picker")

A single vertex can have multiple colors at the same time, because it can belong to multiple faces (with different colors). The vertex colors are also stored in face loops and not in vertices themselves.

There is no way to set color to single face-loop element in UI, you surely can set vertex color to vertex (which will propagate to all the associated face-loops vertices) by drawing over it in Vertex Paint mode. This results in the color being interpolated over all the surrounding faces:

But you can limit the drawing only to selected faces, not individual vertices.

With this you can also achieve non-smooth vertex colors (here some vector displacement visualized on faces):

enter image description here

A single vertex can have multiple colors at the same time, because it can belong to multiple faces (with different colors). The vertex colors are stored per face loops and not in vertices themselves:

enter image description here

Vertex colors can be viewed in Vertex Paint mode. In this mode individual vertices can also be edited with brushes:

The drawing can be constrained to selected faces, but not selected vertices. Blender doesn't allow this from the UI like other software you mentioned (Max).

Here is a script that when run in Text editor will add panel to properties (N) so you can assign vertex colors to vertices in edit-mode:

enter image description here

The viewing of vertex colors is still best in vertex paint mode, having this in panel would clutter it.

Code:

import bpy
import bmesh

class VertexColEditPanel(bpy.types.Panel):
    bl_label = "Vertex Colors"
    bl_space_type = "VIEW_3D"
    bl_region_type = "UI"
    
    @classmethod
    def poll(self, context):
        ob = context.active_object
        try:
            return ob and ob.type == 'MESH' and ob.mode == 'EDIT'
        except (AttributeError, KeyError, TypeError):
            return False
    
    def draw(self, context):
        layout = self.layout
        bm = bmesh.from_edit_mesh(context.active_object.data)
        if bm.select_mode != {'VERT'}:
            layout.label("Vertex select only", icon = 'INFO')
            return
        selected = [vert.index for vert in bm.verts if vert.select]
        if not selected:
            layout.label("Nothing selected", icon = 'INFO')
        else:
            layout.template_list("MESH_UL_uvmaps_vcols", "vcols", context.active_object.data, "vertex_colors", context.active_object.data.vertex_colors, "active_index", rows=1)
            row = layout.row(align=True)
            row.prop(context.scene, 'color_picker', text="")
            row.operator("vertex_col.apply")

class ApplyVertCol(bpy.types.Operator):
    bl_idname = "vertex_col.apply"
    bl_label = "Assign"
    bl_description = "Assign color to selected vertices for selected vertex color layer"
    
    def execute(self, context):
        me = context.active_object.data
        bm = bmesh.from_edit_mesh(me)
        selected = [vert.index for vert in bm.verts if vert.select]
        bpy.ops.object.mode_set(mode='EDIT', toggle=True)
        for face in me.polygons:
            for vert_idx, loop_idx in zip(face.vertices, face.loop_indices):
                if vert_idx in selected:
                    me.vertex_colors[me.vertex_colors.active_index].data[loop_idx].color = context.scene.color_picker
        bpy.ops.object.mode_set(mode='EDIT', toggle=True)
        return{'FINISHED'}

bpy.utils.register_module(__name__)
bpy.types.Scene.color_picker = bpy.props.FloatVectorProperty(subtype='COLOR_GAMMA', default=(1,1,1), min=0.0, max=1.0, description="Color Picker")
Source Link

A single vertex can have multiple colors at the same time, because it can belong to multiple faces (with different colors). The vertex colors are also stored in face loops and not in vertices themselves.

There is no way to set color to single face-loop element in UI, you surely can set vertex color to vertex (which will propagate to all the associated face-loops vertices) by drawing over it in Vertex Paint mode. This results in the color being interpolated over all the surrounding faces:

enter image description here

But you can limit the drawing only to selected faces, not individual vertices.

You can set the colors to individual face-loop vertices with python like this:

for ipoly in range(len(ob.data.polygons)):
    for ivertex in ob.data.polygons[ipoly].loop_indices:
        ob.data.vertex_colors["col"].data[ivertex].color = (R,G,B)

With this you can also achieve non-smooth vertex colors (here some vector displacement visualized on faces):

enter image description here