Browse Source

Add a utility to select vertices whose normals are front-facing.

master
poikilos 2 years ago
parent
commit
e9e721fd11
  1. 38
      utilities/blender/select_front_facing.py

38
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')
Loading…
Cancel
Save