日々適当
hibitekitou

簡単なスクリプトを書いてみてみた

cg |2019-12-01

必要に迫られて書きました。簡単と言いつつ、作法が本当にわかってないので苦労したw なぜよく分かってないツール(Blender)でやった?というのは、たまたま開いていたソフトがこれだったからぐらいの理由。

import bpy

obj = bpy.context.active_object
msh = obj.data

thVal = 0.75
tgtPoly = []

bpy.ops.object.mode_set(mode='OBJECT', toggle=False)

for poly in msh.polygons:
    maxVal = -100000000.0
    print('poly')
    for i in poly.vertices:
        v = msh.vertices[ i ]
        if v.co.z > maxVal:
            maxVal = v.co.z
    if ( maxVal + 0.001 ) < thVal:
        tgtPoly.append( poly.index )

for i in tgtPoly:
    msh.polygons[i].select = True

bpy.ops.object.mode_set(mode='EDIT', toggle=False)

ポリゴンを構成する頂点のZの最大値が0.75より低いポリゴンを選択する、っての。本当はある高さより低いポリゴンを削除するってのを書きたかったのだけど、消し方がわからないw

事情をもうちょっと細かく書くなら、

こんなデータをもらいました。グリッドを「個々の面で押し出し」で高さ方向に押し出して、その個々の面の高さをバラバラにして、その上で全てのエッジを選択して「辺を分離」したようなデータです。上図右側は面同士はくっついてないよ、ってもの。
こいつのある高さより低い柱を削除したい、というのが今回の命題。しかしある高さより低いポリゴンを選択して 選択→リンク で選択しようとしても全ての面が分離しているために出来ず、じゃあ近接ポイントを結合すればいいんじゃないかと思っても、根元のポイントは隣の柱のポイントと同ポジにあるために隣の柱とくっついちゃう。
故にこんなスクリプト を書きました。

ちなみにもらったデータの柱には、柱の高さごとに色を変えるための頂点カラーが設定されているため、頂点カラーごとに柱を選択して 分離→選択 してやれば色ごとの柱オブジェクトを作成可能だなってことで、そんな作業を手動で全部やりよりかは楽になる程度のスクリプト も書きました。柱ごとの色は単色の想定です。

import bpy

obj = bpy.context.active_object
msh = obj.data

color_layer =  msh.vertex_colors.active

colorList = [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]]

tgtNo = 1 #分離する頂点カラーの番号。この場合緑色の頂点カラーのポリゴンが選択される予定
tgtPoly = []
i = 0
for poly in msh.polygons:
    for idx in poly.loop_indices:
        color =  color_layer.data[i].color
        tmp = [ color[0], color[1], color[2]]
        if tmp == colorList[ tgtNo ]:
            tgtPoly.append( poly.index )
        i += 1 

for i in tgtPoly:
    msh.polygons[i].select = True

bpy.ops.object.mode_set(mode='EDIT', toggle=False)

ネット上のスクリプトのコピペの組み合わせでやってるから、細かいことがわかってない。スクリプト周りはどこを見ると勉強になるだろう。

コメント ( 0 )|Trackback ( 0 )
 
コメント
 
コメントはありません。
コメントを投稿する
ブログ作成者から承認されるまでコメントは反映されません
 
名前
タイトル
URL
コメント
コメント利用規約に同意の上コメント投稿を行ってください。
数字4桁を入力し、投稿ボタンを押してください。