エッジを二本選択し、その交点を求めたい。
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()
今回の処理を行う関数。
エッジが二本選択されているとき、二本のエッジをsubdivideし、新規頂点を交点に作成する。
二本のエッジを引数にとり、geometry.intersect_line_lineで交差している座標を求める。
三次元の線分の場合、現実には誤差の関係で絶対に交差しないので、交点は二つ求まる。その中間点を交点(iv)としている。
bmesh.ops.subdivide_edgesでオブジェクトをsubdivideしている。
戻り値の['geom_split']に作成されたデータが入っているので、データ型がBMVertのものだけを取り出し、座標を交点で上書きする