Zuweisen eines leeren übergeordneten Objekts

Nov 19 2020

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

2 batFINGER Nov 20 2020 at 09:03

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_basisals auch das matrix_parent_inverseOriginal 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_inverseauf 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.

MohammadHosseinJamshidi Nov 20 2020 at 13:54

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?