From e9e721fd11b7e56e694b15699f9c77c2c0a500b0 Mon Sep 17 00:00:00 2001 From: poikilos <7557867+poikilos@users.noreply.github.com> Date: Wed, 11 Jan 2023 02:14:37 -0500 Subject: [PATCH] Add a utility to select vertices whose normals are front-facing. --- utilities/blender/select_front_facing.py | 38 ++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 utilities/blender/select_front_facing.py diff --git a/utilities/blender/select_front_facing.py b/utilities/blender/select_front_facing.py new file mode 100644 index 0000000..bb40190 --- /dev/null +++ b/utilities/blender/select_front_facing.py @@ -0,0 +1,38 @@ +import bpy +from mathutils import Vector +from math import degrees +# bpy.ops.wm.tool_set_by_id(name="builtin.scale") +#clear scene, make mesh +#bpy.ops.object.mode_set(mode = 'OBJECT') +#bpy.ops.object.select_all(action='SELECT') +#bpy.ops.object.delete(use_global=False) +#bpy.ops.mesh.primitive_cube_add(size=2, enter_editmode=False, align='WORLD', location=(0, 0, 0), rotation=(1.5708, 1.5708, 0)) +#obj = bpy.data.objects["Cube"] +obj = bpy.context.object + +#select vertex +obj = bpy.context.active_object +bpy.ops.object.mode_set(mode = 'EDIT') +bpy.ops.mesh.select_mode(type="VERT") +#bpy.ops.mesh.select_mode(type="EDGE") +# bpy.ops.mesh.select_mode(type="FACE") +bpy.ops.mesh.select_all(action = 'DESELECT') +bpy.ops.object.mode_set(mode = 'OBJECT') +# for i in range(len(bpy.context.object.data.vertices)): +front_normal = Vector((0, 0, 1)) +# ^ I'm not sure why this works, but it is probably +# from using diff_quat oddly below. +for i in range(len(obj.data.vertices)): + obj.data.vertices[i].select = False + v = obj.data.vertices[i] # MeshVertex + vn = v.normal + # v.select_set(False) # deprecated + diff_quat = front_normal.rotation_difference(vn) + # ^ returns a quaternion (magnitude 1) + axis, rad = diff_quat.to_axis_angle() + deg = degrees(rad) + if deg > 90.0: + continue + obj.data.vertices[i].select = True + +bpy.ops.object.mode_set(mode = 'EDIT')