빈 부모 개체 할당

Nov 19 2020

빈 개체를 만든 다음 현재 선택한 개체의 부모로 만드는 연산자를 작성했습니다. 그러나 부모 개체를 할당하면 원본에 있지 않는 한 자식 개체가 이동합니다. 그런 일이 일어나지 않게하려면 어떻게해야합니까? 다음은 문제를 보여주는 코드입니다.


class ObjectTest(bpy.types.Operator):
    """Tooltip"""
    bl_idname = "myops.object_test"
    bl_label = "Array of current object"
    
    def execute(self,context):

        origobj = bpy.context.active_object
        bpy.context.scene.cursor.location = origobj.location

        bpy.ops.object.empty_add()
        objparent=bpy.context.active_object
        objparent.name=origobj.name+"Array"
        origobj.parent=objparent
        return {'FINISHED'}
    
def register():
    bpy.utils.register_class(ObjectTest)


def unregister():
    bpy.utils.unregister_class(ObjectTest)


if __name__ == "__main__":
    register()

빈 부모 개체와 선택한 자식 개체가 반드시 원본이 아닌 동일한 위치에 있기를 바랍니다. 함께 움직일 수있는 물건의 그룹을 만들려고하는데 부모가 가장 좋은 방법 인 것 같습니다. Blender 2.83을 사용하고 있었지만 최근에 2.9로 업데이트했습니다. 당신의 도움을 주셔서 감사합니다.

답변

2 batFINGER Nov 20 2020 at 09:03

세트 matrix_parent_inverse

자식 개체는 부모로부터 행렬을 상속합니까?를 참조하십시오 .

여기서 핵심은 로컬 공간의 원점이 기본 행렬 (변환 UI에 표시되는 것)과 부모 역행렬에서 계산된다는 것입니다.

원하는 결과를 얻는 방법에는 여러 가지가 있습니다.

  • 빈 행렬 세계를 원본 세계로 설정
  • 원본 matrix_basismatrix_parent_inverse원본을 모두 정체성으로 설정합니다 . "움직이지 않은"사건에 해당

기본적으로 블렌더는 매트릭스 부모를 역으로 설정하므로 부모 지정이 제거되면 객체는 이전 변형을 유지합니다. 첫 번째 방법을 사용하면 원점으로 다시 스냅됩니다.

  • 부모 매트릭스 세계를 자식으로 설정합니다.
  • 자식 matrix_parent_inverse을 반전 된 기저 행렬 로 설정하여 현재 위치를 유지합니다 .

테스트 스크립트, 방법 2.

import bpy

class ObjectTest(bpy.types.Operator):
    """Tooltip"""
    bl_idname = "object.test"
    bl_label = "Array of current object"
    
    def execute(self, context):

        ob = context.active_object

        bpy.ops.object.empty_add()
        mt = context.active_object
        mt.name = f"{ob.name}Array"
        mt.matrix_world = ob.matrix_world
        ob.parent = mt
        ob.matrix_parent_inverse = ob.matrix_basis.inverted()
        return {'FINISHED'}
    
def register():
    bpy.utils.register_class(ObjectTest)


def unregister():
    bpy.utils.unregister_class(ObjectTest)


if __name__ == "__main__":
    register()

빈 부모를 각각에 추가하거나 활성 개체의 한 부모를 추가하고 선택한 다른 모든 부모도 자식이 될 수 있도록 선택한 개체로이를 확장하는 것이 좋습니다.

MohammadHosseinJamshidi Nov 20 2020 at 13:54

여기서 설명한 상대 변환 행렬이 필요합니다. Blender의 Python API를 사용하여 bpy.types.PoseBone.matrix를 수동으로 계산하려면 어떻게해야합니까?