Zuweisen eines leeren übergeordneten Objekts
Ich habe einen Operator geschrieben, um ein leeres Objekt zu erstellen und es dann zum übergeordneten Objekt des aktuell ausgewählten Objekts zu machen. Wenn ich jedoch das übergeordnete Objekt zuweise, wird das untergeordnete Objekt verschoben, es sei denn, es befindet sich am Ursprung. Wie kann ich das verhindern? Hier ist ein Code, der das Problem demonstriert:
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()
Ich möchte, dass sich das leere übergeordnete Objekt und das ausgewählte untergeordnete Objekt am selben Ort befinden, nicht unbedingt am Ursprung. Ich versuche, eine Gruppe von Objekten zu erstellen, die zusammen verschoben werden können, und ein Elternteil scheint der beste Weg zu sein. Ich habe Blender 2.83 verwendet, aber kürzlich auf 2.9 aktualisiert. Danke für Ihre Hilfe.
Antworten
einstellen matrix_parent_inverse
Siehe Erbt ein untergeordnetes Objekt die Matrix vom übergeordneten Objekt?
Der Schlüssel hier ist, dass der Ursprung des lokalen Raums aus der Basismatrix (was Sie in der Transformations-Benutzeroberfläche sehen) und ihrer übergeordneten inversen Matrix berechnet wird.
Es gibt verschiedene Möglichkeiten, um das gewünschte Ergebnis zu erzielen:
- Stellen Sie die Leermatrixwelt auf die des Originals ein
- und setzen Sie sowohl das
matrix_basis
als auch dasmatrix_parent_inverse
Original auf Identität. Entspricht dem einen Fall, dass "sich nicht bewegt hat"
Standardmäßig setzt Blender die Matrix-Eltern invers, sodass das Objekt beim Entfernen der Elternschaft seine vorherige Transformation beibehält. Mit der ersten Methode werden sie wieder auf den Ursprung zurückgesetzt.
- Setzen Sie die übergeordnete Matrixwelt auf untergeordnete Elemente.
- Behalten Sie den aktuellen Standort bei, indem Sie Childs
matrix_parent_inverse
auf die invertierte Basismatrix setzen .
Testskript, Methode 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()
Erwägen Sie, dies auf ausgewählte Objekte auszudehnen, sodass jedem ein leeres übergeordnetes Element hinzugefügt werden kann, oder ein übergeordnetes Element am aktiven Objekt und alle anderen ausgewählten Objekte werden ebenfalls untergeordnete Objekte.
Sie benötigen eine relative Transformationsmatrix, die ich hier erklärt habe: Wie kann ich bpy.types.PoseBone.matrix mithilfe der Python-API von Blender manuell berechnen?