Roteren rond een as (een 'edge' ) waaraan het een of ander nog vast zit.
Een rotatie in een vlak rond een willekeurig punt R moet men (denk ik) zo oplossen:
Schuif het punt R (met wat er en ook wat erbij moet) naar de oorsprong en roteer aldaar het te roteren rest, daarna schuif je alles weer terug.
Althans zo doet men het in het 'complexe vlak' (met behulp van complexe getallen)
Maar nu in 3D, Blender! 3D rotaties daarvoor heeft Blender Quaternionen ...
maar rond een as iets wat er aanhangt roteren om een bepaalde hoek is niet zo gemakkelijk, zonder EEN keer de juiste toelichting ...
Na veel proberen ben ik er uit je kunt dit proberen,
't is voor een gewone Plane ..
import bpy
import bmesh
from math import pi, radians, atan, degrees
from mathutils import Vector, Matrix, Quaternion, Euler
#Make a standard Plane available!!!
plane = bpy.data.objects['Plane']
bpy.ops.object.mode_set(mode = 'OBJECT')
old_location = plane.location.copy()
print("\n*** new *** old_location", old_location)
#PKHG>INFO move origin object to origin
bpy.ops.transform.translate(value = - old_location, constraint_axis=(False, False, False), constraint_orientation='GLOBAL', mirror=False, proportional='DISABLED', proportional_edit_falloff='SMOOTH', proportional_size=1)
bpy.ops.object.mode_set(mode = 'EDIT')
bm = bmesh.from_edit_mesh(plane.data)
inds = [el.index for el in bm.verts]
print(inds)
v0_old = plane.matrix_world * bm.verts[0].co.copy()
print("global cords vo", v0_old)
#PKHG_INFO global coords v0
v1_old = plane.matrix_world * bm.verts[1].co.copy()
print("global cords vo", v1_old)
#PKHG>INFO move if necessary v0 to origin such that the axis gos through origin and v1
if v0_old != Vector((0,0,0)):
print("moving")
for i, ele in enumerate(bm.verts):
bm.verts[i].co += - v0_old
#PKHG>INFO rotate now
axis = v0_old-v1_old
a_quat = Quaternion(axis, radians(45)).normalized()
print("(%.2f, %.2f, %.2f), %.2f" % (a_quat.axis[:] + (degrees(a_quat.angle),)))
#dit maakt de rotatiematrix die gebruikt word, rotatie 45 graad, mag je wijzigen!
a_mat = Quaternion(axis, radians(45)).normalized().to_matrix()
print("\n 1 28 swp new axis=", axis)
for i, ele in enumerate(bm.verts):
bm.verts[i].co = a_mat * bm.verts[i].co
#PKHG>INFO move back if needed
if v0_old != Vector((0,0,0)):
print("Moving back")
for i, ele in enumerate(bm.verts):
bm.verts[i].co += +v0_old
bpy.ops.object.mode_set(mode = 'OBJECT')
#PKHG>INFO move origin object back
print("old location = " , old_location)
bpy.ops.transform.translate(value = old_location, constraint_axis=(False, False, False), constraint_orientation='GLOBAL', mirror=False, proportional='DISABLED', proportional_edit_falloff='SMOOTH', proportional_size=1)
EDIT:
Als men goed kijkt gebruik ik de knooppunten 0 en 1 (buren!) men kan dit ook in 2 en 3 of 1 en 2 of 3 en 0 wijzigen om rond andere 'edges' te roteren ...