빈 부모 개체 할당
빈 개체를 만든 다음 현재 선택한 개체의 부모로 만드는 연산자를 작성했습니다. 그러나 부모 개체를 할당하면 원본에 있지 않는 한 자식 개체가 이동합니다. 그런 일이 일어나지 않게하려면 어떻게해야합니까? 다음은 문제를 보여주는 코드입니다.
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로 업데이트했습니다. 당신의 도움을 주셔서 감사합니다.
답변
세트 matrix_parent_inverse
자식 개체는 부모로부터 행렬을 상속합니까?를 참조하십시오 .
여기서 핵심은 로컬 공간의 원점이 기본 행렬 (변환 UI에 표시되는 것)과 부모 역행렬에서 계산된다는 것입니다.
원하는 결과를 얻는 방법에는 여러 가지가 있습니다.
- 빈 행렬 세계를 원본 세계로 설정
- 원본
matrix_basis
과matrix_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()
빈 부모를 각각에 추가하거나 활성 개체의 한 부모를 추가하고 선택한 다른 모든 부모도 자식이 될 수 있도록 선택한 개체로이를 확장하는 것이 좋습니다.
여기서 설명한 상대 변환 행렬이 필요합니다. Blender의 Python API를 사용하여 bpy.types.PoseBone.matrix를 수동으로 계산하려면 어떻게해야합니까?