特定の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()