mendapatkan objek untuk dihadapkan dengan benar ke arah orang normal

Dec 16 2020

Saya menulis addon kecil ini: https://gist.github.com/SuddenDevelopment/16df6602a2ecab06f56dc8a2c7e4c9e0

dan pada awalnya saya pikir itu baik-baik saja, tetapi saya menemukan banyak skenario di mana lampu area menghadap ke arah yang salah.

Saya mencoba untuk mendapatkan warna normal untuk sebuah wajah, gerakkan memutar cahaya agar sesuai dengan wajah itu dan kemudian menghadapinya ke arah normal, tetapi ini berfungsi untuk kira-kira setengah dari wajah ketika menghadap ke arah yang benar. Jika saya bermain dengan sumbu mana yang dalam rotasi dengan quartnerion, saya mendapatkan sumbu berbeda yang benar, saya juga mencoba.inverted()

Saya bahkan tidak tahu apakah saya menuju ke arah yang benar. bantuan dihargai.

Jawaban

2 batFINGER Dec 16 2020 at 21:52

Pendekatan matriks sentris

Kode untuk menempatkan objek lampu di tengah setiap permukaan mesh yang dipilih, dengan sumbu-Z lokal cahaya menunjuk ke arah permukaan normal.

Temukan arah global dari wajah normal dengan premultiplying dengan matriks rotasi global objek. (Tanpa skala).

import bpy
import bmesh
context = bpy.context

ob = context.edit_object
mw = ob.matrix_world
me = ob.data
bm = bmesh.from_edit_mesh(me)

faces = [f for f in bm.faces if f.select]

while faces:
    f = faces.pop()
    light = bpy.data.lights.new(
            f"Face{f.index}",
            type='AREA',
            )
    light.size = 1
    light_ob = bpy.data.objects.new(
            f"Face{f.index}",
            light,
            )
    M = mw.normalized() @ f.normal.to_track_quat('-Z', 'Y').to_matrix().to_4x4()
    M.translation = mw @ f.calc_center_median()
    light_ob.matrix_world = M
    context.collection.objects.link(light_ob)

Lokal dengan parenting.

Kode di atas menambahkan cahaya dalam pemandangan pada orientasi global wajah. Jika jala digerakkan, lampu tidak akan menyertainya.

Pilihan lain adalah dengan hanya menggunakan koordinat lokal dan membuat setiap cahaya menjadi anak jaring.

Penskalaan agar pas dengan wajah.

Tampaknya Anda juga menskalakan cahaya area agar pas dengan wajah. Untuk melakukan ini ketika sumbu tidak sejajar sedikit lebih dalam daripada mencari sumbu minimal / maksimal. IMO sangat mungkin membutuhkan pertanyaan lain

Beberapa contoh yang menggunakan vektor lain untuk meratakan. Muka memiliki beberapa metode garis singgung kalk, berdasarkan tepi terpanjang, tepi. Dapat menyesuaikan dengan memutar cahaya sekitar sumbu z lokalnya (wajah normal) agar sesuai dengan garis singgung. Dengan cara ini memiliki satu sumbu yang diketahui sejajar dengan tepi dan dapat diskalakan untuk dicocokkan.

https://blender.stackexchange.com/a/94047/15543

Sejajarkan wajah normal dengan sumbu Z.

https://blender.stackexchange.com/a/121227/15543

Sama halnya dengan yang satu ini, sudut interior poli memetakan vert sudut ke 2d. Demikian pula di sini jika permukaan normal disejajarkan dengan sumbu, koordinat dapat dipetakan ke 2d.

https://blender.stackexchange.com/a/203355/15543

Jika koordinat dalam 2d ada beberapa metode pembantu (terutama untuk UV) yang sesuai dengan persegi panjang.

Menggunakan mathutils.geometry.box_fit_2d