Drehen Sie mit Python ein quadratisches Polygon auf: alle 3 Achsen

Sep 15 2020

Ich habe ein gedrehtes quadratisches Polygon. Und ich möchte es "aufdrehen", damit seine normalen Achsen mit den Weltachsen übereinstimmen.

Ich kann es auf der Z-Achse drehen, indem ich die Gesichtsnormalen und die Rotationsdifferenz verwende (die Übersetzung ist mir an dieser Stelle egal):

quaternion = Vector((0,0,1)).rotation_difference(face_normal)
rotation = ( +quaternion ).to_matrix().inverted()
obj.matrix_world = rotation.to_4x4()

Aber aus Liebe zu Gott kann ich nicht herausfinden, wie ich der Mischung auch die Rotation von Gesicht X und Y hinzufügen kann.

Erwünschtes Ergebnis:

Antworten

9 batFINGER Sep 15 2020 at 17:01

Verwenden Sie die Kanten.

Das bmesh-Modul verfügt über einige Methoden für Gesichter, um den Tangentenvektor des Gesichts basierend auf seinen Kanten zu berechnen. Sake verwendet beispielsweise den Tangentenvektor, der aus zwei längsten nicht verbundenen Kanten erstellt wird.

Unter Verwendung der Gesichtsnormalen können die Gesichtstangente und das Kreuzprodukt der beiden eine Rotationsmatrix aus den drei orthogonalen Vektoren erzeugen.

Die Achsen sind die Spalten einer Matrix, also könnte eine Rotationsmatrix mit Einheitsvektorachsen x, y, and zsein

Matrix((x, y, z)).transposed()

Wenn Sie sich an die lineare Algebra erinnern, ist die Transponierte einer orthogonalen Matrix auch umgekehrt.

Test-Skript, richtet Gesicht Null basierend auf der wie oben erstellten Matrix aus.

import bpy
import bmesh
from mathutils import Matrix, Quaternion

ob = bpy.context.object
me = ob.data
bm = bmesh.from_edit_mesh(me)
face = bm.faces[0]

 
n = face.normal
t = face.calc_tangent_edge_pair().normalized()
c = face.calc_center_median()

M = (
    Matrix.Translation(c) @ 
    Matrix((t.cross(n).normalized(), t, n)).to_4x4() @
    Matrix.Translation(-c)
    )

bmesh.ops.transform(
    bm,
    matrix=M,
    verts=bm.verts,
    )
bmesh.update_edit_mesh(me)