fazer com que os objetos fiquem de frente para os normais
Eu escrevi este pequeno complemento: https://gist.github.com/SuddenDevelopment/16df6602a2ecab06f56dc8a2c7e4c9e0
e no início achei que estava indo muito bem, mas descobri vários cenários em que as luzes da área estão voltadas para a direção errada.
Tento obter os normais para um rosto, giro a luz para combinar com esse rosto e, em seguida, viro-o em direção ao normal, mas funciona para cerca de metade dos rostos quando se trata de olhar para a direção correta. Se eu brincar com quais eixos estão na rotação por quartner, obtenho diferentes que estão corretos, também tentei.inverted()
Eu nem sei se estou indo na direção certa. ajuda apreciada.
Respostas
Abordagem centrada na matriz
Código para colocar um objeto lâmpada no centro de cada face selecionada de uma malha, com o eixo -Z local da luz apontando na direção da face normal.
Encontre a direção global de uma face normal pré-multiplicando com a matriz de rotação global do objeto. (Sem escala).
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)
Local com pais.
O código acima adiciona as luzes na cena na orientação global do rosto. Se a malha for movida, as luzes não irão junto com ela.
Outra opção seria usar apenas coordenadas locais e tornar cada luz um filho da malha.
Dimensionamento para se ajustar ao rosto.
Parece que você também está dimensionando a luz da área para caber no rosto. Fazer isso quando o eixo não está alinhado é um pouco mais profundo do que encontrar os mínimos / máximos dos eixos. IMO possivelmente justifica outra pergunta
Alguns exemplos que usam outro vetor para alinhar. A face tem alguns métodos calc tangentes, com base na aresta mais longa, arestas. Pode ajustar girando a luz sobre seu eixo z local (a face normal) para coincidir com a tangente. Dessa forma, tem um eixo conhecido alinhado com uma aresta e pode ser dimensionado para corresponder.
https://blender.stackexchange.com/a/94047/15543
Alinhe uma face normal ao eixo Z.
https://blender.stackexchange.com/a/121227/15543
da mesma forma, neste, os ângulos internos poligonais mapeiam os vértices dos cantos em 2d. Da mesma forma aqui, se a face normal estiver alinhada a um eixo, as coordenadas podem ser mapeadas para 2d.
https://blender.stackexchange.com/a/203355/15543
Se as coordenadas estiverem em 2d, existem alguns métodos auxiliares (principalmente para UV) que se ajustam a retângulos.
Usando mathutils.geometry.box_fit_2d