thank you for reaching out to us. Your code does look mostly fine and is working for me. The line
op = Default makes little sense and you are of course missing things like imports, a context guard and a main function. Not all of them are absolutely necessary, but it is strongly advised to use them all, especially for novice users. Find a code example below.
Vertex colors are also not automatically rendered as the diffuse color in Cinema 4D, one must use a VertexMap shader for that. Please consult the user manual or end-user support for end-user questions, we cannot deliver such support here.
The result for two polygon objects, the color of a vertex depends on its position in global space.
"""Creates vertex-color tag on the currently selected polygon object and makes it the
Must be run as a Script Manager scrip with a polygon object selected. The color of each vertex will
depend on its position in global space.
GRADIENT_MIN: float = -200.0 # The lower boundary of the gradient.
GRADIENT_MAX: float = 200.0 # The upper boundary of the gradient.
op: typing.Optional[c4d.BaseObject] # The active object, can be `None`.
def main() -> None:
"""Runs the example.
# Check that there is indeed a selected object and that it is a polygon object.
if not isinstance(op, c4d.PolygonObject):
raise TypeError("Please select a polygon object.")
# Get its point count and allocate a vertex color tag with that count.
count: int = op.GetPointCount()
tag: c4d.VertexColorTag = c4d.VertexColorTag(count)
if not isinstance(tag, c4d.VertexColorTag):
raise MemoryError("Could not allocate tag.")
# We are going to make it a little bit more exciting and write a gradient based on the global
# coordinate y-component of a vertex.
# Set the tag to defining colors only once per vertex instead of having N colors per vertex,
# where N is the number of polygons attached to it.
# Get the global matrix of the polygon object and all its points in global space.
mg: c4d.Matrix = op.GetMg()
globalPoints: list[c4d.Vector] = [mg * p for p in op.GetAllPoints()]
# Define a callable with which we can get the gradient color of a point over its index.
GetGradientColor = lambda i : c4d.Vector4d(
c4d.utils.RangeMap(globalPoints[i].y, GRADIENT_MIN, GRADIENT_MAX, 0, 1, True), 0, 0, 1)
# Get the data pointer of the tag and start writing data.
dataW: object = tag.GetDataAddressW()
for i in range(count):
c4d.VertexColorTag.SetPoint(dataW, None, None, i, GetGradientColor(i))
# Insert the tag into the selected object, make it the active tag, and push an update event.
if __name__ == "__main__":