Topic: Blender en Python  (gelezen 37848 keer)


Offline PKHG

  • Member
  • *
  • Berichten: 718
    • Bekijk profiel
« Reactie #60 Gepost op: 15 augustus 2014, 19:30:01 pm »
Fijn Wil, dat je het hebt geprobeerd!

Peter
Doei
       Peter

Offline IJp

  • *
  • Berichten: 4,387
    • Bekijk profiel
    • IJpart
« Reactie #61 Gepost op: 15 augustus 2014, 19:50:07 pm »
Peter als het niet te moeilijk is probeer ik alles ;)

Offline PKHG

  • Member
  • *
  • Berichten: 718
    • Bekijk profiel
« Reactie #62 Gepost op: 28 september 2014, 12:41:16 pm »
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 ...
« Laatst bewerkt op: 28 september 2014, 17:39:15 pm door PKHG »
Doei
       Peter