faire en sorte que les objets soient correctement orientés vers les normales

Dec 16 2020

J'ai écrit ce petit addon: https://gist.github.com/SuddenDevelopment/16df6602a2ecab06f56dc8a2c7e4c9e0

et au début, je pensais que ça allait très bien, mais j'ai trouvé un tas de scénarios où les lumières de la zone sont orientées dans la mauvaise direction.

J'essaie d'obtenir les normales pour un visage, de déplacer la lumière pour qu'elle corresponde à ce visage, puis de lui faire face vers la normale, mais cela fonctionne pour environ la moitié des visages lorsqu'il s'agit de faire face à la bonne direction. Si je joue avec quels axes sont dans la rotation par quart j'en ai différents qui sont corrects, j'ai aussi essayé.inverted()

Je ne sais même pas si je vais dans la bonne direction. aide appréciée.

Réponses

2 batFINGER Dec 16 2020 at 21:52

Approche centrée sur la matrice

Code pour placer un objet lampe au centre de chaque face sélectionnée d'un maillage, avec l'axe -Z local clair pointant dans la direction de la face normale.

Trouvez la direction globale d'une normale face en prémultipliant avec la matrice de rotation globale des objets. (Pas d'échelle).

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 avec parentalité.

Le code ci-dessus ajoute les lumières de la scène à l'orientation globale du visage. Si le maillage est déplacé, les lumières ne l'accompagnent pas.

Une autre option serait de n'utiliser que des coordonnées locales et de faire de chaque lumière un enfant du maillage.

Mise à l'échelle pour s'adapter au visage.

Il semble que vous mettez également à l'échelle la lumière de la zone pour l'adapter au visage. Faire cela sans axe aligné est un peu plus en profondeur que de trouver des axes minima / maxima. L'OMI justifie très probablement une autre question

Quelques exemples qui utilisent un autre vecteur pour s'aligner. La face a des méthodes de tangente calcaire, basées sur le bord le plus long, les bords. Peut s'ajuster en faisant tourner la lumière autour de son axe z local (la face normale) pour correspondre à la tangente. De cette façon, un axe connu est aligné avec un bord et peut être mis à l'échelle pour correspondre.

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

Alignez une face perpendiculairement à l'axe Z.

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

de même dans celui-ci, les angles intérieurs poly mappent les coins verts à 2d. De même ici, si la normale de face est alignée sur un axe, les coordonnées peuvent être mappées sur 2d.

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

Si les coordonnées sont en 2D, il existe des méthodes d'aide (principalement pour UV) qui correspondent aux rectangles.

Utilisation de mathutils.geometry.box_fit_2d