nesnelerin normallere doğru bakmasını sağlamak

Dec 16 2020

Bu küçük eklentiyi yazdım: https://gist.github.com/SuddenDevelopment/16df6602a2ecab06f56dc8a2c7e4c9e0

ve ilk başta bunun harika olduğunu düşündüm, ancak alan ışıklarının yanlış yöne baktığı bir dizi senaryo buldum.

Bir yüz için normalleri elde etmeye, ışığı o yüze uyacak şekilde döndürmeye ve sonra normale doğru bakmaya çalışıyorum, ancak doğru yöne geldiğinde yüzlerin kabaca yarısı için işe yarıyor. Çeyrekte hangi eksenin rotasyonda olduğunu oynarsam, doğru olan farklı eksenler elde ederim, ben de denedim.inverted()

Doğru yöne gidip gitmediğimi bile bilmiyorum. yardım için minnettarım.

Yanıtlar

2 batFINGER Dec 16 2020 at 21:52

Matris merkezli yaklaşım

Hafif yerel -Z ekseni yüzün normal yönünü gösterecek şekilde, bir ağın seçilen her yüzünün ortasına bir lamba nesnesi yerleştirmek için kod.

Nesnelerin global dönüş matrisiyle önceden çarparak normal bir yüzün global yönünü bulun. (Ölçek yok).

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)

Ebeveynlik ile yerel.

Yukarıdaki kod, yüzün küresel yönündeki sahnedeki ışıkları ekler. Ağ hareket ettirilirse, ışıklar onunla birlikte gitmez.

Diğer bir seçenek, yalnızca yerel koordinatları kullanmak ve her ışığı ağın alt öğesi yapmak olabilir.

Yüze uyacak şekilde ölçeklendirme.

Yüze sığması için alan ışığını da ölçeklendiriyorsunuz. Eksen hizalı olmadığında bunu yapmak, minimum / maksimum eksen bulmaktan biraz daha derinliktedir. IMO muhtemelen başka bir soruyu garanti ediyor

Hizalamak için başka bir vektör kullanan bazı örnekler. Yüz, en uzun kenar, kenarlara dayanan bazı teğet kireç yöntemlerine sahiptir. Tanjanta uyması için ışığı yerel z ekseni (normal yüz) etrafında döndürerek ayarlayabilir. Bu şekilde, bir kenara hizalanmış bilinen bir eksene sahip olun ve eşleşecek şekilde ölçeklenebilir.

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

Bir yüzü Z eksenine dik olarak hizalayın.

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

buna benzer şekilde, çoklu iç açıları köşe eğimlerini 2d'ye eşler. Benzer şekilde burada, normal yüz bir eksene hizalıysa, koordinatlar 2d'ye eşlenebilir.

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

Koordinatlar 2d'de ise, dikdörtgenlere uyan bazı yardımcı yöntemler (özellikle UV için) vardır.

Mathutils.geometry.box_fit_2d'yi kullanma