Last active
August 3, 2022 13:20
-
-
Save SuddenDevelopment/13809d96ddff2780b9108629fdb4f3a4 to your computer and use it in GitHub Desktop.
Blender, Python, create 2d shape from 3d selected faces.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import bpy, bmesh, mathutils | |
# Blender script to get selected faces and create a new flat plan from the shapoe | |
def createDelaunay(points): | |
vs = [mathutils.Vector(co[:2]) for co in points] | |
# mathutils.geometry.delaunay_2d_cdt(vert_coords, edges, faces, output_type, epsilon, need_ids=True) | |
result = mathutils.geometry.delaunay_2d_cdt(vs, [], [], 0, 0.001) | |
vertices, edges, faces = result[:3] | |
return vertices, edges, faces | |
def fnTranslateVectors(arrVerts): | |
# Translate the vector into a flattened 2d coordinate | |
avg_normal = mathutils.Vector() | |
for v in arrVerts: | |
avg_normal += (v.normal / len(arrVerts)) | |
rot_quat = avg_normal.rotation_difference((0, 0, 1)) | |
return [(rot_quat @ v.co).to_2d() for v in arrVerts] | |
def createPolyPlane(vertices,edges,faces): | |
# make mesh | |
edges = [] | |
new_mesh = bpy.data.meshes.new('new_mesh') | |
new_mesh.from_pydata(vertices, edges, faces) | |
new_mesh.update() | |
# make object from mesh | |
new_object = bpy.data.objects.new('new_object', new_mesh) | |
createDelaunay(vertices) | |
# make collection | |
new_collection = bpy.data.collections.new('new_collection') | |
bpy.context.scene.collection.children.link(new_collection) | |
# add object to scene collection | |
new_collection.objects.link(new_object) | |
# grab currentley selected mesh in edit mode | |
objMesh = bmesh.from_edit_mesh(bpy.context.edit_object.data) | |
# get all of the selected verts | |
arrVerts = [] | |
for objVert in objMesh.verts: | |
if objVert.select == True: | |
arrVerts.append(objVert) | |
arrVerts = fnTranslateVectors(arrVerts) | |
# delaunay_2d_cdt only wants 2d coordinates, and we already have the translated, so just remove Z | |
vs = [vert.to_2d() for vert in arrVerts] | |
# pass in verts get back faces | |
verts_new, edges_new, faces_new = createDelaunay(vs) | |
# change verts back to 3d in a generic way | |
arrVerts = [vert.to_3d() for vert in verts_new] | |
createPolyPlane(arrVerts, edges_new, faces_new) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment