2013-09-30 2 views
1

블렌더 파일의 모든 개체를 구문 분석하고 이름으로 필터링 한 다음 특정 조건을 충족하는지 확인하기 위해 사용자 지정 내보내기 스크립트를 작성하고 있습니다.블렌더 파이썬 API 2.6을 사용하여 씬 개체를 선택적으로 내보내기

저는 블렌더 2.68a를 사용하고 있습니다. 필자는 일부 기본 2D 및 3D 메쉬뿐만 아니라 내 테스트 기준에 맞지 않는 블렌더 파일을 만들었습니다. 블렌더 내부의 내부 파이썬 콘솔에서 작업 중입니다. 이것은 파이썬 환경이 커스터마이징되어 블렌더 파이썬 API로 작업하는 유일한 방법입니다.

mesh = obj.to_mesh(C.scene, True, 'RENDER') #where obj is an bpy.data.object[index] in the scene 
mesh.update(True, True) 
mesh.polygons[index].<long list of possible functions> 
:

나는 다음 루프와 D.objects 반복자의를 사용하여 객체를 반복 이름은 정규식을 사용하여 일치를 확인하고 사용하여 객체에서 메쉬를 얻는 방법을 분류 한

을 사용하면 다각형 배열에 액세스하여 다각형을 형성하는 모서리가있는 꼭지점 집합과 해당 키 값을 확인할 수 있습니다.

필자가 정할 수없는 것은 폴리곤이 얼굴인지 폴리인지 여부를 파이썬 콘솔에서 결정하는 방법입니다. 내장 함수가 있습니까, 아니면 프로그래밍 방식으로이를 결정하기 위해 어떤 테스트를 수행 할 수 있습니까? 예를 들어, 얼굴이없는 4 개의 가장자리를 가진 메쉬 4 개의 꼭지점을 가질 수 있습니다. 그러나 이것을 내보내고 싶지는 않지만, 동일한 4 개의 꼭지점/가장자리를 편집하여 그 위에면을 놓으면 바람직한 수출이된다.

누구나 bpy.data.object 데이터 구조를 설명하거나 "얼굴"이 저장된 위치를 설명 할 수 있습니까? 마치 npolys 자체의 속성 인 것처럼 보이지만 API가이를 명백하게하지는 않습니다. 이 점을 분명히하는 데 도움이된다면 크게 감사하겠습니다. 건배.

+0

메쉬 모델은 정점, 가장자리 및면으로 구성됩니다. 얼굴은 폴리곤의 또 다른 이름입니다. – sambler

답변

2

그래서 blender.org 포럼에서이 질문을했습니다. http://www.blender.org/forum/viewtopic.php?t=28286&postdays=0&postorder=asc&start=0 그리고 매우 유용한 사람이 지난 며칠 동안 저를 도우려고 노력할 때마다 도움이되었습니다.

짧은 답변 목록은 다음과 같습니다.

1) 모든 다각형은 얼굴입니다. 다각형으로 저장되어 있지 않으면 얼굴이 아닙니다.
) 객체에서 to_mesh() 함수를 사용하면 함수의 복사본이 반환되므로 사본에 대한 선택 사항은 컨텍스트에 반영되지 않으므로 사용하고있는 방법론에 결함이있는 것입니다. 라이브 개체에 액세스 할 수있는 유일한 방법은의를 사용하는 것입니다 :

bpy.data.objects[<index or object name>].data.vertices[<index>].co[<0,1,2> which correspond to x,y,z respectively] 
bpy.data.objects[<index or object name>].data.polygons[<index>].edge_keys 

첫 번째는 당신이 객체의 모든 정점의 순서 인덱스에 액세스 할 수 있습니다 (가정이 형 '메쉬'이다), 그 좌표.
두 번째 것은 에지를 나타내는 순서쌍 쌍의 2 차원 배열에 대한 액세스를 제공합니다. 튜플 내에 포함 된 숫자는 첫 번째 명령의 정점 목록에있는 색인 값에 해당하므로 가장자리 사이의 좌표를 가져올 수 있습니다. 새 BMesh 객체를 만들고 관심있는 객체를 BMesh에 복사 할 수도 있습니다. 이렇게하면 라이브 개체에서 액세스 할 수없는 많은 기능이 제공됩니다. 대답 3의 코드는이 예를 보여줍니다.

3) 메쉬에서 얼굴을 확인하는 것과 관련된 내 질문에 대한 답변은 아래를 참조하십시오.

개체가 얼굴을 갖고 모든 가장자리가 얼굴의 일부인지 확인하는 방법은 위의 스레드에서 유용한 사용자 CoDEmanX가 작성한 다음 코드 스 니펫을 사용하는 것입니다.내가 모든 오브젝트를 통해 루프를 원하는 didnt가로

import bpy, bmesh 

for ob in bpy.context.scene.objects: 
    if ob.type != 'MESH': 
     continue 
    bm = bmesh.new() 
    bm.from_object(ob, bpy.context.scene) 

    if len(bm.faces) > 0 and 0 not in (len(e.link_faces) for e in bm.edges): 
     print(ob.name, "is valid") 
    else: 
     print(ob.name, "has errors") 

나는이에게 조금 변경, 대신 내가 전달 된 객체가 다른 유효하고 false 인 경우에 true를 반환하는 함수로이 있어요. 이렇게하면 내 addon이 정규식과 일치하는 이름을 가진 객체의 유효성을 검사하려고 전화를 직렬화 할 수 있습니다.

def validate(obj): 
    import bpy, bmesh 

    if obj.type == 'MESH':     
     bm = bmesh.new() 
     bm.from_object(obj, bpy.context.scene) 

     if len(bm.faces) > 0 and 0 not in (len(e.link_faces) for e in bm.edges): 
      return True 
    return False 
관련 문제