물체가 법선을 제대로 향하도록하기

Dec 16 2020

이 작은 애드온을 작성했습니다. https://gist.github.com/SuddenDevelopment/16df6602a2ecab06f56dc8a2c7e4c9e0

처음에는 훌륭하다고 생각했지만 영역 조명이 잘못된 방향을 향하는 시나리오를 많이 발견했습니다.

나는 얼굴에 대한 법선을 얻고, 빛을 그 얼굴과 일치하도록 회전시킨 다음 법선을 향하게하려고 노력하지만, 적절한 방향을 향하게되면 얼굴의 대략 절반에서 작동합니다. 쿼트 너 리온으로 회전하는 축을 가지고 놀면 올바른 다른 축을 얻습니다..inverted()

내가 올바른 방향으로 가고 있는지조차 모르겠다. 도움을 주셔서 감사합니다.

답변

2 batFINGER Dec 16 2020 at 21:52

매트릭스 중심 접근

메시의 선택된 각면의 중심에 램프 오브젝트를 배치하는 코드로,면 법선 방향을 가리키는 라이트 로컬 -Z 축을 사용합니다.

객체 전역 회전 행렬을 미리 곱하여면 법선의 전역 방향을 찾습니다. (스케일 없음).

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)

육아가있는 지역.

위 코드는 얼굴의 전역 방향으로 장면에 조명을 추가합니다. 메시가 이동되면 조명이 함께 이동하지 않습니다.

또 다른 옵션은 로컬 좌표 만 사용하고 각 라이트를 메시의 자식으로 만드는 것입니다.

얼굴에 맞게 크기 조정.

얼굴에 맞게 영역 조명의 크기를 조정하는 것 같습니다. 축이 정렬되지 않았을 때이를 수행하는 것은 최소 / 최대 축을 찾는 것보다 조금 더 깊이 있습니다. IMO는 아마도 다른 질문을 보증합니다.

다른 벡터를 사용하여 정렬하는 몇 가지 예입니다. 면에는 가장 긴 가장자리, 가장자리를 기반으로하는 계산 접선 방법이 있습니다. 접선과 일치하도록 로컬 z 축 (면 법선)을 중심으로 조명을 회전하여 조정할 수 있습니다. 이렇게하면 하나의 알려진 축이 가장자리와 정렬되고 일치하도록 크기를 조정할 수 있습니다.

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

Z 축에 수직 인면을 정렬합니다.

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

이와 유사하게이 폴리 내부 각도는 모서리를 2d로 매핑합니다. 마찬가지로면 법선이 축에 정렬되면 좌표를 2d에 매핑 할 수 있습니다.

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

좌표가 2d 인 경우 직사각형에 맞는 몇 가지 도우미 메서드 (주로 UV 용)가 있습니다.

mathutils.geometry.box_fit_2d 사용