장면 내의 모든 조명을 * 효율적으로 * 찾는 방법은 무엇입니까?

Nov 26 2020

현재 장면에있는 모든 조명으로 사용자 정의 UI 목록을 채우고 싶지만이를 수행하는 가장 좋은 방법이 확실하지 않습니다. 우리는 반복 bpy.context.scene.objects하고 검증 object.type == 'LIGHT'하여 사물을 걸러 내고 objects[i].data실제 빛을 얻는 데 사용할 수 있지만, 특히 많은 수의 사물이있는 장면의 경우 저를 투박하고 성능이 떨어집니다.

이상적으로 bpy.data.lights는 각 조명이 사용되는 장면을 기반으로 훨씬 더 작은 데이터 세트 를 자세히 살펴보고 필터링하고 싶습니다 . 그러나에서 빛이 주어지면 bpy.data.lights그것을 사용하는 객체를 어떻게 찾을 수 있고 거기 에서이 객체의 user_scene속성을 확인할 수 있습니까? 이것은 수천 개의 객체의 data속성에 대해 하향식 방식으로 반복하는 것보다 훨씬 빠르다는 생각이 들지만, 조명에서 그것을 사용하는 객체로 상향식으로 이동하는 메커니즘이 있다면 나는 할 수 없습니다 API에서 찾으십시오. StackExchange의 아이디어, 똑똑한 사람들이 있습니까?

감사합니다. 이것이 DOH라면 사과드립니다! 일종의 질문입니다. 저는 이것에 익숙하지 않고 여전히 어둠 속에서 내 길을 느끼고 있습니다.

답변

2 batFINGER Nov 27 2020 at 11:28

컬렉션에 넣어

IMO는이를 수행하는 가장 간단한 방법입니다.

scene_lights = [ob for ob in scene.objects if ob.type == 'LIGHT']

하나의 라이트 오브젝트는 장면의 일부 또는 모든 라이트와 동일한 라이트 데이터를 가질 수 있습니다. 조명이 거의없는 경우에도 데이터가 장면의 오브젝트에 속하는지 확인하면 위보다 효율성이 떨어질 수 있습니다.

장면에 개체가 너무 많아서 반복하는 것이 비효율적이라고 생각되면 이름 또는 ID 속성을 사용하여 컬렉션에 연결하여 컬렉션에 라이트 개체 용으로 태그를 지정하는 것이 좋습니다.

lightcol = bpy.data.collections.get("Lights")

if not lightcol:
    lightcol =  bpy.data.collections.new("Lights")
    scene.collection.children.link(lightcol) # or wherever
# populate it.
for lt in scene_lights:
    lightcol.objects.link(lt)

조명 유형별로 더 분류하기 위해이 컬렉션 내에서 컬렉션을 만들 수 있습니다.

폴링 된 포인터 속성

@brockmann이 언급했듯이 재료의 예인 폴링 포인터 속성 사용을 고려할 수도 있습니다.

UILayout.prop_search에 대한 사용자 지정 검색 데이터

반면 조명의 경우 포인터 속성 유형은 bpy.types.Object이고 poll 메소드는 유형에 대해 테스트합니다. 가벼운 타입으로 쉽게 확장 가능

MohammadHosseinJamshidi Nov 27 2020 at 04:20

아래 스크립트를 사용하십시오.

import bpy

light_set = set(bpy.data.lights.keys())
obj_set = set(bpy.data.objects.keys())

# light data doesn't update by deleting:
light_set.intersection_update(obj_set)

light_objects = [bpy.data.objects[name] for name in light_set]