PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PolygonAnimation


katjarella
7. May 2006, 19:02
Hallo zusammen, kenn Ihr einen Weg eine Polygon/Kreis Animation ohne auf AVSLib (http://avslib.sourceforge.net) zurückzugreifen?

Erklärung: ich versuche gerade ein ein Vorschaubild (grüner Stern) nach links oben um die Runde Ecke zu bekommen. siehe Bild:

http://img430.imageshack.us/img430/3753/katjarella8ya.th.jpg (http://img430.imageshack.us/my.php?image=katjarella8ya.jpg)

gerade ist ja kein Problem, aber Rund?

Kopernikus
7. May 2006, 19:39
Schuss ins Blaue:

So ähnlich wie gerade, nur, dass du noch ein paar sin/cos Funktionen an der Richtigen Stelle einfügen musst.

Da ich aber wegen meiner eher geringen avs Fähigkeiten sogar an gerade scheitere, kann ich es nicht ausprobieren.

Vision:
Damit sollte man fast beliebige Pfade erzeugen können. Wenn man ganz verwegen wäre, könnte man die Bahn als Beziér Kurven ausführen, und nur die Stützstellen an die Funktion übergeben...

Könntest du ein Beispiel für gerade posten, dann kann ich vielleicht ein bisschen basteln

katjarella
8. May 2006, 13:21
Eigentlich ist gerade nicht besonderes...

Animate(hintergrund,0,125,"Layer",vorschauvideo,"add",255,X-StartPos,Y-StartPos,vorschauvideo,"add",255,X-EndPos,Y-EndPos)

Und ich verwende immer Layer, weil Overlay wenn man es mehrmals hintereinander verwendet (auch bei RGB32), die Farben zerhaut.

siehe auch Anhänge :)

Und ich hab das gerade.avs mit Richtigen Werten und in ein AVS umgeschrieben, damit es übersichlicher ist.

Kopernikus
8. May 2006, 14:05
Hi,

so, hab jetzt ein bisschen gebastelt. Ergebnis ist eine relativ holprige Funktion, aber es funktioniert.


function patch(clip bg, clip fg, int posv, int posh){
p1 = bg.crop(0, 0,width(bg),posv)
p2 = bg.crop(0,posv,posh,height(fg))
p3 = bg.crop(posh+width(fg),posv,width(bg)-width(fg)-posh,height(fg))
p4 = bg.crop(0, height(fg)+posv,width(bg),height(bg)-height(fg)-posv)

r2 = stackhorizontal(p2, fg, p3)

return stackvertical(p1, r2, p4)
}

#Animate(hintergrund,0,125,"Layer",vorschauvideo,"add",255,X-StartPos,Y-StartPos,vorschauvideo,"add",255,X-EndPos,Y-EndPos)

function circle(clip vg, clip hg, int radius, int mpx, int mpy,int param){
return patch(hg,vg,round(mpx+radius*cos(2*Pi()*param/1000)),round(mpy+radius*sin(2*pi()*param/1000)))
}
}


Die Funktion Circle ist einfach nur ein Wrapper für Patch (eine Funktion aus meiner persönlichen Sammlung, die volldeckende Overlays mit Hilfe von Crops macht, weils schneller geht, die Funktion kann man ja aber leicht anpassen), der die obere Ecke des "vg" auf einer Kreisbahn um (mpx,mpy) mit Radius "radius" bewegt. Parameter "param" ist dabei die Parametrisierung der Kreisbahn, eine Änderung von "param" um "frames" ist eine ganze Umdrehung.
(Mir fällt grad auf, das das ein bisschen überflüssig ist, da man das ja über animate beliebig einstellen kann)

Ein Beispielskript:


Import("C:\DVDRips\Libli\Functions.avsi")

Overlay = avisource("D:\Videos\Legolas.avi").lanczosresize(200,200).converttoRGB32()

BG = BlankClip(length=3000, width=1000, height=1000, fps=25, color=$000000).converttoRGB32()


animate(Overlay,0,3000,"circle",BG,100,500,500,100,0,BG,100,500,500,100,3000)


In functions.avsi stehen u.a. die oben genannten Funktionen drin. Das converttoRGB steht da drin, weil sonst patch über ungerade crop Parameter motzt. Man könnte das auch anpassen, damit es auch mit YUY2/YV2 funktioniert, aber dann würde es evtl. etwas holpriger.

Man kann mit animate dann recht einfach fiesen Quatsch machen, z.B. sollten möglich sein (habs nicht ausprobiert):

-Spiralbahnen, einfach radius vorne und hinten unterschiedlich wählen
-Schraubenbahnen, einfach mpx und mpy vorne und hinten unterschiedlich wählen
-Spiralschraubenbahnen

Wenn man die circle Funktion etwas abändert könnte man mit wenig aufwand fast belibige geformte Bahnen erzeugen, indem man die spline() funktion verwendet. Damit kann man runde (kubische Splines) oder polygonartige (lineare Splines) Bahnen erzeugen.

Schau ich mal danach, wenn ich etwas mehr Zeit hab.

katjarella
8. May 2006, 14:09
da muß ich mich heut abend mal ransetzen. Feine Sache Kopernikus.

Kopernikus
8. May 2006, 14:39
Ok, hab die Circle Funktion oben ein bisschen aufgeräumt, eine änderung des Parameters um 1000 bedeutet jetzt eine ganze Umdrehung.

Ausserdem im Anhang ein Beispielvideo (achtung, derbes hardcore HD-XviD, 1000x1000 Pixel groß, 1.15 MB) das dazugehörige Skript:


Import("C:\DVDRips\Libli\Functions.avsi")

Overlay = avisource("D:\Videos\Trailer\TheTwoTowersTrailer.avi").lanczosresize(200,200).converttoRGB32()

Overlay1 = Overlay.trim(0,250)
Overlay2 = Overlay.trim(250,500)

BG = BlankClip(length=250, width=1000, height=1000, fps=25, color=$000000).converttoRGB32()

Schraube = animate(Overlay1,0,250,"circle",BG,100,200,200,0,BG,100,400,400,4000)
Spirale = animate(Overlay2,0,250,"circle",BG,10,400,400,0,BG,300,400,400,4000)

return Schraube + Spirale

katjarella
8. May 2006, 15:32
also bei mir hat das mit werden von BG=788x576 und Overlay=156x118 nicht funktioniert. Aber der Tip mit Circle & PI war Gold Wert. :ja:

Mathe isz nicht so mein Dingens :(

erste Stufe ist geschaft :)

--------------------------------------------------------

so zweite Stufe. circle03.avs : vfps=25
bg=ImageReader("circle.png",0,0,vfps,false,false,"RGB32").Loop(1000)
bu=BlankClip(length=1000,width=156,height=118,fps=vfps,color=$FF0000,pixel_type="RGB32").ResetMask()

function CIRCLE(clip "baseClip", clip "movingClip",int "XPos",int "YPOS", int "radius", float "angle"){
HPos = round(XPos + cos(angle)*radius)
VPos = round((YPOS-radius) + sin(angle)*radius)
return baseClip.Layer( movingClip, "Add",255, HPos, VPos )
}
function LINIE(clip "baseClip", clip "movingClip",int "XPos",int "YPOS"){
return baseClip.Layer( movingClip, "Add",255, XPos, YPOS )
}

vSTAR=PI*0.5
vENDE=PI*1
ani01=Animate(0,100,"LINIE", bg,bu,788,440, bg,bu,248,440).Trim(0,-100)
ani02=Animate(100,150,"CIRCLE", bg,bu,248,440,60,vSTAR, bg,bu,248,440,60,vENDE).Trim(100,-50)
ani03=Animate(150,250,"LINIE", bg,bu,188,380, bg,bu,188,-118).Trim(150,-100)

return ani01+ani02+ani03


--------------------------------------------------------

so jetzt muß ich mir Dein Script mal genauer anschaun.