Lepas rotasi poligon persegi dengan Python: ketiga sumbu

Sep 15 2020

Saya memiliki poligon persegi yang diputar. Dan saya ingin 'melepasnya' sehingga sumbu normalnya akan cocok dengan sumbu dunia.

Saya dapat melepasnya pada sumbu Z dengan menggunakan wajah normal dan perbedaan rotasi (saya tidak peduli dengan terjemahan pada saat ini):

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

Tapi demi cinta tuhan saya tidak tahu bagaimana juga menambahkan rotasi wajah X dan Y ke dalam campuran.

Hasil yang diinginkan:

Jawaban

9 batFINGER Sep 15 2020 at 17:01

Gunakan tepinya.

Modul bmesh memiliki beberapa metode untuk menghitung vektor tangen wajah berdasarkan tepinya. Misalnya sake akan menggunakan vektor tangen yang dibuat dari dua sisi terpanjang yang tidak terhubung.

Dengan menggunakan muka normal, garis singgung muka dan hasil kali silang keduanya dapat membuat matriks rotasi dari ketiga vektor ortogonal.

Sumbu adalah kolom dari sebuah matriks, sehingga matriks rotasi dengan sumbu vektor satuan x, y, and zbisa jadi

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

jika Anda mengingat kembali dari aljabar linier, transposisi matriks ortogonal juga merupakan kebalikannya.

Uji skrip, sejajarkan wajah nol berdasarkan matriks yang dibuat seperti di atas.

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)