特定のvertex_colorsに色を塗りつぶすためのBlenderAPIはありますか?

Aug 23 2020

この質問からヒントを得て、vertex_colorsに1色の塗りつぶしを作成することをテストしています。正常に動作しますが、ポリゴンが多いメッシュでは非常に遅くなります。

ob = context.object
color = (0,0,0,0)
vertex_color = ob.data.vertex_colors['My Vertex color']
            
i = 0
for p in ob.data.polygons:
    for idx in p.loop_indices:
        vertex_color.data[i].color = (color)
        i += 1

演算子も見つけましたbpy.ops.paint.vertex_color_set()(2倍速いようです)が、私はそのアイデアがあまり好きではありません。さらに、明らかに入力のない演算子です。

これを直接行うBlenderApiはありますか?

良い答えの後:

上記のコードは、この場合は意味をなさないコードです。私のテストはこの方法に移行しました(それほど速くはありません):

for d in vertex_color.data[:]: #Slow method
    d.color = (1,0,0,1)

いずれにせよ、@ batFINGERの回答と@lemonのヘルプがあれば、コードは以前より4倍以上速くなりました。

回答

4 batFINGER Aug 23 2020 at 22:20

すべてのループ頂点の色を1つに設定します

foreachsetメソッドを使用します。ここでの使用例ベジェ曲線の作成https://blender.stackexchange.com/a/180184/15543

import bpy
import numpy as np

context = bpy.context

name = "Xxxx"
r, g, b, a = (1, 0, 0, 1) # red


ob = context.object
me = ob.data

color_layer = (me.vertex_colors.get(name)
               or me.vertex_colors.new(name=name)
               )
ones = np.ones(len(color_layer.data))

color_layer.data.foreach_set(
        "color",
        np.array((r * ones, g * ones, b * ones, a * ones)).T.ravel(),
        )
        
me.update()

単純に

np.array((r, g, b, a) * len(color_layer.data)).T.ravel()