スポンサーリンク

Blenderで二本のエッジの交点に点を追加する(Python) 2.79,2.8両対応

エッジを二本選択し、その交点を求めたい。


How can I add vertices to intersection of two edges?

https://blender.stackexchange.com/questions/2976/how-can-i-add-vertices-to-intersection-of-two-edges

のPythonスクリプトを実行すると、二辺の交差点に頂点を一つ追加できる。(Blender 2.79 , 2.8 両対応)

しかし頂点が一つ置かれるだけだと不便なので、各エッジをsubdivideする形で追加するように変更した。

コードは以下:

import bmesh
import bpy
from mathutils import geometry

# get cross point of 2 edges
def calc_cross_coordinate(edge2):


    if len(edge2) == 2:
        [[v1, v2], [v3, v4]] = [[v.co for v in e.verts] for e in edge2]

        iv = geometry.intersect_line_line(v1, v2, v3, v4)
        iv = (iv[0] + iv[1]) / 2
        return iv
    
# subdivide 2 edges and move the points to cross point
def subdivide_selects(edge2, moveto):
    obj = bpy.context.object
    me = obj.data
    bm = bmesh.from_edit_mesh(me)

    ret = bmesh.ops.subdivide_edges(bm,
        edges=edge2,
        use_grid_fill=True,
        cuts=1)
    bmesh.update_edit_mesh(me)

    for i in ret['geom_split']:
        if type(i) == bmesh.types.BMVert:
            i.co=moveto

def cross_subdivide():
    obj = bpy.context.object
    me = obj.data
    bm = bmesh.from_edit_mesh(me)

    edge2 = [e for e in bm.edges if e.select]
    if len(edge2) == 2:
        pos = calc_cross_coordinate(edge2)
        subdivide_selects(edge2,pos)
    
cross_subdivide()
    

実行例

解説

cross_subdivide

今回の処理を行う関数。

エッジが二本選択されているとき、二本のエッジをsubdivideし、新規頂点を交点に作成する。

calc_cross_coordinate

二本のエッジを引数にとり、geometry.intersect_line_lineで交差している座標を求める。

三次元の線分の場合、現実には誤差の関係で絶対に交差しないので、交点は二つ求まる。その中間点を交点(iv)としている。

subdivide_selects

bmesh.ops.subdivide_edgesでオブジェクトをsubdivideしている。

戻り値の['geom_split']に作成されたデータが入っているので、データ型がBMVertのものだけを取り出し、座標を交点で上書きする

1 件のコメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: