Ankündigung

Einklappen
Keine Ankündigung bisher.

Objekte einer Curve folgen lassen

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Gelöst Objekte einer Curve folgen lassen

    Hallo,

    ich würde gerne mehrere Objekte einer Curve folgen lassen. Diese Objekte sind quasi ein Array, obwohl sie nicht mit einem Array-Modifier gemacht wurden, im Moment sind sie einzelne Objekte.
    Klicke auf die Grafik für eine vergrößerte Ansicht  Name: frage2.png Ansichten: 1 Größe: 14,0 KB ID: 19502
























    Die Segmente sollen alle quasi mit Offset der Curve folge und dabei ineinander greifen, wie bei einem Rolladen oder einer Panzerkette. Sie sollen in der gezeigten Position starten, und am Ende quasi im geraden Teil der curve angekommen sein. Schön wäre es auch, das ganze generisch steuern zu können, z. Bsp. mit einem Driver. Wichtig ist aber erstmal, dass es funktioniert. Bei meinen bisherigen Versuch gab es Probleme, z. Bsp. mit der Methode des parenten->follow path haben zwar alle Segmente der Curve gefolgt, aber mit ihrer Position relativ zum Anfang der Curve als Offset (z. Bsp, da dass erste Segment [links] gegenüber dem Anfang der curve [rechts] verschoben und rotiert war, war sie am Ende eben mit diesem Positions- und Rotationsoffset am Ende deutlich neben der Curve ), nicht mit dem Teil der Curve, an dem sie sich gerade quasi befinden. Die Bewegung sah also z. Bsp beim ersten Segment so aus:
    Klicke auf die Grafik für eine vergrößerte Ansicht  Name: frage2_bild2.png Ansichten: 1 Größe: 20,6 KB ID: 19503





























    Habt ihr irgendwelche Ideen, um das korrekt zu machen?

  • #2
    Wenn ich dich richtig verstanden habe sollte das recht gut mit einem Array Modifier und einem Curve Modifier klappen!
    Hab da mal ein Beispiel:
    Erst den Array Modifier damit man mehrere Objekte aneinander hat und dann einen Curve Modifier damit das ganze auch der Curve folgt.

    EDIT: Hab gerade gesehen, dass die Elemente noch nicht richtig ineinander greifen. Da müsstest du halt erst nochmal den Array Modifier richtig einstellen (Relative Offest oder Constant Offset auf der X Achse) und dein Objekt hat eine minimale Rotation weshalb das alles nicht ganz 100% passt.
    Angehängte Dateien
    Zuletzt geändert von SmartySmart702; 05.10.2018, 15:07.

    Kommentar


    • SmartySmart702
      SmartySmart702 kommentierte
      Kommentar bearbeiten
      Das erste und das letzte Objekt eines Array Modifiers kannst du auch einstellen! Bei Start Cap und End Cap muss nur das jeweilige Objekt ausgewählt werden.

  • #3
    Aber ich will doch, dass die Segmente die Curve entlangfahren, bei deiner Datei passiert beim abspielen das hier:
    Klicke auf die Grafik für eine vergrößerte Ansicht

Name: frage2_bild3.png
Ansichten: 1
Größe: 344,1 KB
ID: 19543























    Ich will, dass die Segmente nicht die ganze Curve bedecken, sondern an ihr entlangfahren, sodass man sie auf der Curve hin- und herschieben kann.

    Kommentar


    • SmartySmart702
      SmartySmart702 kommentierte
      Kommentar bearbeiten
      Achso! Dann musst du das Objekt auf der X Achse verschieben/animieren.

  • #4
    Das Problem mit den meisten Lösungen ist, daß die Objekte sich in Kurven übereinander schieben. Die einzelnen, starren Segmente folgen nicht der Kurve, nur die Gelenke sollen das tun. Dadurch entsteht ein Unterschied zwischen Kurvenlänge und Segmentreichweite.

    Klicke auf die Grafik für eine vergrößerte Ansicht  Name: rolltor1.png Ansichten: 1 Größe: 26,3 KB ID: 19596

    Deshalb habe ich heute ein Script hingehauen, das das behebt.

    Zur Funktionsweise:

    Das Script sucht alle Empties, die mit 'em' anfangen und geht davon aus, daß sie von 00 bis xx durchnumeriert sind.
    Dann nimmt es em00 und em01. Es setzt em01 auf offset 1.0, zieht den Offset von em00 davon ab und halbiert ihn (step).

    Dann schaut es, ob em01 näher als die Zieldistanz von em00 entfernt ist oder nicht. Weiter weg? Step von offset abziehen, ansonsten addieren. Step halbieren.
    So pirscht sich das Script immer näher an die Zielweite und verdoppelt jedes Mal seine Genauigkeit.

    Wenn die 20 Iterationen durch sind, nimmt das Script em01 als Basis und paßt em02 an. Et cetera ad nauseam.
    Mit der jetzigen Einstellung sind alle Empties 0.5 BUs voneinander entfernt. Der Rest ist für die Latten je ein Copy Location und ein Locked Track constraint. Sollte für Segmenttore und Züge funktionieren. Animiert werden muß nur em00.

    Klicke auf die Grafik für eine vergrößerte Ansicht  Name: rolltor.png Ansichten: 1 Größe: 33,9 KB ID: 19595

    rolltor.blend

    Code:
    import bpy
    from math import sqrt
    
    
    res = 20 # precision doubles with every step
    target_dist = 0.5 # how wide the empties are apart
    prefix = "em" #prefix of all empties
    
    # give small numbers a leading zero
    def pad(x):
        if x < 10:
            return "0" + str(x)
        return str(x)
    
    
    # simple pythagoras calculates the distance between two objects
    def get_distance(o1,o2):
        loc1 = bpy.data.objects[o1].matrix_world.translation
        loc2 = bpy.data.objects[o2].matrix_world.translation
        vx = loc2[0]-loc1[0]
        vy = loc2[1]-loc1[1]
        vz = loc2[2]-loc1[2]
        return sqrt(vx**2 + vy**2 + vz**2)
    
    # gets the follow path constraint in question.    
    def find_cons(ob):
        for c in ob.constraints:
            if c.type == "FOLLOW_PATH":
                return c
        print("ERROR, object doesn't have a path constraint, hilarity will ensue")
    
    # This finds the right offset value
    # so that empties are properly separated
    
    def find_offset(oname1, oname2):
        global res, target_dist
        o1 = bpy.data.objects[oname1]
        o2 = bpy.data.objects[oname2]
        c1 = find_cons(o1)
        c2 = find_cons(o2)
        step = (1.0 - c1.offset_factor) / 2
        new_offset = 1.0
        c2.offset_factor = new_offset
        resolution = res
        while resolution:
            bpy.context.scene.update()
            current_dist = get_distance(oname1,oname2)
            if current_dist > target_dist:
                new_offset -= step
            else:
                new_offset += step
    
            step /= 2
            c2.offset_factor = new_offset
    
            resolution -= 1
    
    # iterates through the empties  
    def set_empties(args):
        global prefix
        start = 0 # lowest number
        end = 5 # highest number
        counter = 0
        while counter < end:
            n1 = prefix + pad(counter)
            n2 = prefix + pad(counter + 1)
            find_offset(n1,n2)
    
            counter += 1
    
    bpy.app.handlers.frame_change_post.clear() # careful, lazy version. If there are other scripts using frame change post, this will mute them.
    bpy.app.handlers.frame_change_post.append(set_empties)


    Hier noch ein kleines Script, das beim Benennen der Empties hilft. Alle markierten Empties werden neu getauft. Andere Objekte werden ignoriert.

    Code:
    # short script to rename all selected empties
    # Order is kinda random, so animate after using it.
    
    import bpy
    
    # if you intend to use more than 100 segments, redo this function
    def pad(x):
        if x < 10:
            return "0" + str(x)
        return str(x)
    
    counter = 0
    prefix = "em" # adjust the name here if necessary
    for a in bpy.context.selected_objects:
        if a.type == 'EMPTY':
            a.name = prefix + pad(counter)
            counter += 1


    Bei Fragen einfach fragen.
    Zuletzt geändert von Haunt_House; 08.10.2018, 12:28.

    Kommentar


    • #5
      Kann man das nicht auch mit einer Armature machen?
      Aktuell: W E I H N A C H T S W I C H T E L N Mein Blog: Downtown Blendpolis.

      Kommentar


      • #6
        Danke Haunt_House für die Blend. Ich finde es armselig, dass es dafür anscheinend keine einfache und schnelle Lösung gibt, aber naja. Aber eine Frage: Die empties em02 bis em05 ruckeln am Ende seltsam. Weißt du woran das liegt?

        Kommentar


        • #7
          Also bei mir, Linux, Blender 2.79 ruckeln sie nicht. Sonst hätte ich es nicht reingestellt. Laufen ganz sauber. Insofern, keine Ahnung.
          Ich bin allerdings auch kein Programmierer, ich bin Gelegenheitspfuscher.

          Klicke auf die Grafik für eine vergrößerte Ansicht  Name: roll.gif Ansichten: 1 Größe: 119,9 KB ID: 19638

          Zitat von benam Beitrag anzeigen
          Die empties em02 bis em05 ruckeln am Ende seltsam. Weißt du woran das liegt?
          Welches Ende? Ende der Kurve? Ende der Animation? Welche Blenderversion?, welche Python-Version? Du machst es so geheimnisvoll wie möglich.

          Zitat von benam Beitrag anzeigen
          Ich finde es armselig, dass es dafür anscheinend keine einfache und schnelle Lösung gibt, aber naja.
          Werd' Developer oder bestich' einen, den Spline IK Constraint entsprechend zu erweitern. "Armselig" ist schon sehr hart bei einer kostenlosen Software dieser Größenordnung.

          Es geht schon auch ohne Script. Ich glaube, ich habe damals eine Armature mit einer Kurve verbogen und dann, ich glaube mit Hooks, die Verbiegekurve an der Pfadkurve ausgerichtet.

          Ich weiß jetzt nicht, wie es in 2.8 aussieht, aber der Spline IK Constraint verankert den Anfang der Bone-Chain am Anfang der Kurve. Ich habe noch keinen Weg gefunden, die Bone Chain entlang ihrer eigenen Kurve zu verschieben. Daher der Umweg, die Biegekurve an der Pfadkurve auszurichten.

          Nachtrag: Die Segmente haben je einen Copy Location Constraint auf ihr Empty und einen Locked Track Constraint auf das Folge-Empty.

          Klicke auf die Grafik für eine vergrößerte Ansicht

Name: rolltor2.png
Ansichten: 1
Größe: 39,1 KB
ID: 19663
          Zuletzt geändert von Haunt_House; 10.10.2018, 11:15.

          Kommentar


          • benam
            benam kommentierte
            Kommentar bearbeiten
            Und nur so aus Neugier, wie hast du die Segmente dazu gebracht, sich mit den Empties zu bewegen? Auch mit constraints?

          • Haunt_House
            Haunt_House kommentierte
            Kommentar bearbeiten
            Genau. Die Segmente haben je einen Copy Location Constraint auf ihr Empty und einen Locked Track Constraint auf das Folge-Empty.

        • #8
          Ich habe gerade nichts zur Hand, um ein gif zu machen, ist aber auch nicht so wichtig, ich versuche jetzt erstmal, die Methode auf meine Curve anzupassen. Das blöde ist, die Empties hauen mir immer ab, wenn ich den Constraint hinzufügen will:

          EDIT: Jetzt sieht man was.
          Klicke auf die Grafik für eine vergrößerte Ansicht

Name: frage2_bild4.png
Ansichten: 1
Größe: 283,3 KB
ID: 19716
          EDIT2: Das meine ich mit ruckeln:
          Klicke auf die Grafik für eine vergrößerte Ansicht  Name: animiertes-gif-von-online-umwandeln-de.gif Ansichten: 1 Größe: 690,0 KB ID: 19689
          Zuletzt geändert von benam; 13.10.2018, 19:00.

          Kommentar


          • benam
            benam kommentierte
            Kommentar bearbeiten
            Da, hab meinen Post bearbeitet!

        • #9
          Da liegt man jetzt eine Woche lang wach und grübelt...

          Klicke auf die Grafik für eine vergrößerte Ansicht  Name: image_3233.png Ansichten: 1 Größe: 7,2 KB ID: 19711

          Das Verhalten ist vollkommen normal. Die viel zu scharfe Kurve macht das eben so. Das ist die Folge davon, daß die geraden Segmente Abkürzungen nehmen. Und die Abkürzung in meinem Fall ist so extrem, daß eine sehr ungleichförmige Bewegung dabei entsteht. Wenn das Verhältnis Radius zu Segmentlänge zu heftig wird, dann wird ganz viel gespart. Würde man das so bauen, wäre die Mechanik ziemlich schwergängig, vielleicht sogar selbsthemmend.

          Mit einer ausreichend verrückten Kurve kann man das Script wahrscheinlich auch dazu bringen, falsche Ergebnisse zu berechnen.
          Der Winkel zwischen Restkurve und Segment sollte ein gutes Stück von 90° entfernt sein.

          Verbinde die Empties mit Linien oder Objekten und schau es Dir in Zeitlupe an. Dann siehst Du, warum das bei dieser Extremkurve so sein muß. Bei meinem Gif oben "ruckelt" das Ende auch ein wenig.

          Klicke auf die Grafik für eine vergrößerte Ansicht  Name: image_3234.gif Ansichten: 1 Größe: 239,7 KB ID: 19712

          Nimm einen realistischen Mindestradius oder kleinere Abstände und alles ist in Ordnung.
          Zuletzt geändert von Haunt_House; 14.10.2018, 01:58.

          Kommentar


          • Haunt_House
            Haunt_House kommentierte
            Kommentar bearbeiten
            Weiß nicht genau, warum das Empty abhaut, aber mit Alt-G sollte es zurück auf die Kurve kommen.

          • benam
            benam kommentierte
            Kommentar bearbeiten
            Danke, jetzt funktioniert alles!

          • benam
            benam kommentierte
            Kommentar bearbeiten
            Übrigens: Meinst du nicht, dass es evt. sinnvoll wäre, das Script als Addon zu verpacken,sofass andere auch davon profitieren würden?

        • #10
          Ich hatte eben nochmal einen Geistesblitz:

          Hey, eine Kurve kann ihrerseits einen Curve Modifier haben. Und ja, die kleine Kurve folgt der großen Kurve ganz wunderbar. Damit der Spline-IK Modifier auch funktioniert, muß bei dem Curve Modifier das ganz rechte Icon angeschaltet werden.

          Klicke auf die Grafik für eine vergrößerte Ansicht  Name: without-script.png Ansichten: 2 Größe: 28,2 KB ID: 20361

          Und dann mußte ich die Auflösung der großen Kurve auf 1024 hochwürgen, damit sich die beiden Kurven vergleichsweise sauber decken. Mein Script dürfte genauer sein ( :

          Aber ja, es geht mit ein paar Verrenkungen inzwischen tatsächlich auch ohne Script.

          without-script.blend

          Nachtrag: Ich habe das Ergebnis eben mit Kreisen überprüft und so ganz genau geht es mit den Modifiern dann doch nicht. Scriptnützlichkeit vorübergehend wiederhergestellt.

          Klicke auf die Grafik für eine vergrößerte Ansicht  Name: not working.png Ansichten: 1 Größe: 13,4 KB ID: 20366
          Zuletzt geändert von Haunt_House; 09.11.2018, 10:50.

          Kommentar

          Lädt...
          X