Open1

メッシュデータの取得方法

黒狐黒狐

分かったので書いておきます。
Mesh(ID)---Blender Python API
次のサンプルコードが書いてありました。
前回読んだ記事:
チートシート
も参考になりそうな。

import bpy

me = bpy.context.object.data
uv_layer = me.uv_layers.active.data

for poly in me.polygons:
    print("Polygon index: %d, length: %d" % (poly.index, poly.loop_total))

    # range is used here to show how the polygons reference loops,
    # for convenience 'poly.loop_indices' can be used instead.
    for loop_index in range(poly.loop_start, poly.loop_start + poly.loop_total):
        print("    Vertex: %d" % me.loops[loop_index].vertex_index)
        print("    UV: %r" % uv_layer[loop_index].uv)

これをデフォルトの・・


この時に実行すると、いろいろ出てきます。


つまりこのmeがメッシュデータのようです。bpy.context.objectでアクティブなオブジェクトを取得して、それのdataがメッシュデータのようです。たとえば頂点の座標が欲しい場合、

import bpy

me = bpy.context.object.data

for v in me.vertices:
    print(v.co)

のようにすればいいわけですね。実行結果:


x座標、y座標が大きいものほど番号が小さい、いわゆる辞書式の順序になっていることがわかります。
また、スクリプトで作った場合など、オブジェクトに名前がついている場合、名前でもアクセスできます。

# オブジェクトから名前でアクセスする場合
import bpy

obj = bpy.data.objects.get("Cube")
# もしくは obj = bpy.data.objects['Cube'] でも可
me = obj.data

for v in me.vertices:
    print(v.co)
# メッシュの名前から直接アクセスしたりもできる
import bpy

me = bpy.data.meshes.get("Cube");
# もしくは me = bpy.data.meshes['Cube'] でも可

for v in me.vertices:
    print(v.co)

つまりアクティブである必要はないわけですね。
これを使って色を設定したりできたら面白そう・・

次回、ノードの正体が明らかに!?
ayatoさんのコードのColorRampとWave Textureの正体がわかった。ノードだ。
Shadingタブでそれを使って接続することで使えるようになるみたいなのよ!

import bpy
mat = bpy.data.materials['CubeMaterial']
print("----------------------------------------------------")
print(mat.node_tree)

for i in range(len(mat.node_tree.nodes)):
    print(mat.node_tree.nodes[i])

Materialに名前を付けてこれを実行するとノードエディタでMaterial Outputにくっつけたノードの一覧が表示される。スクリプトではこの中身をいじっていたんだと思う。


コンソール:


RampColorもあった。なるほど、これを設定したうえで、script側でいろいろやってたわけね・・inputは配列の形で入ってて[1]ってやるとscaleが取得出来てwaveの幅が変化するみたい。その値がdefault_valueでアクセス出来て自由にいじれたり出来るみたい。
 ノードについても追加された順に配列に放り込まれるようだ・・UVとか気になるね。