エッジの長さを揃える

たまに線分の長さを揃えたい時がある。以下のスクリプトを実行する。

import bpy
import bmesh

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

    edges = []
    edges_length = []

    for edge in bm.edges:
        if edge.select == True:
            edges.append(edge)
            edges_length.append(edge.calc_length())
            
    average_length = sum(edges_length) / len(edges)

    for edge, edge_length in zip(edges, edges_length):
        mag = average_length / edge_length
        vert0 = edge.verts[0].co
        vert1 = edge.verts[1].co
        Lx = vert0.x - vert1.x
        Ly = vert0.y - vert1.y
        Lz = vert0.z - vert1.z
        vert0.x += Lx / 2 * (mag - 1)
        vert1.x -= Lx / 2 * (mag - 1)
        vert0.y += Ly / 2 * (mag - 1)
        vert1.y -= Ly / 2 * (mag - 1)
        vert0.z += Lz / 2 * (mag - 1)
        vert1.z -= Lz / 2 * (mag - 1)
            
    bpy.ops.object.mode_set(mode = 'OBJECT')
    bpy.ops.object.mode_set(mode = 'EDIT')

equalize_edges_length()

もしかしたら、Blender の標準機能で実現できるのかもしれない。

コメントする

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