3/24/2017

Water ripple effect jQuery plugin

Ich war von dem „water ripple effect“ schon immer fasziniert und so wurde es mal Zeit sich mit damit zu beschäftigen. Rausgekommen ist dabei ein kleines jQuery Plugin, welches ihr komfortabel in euren Projekten mit einbinden könnt. Wie bei meinen letzten jQuery Plugins auch, könnt ihr den „water ripple effect“ mit, oder ohne jQuery benutzen. Als Zip und minifiert ist dieses Plugin nur knapp 2KB groß.
Ursprünglich für Java von Neil Wallis geschrieben und später von Sergey Chikuyonok für JavaScript adaptiert, musste ich das Rad nicht neu erfinden. Ich habe lediglich versucht den Code noch an ein paar Stellen weiter zu optimieren.
Zum Einsatz kommen die Canvas und gutes altes JavaScript. Dadurch ist sichergestellt, dass eine maximale Abwärtskompatibilität erreicht wird. So sollten auch ältere Browser in der Lage sein den Effekt darzustellen. Trotz Optimierungen kostet der Effekt allerdings noch immer gut Rechenpower. Ihr solltet also darauf achten nicht zu große Bilder zu verwenden.

Hier könnt ihr euch eine Demo anschauen:



Folgend ein paar Beispiele wie ihr den Effekt in euer Projekt einbinden könnt. Zunächst mit jQuery, bzw. als jQuery Plugin.




Zuerst einmal müsst ihr jQuery und danach dann das Plugin in eure Seite einbinden.
var settings = {

    image: './img/SwimmingPool.jpg',//image path
    rippleRadius: 3,//radius of the ripple
    width: 480,//width
    height: 480,//height
    delay: 1,//if auto param === true. 1 === 1 second delay for animation
    auto: true//if auto param === true, animation starts on it´s own

};

Als nächstes erstellt ihr ein Objekt. Mit diesem könnt ihr diverse Parameter übergeben. Unverzichtlich ist der Parameter image, mit dem ihr angeben müsst wo das Bild liegt das ihr für den Effekt verwenden wollt. Mit rippleRadius bestimmt ihr den Radius der Wellen. Die Parameter width und height geben an wie groß euer Bild ist. Der Parameter delay kommt ins Spiel wenn ihr den Parameter auto auf true stellt. Steht auto auf true läuft die Animation automatisch ab und mit dem delay könnt ihr bestimmen wie schnell
$( '#holder' ).waterRippleEffect( settings );

Hiermit startet, bzw. initiiert ihr den Effekt. holder ist ein einfaches Div. Wie ihr seht wird an dieser Stelle das eben erstellte Objekt settings mit übergeben.
Soweit so gut. False ihr bei den settings auto auf true gestellt habt dann seid ihr im Prinzip schon fertig.
Wollt ihr das Ganze mit der Maus beeinflussen, dann könnt ihr z.B. folgendes schreiben:

$( '#holder' ).click( function( e ) {

    var mouseX = e.pageX - $( this ).offset().left;
    var mouseY = e.pageY - $( this ).offset().top;

    $( '#holder' ).waterRippleEffect( "disturb", mouseX, mouseY );

} );

So erscheinen die Wellen per Klick an der aktuellen Mausposition.
$( '#holder' ).mousemove( function( e ) {

    var mouseX = e.pageX - $( this ).offset().left;
    var mouseY = e.pageY - $( this ).offset().top;

    $( '#holder' ).waterRippleEffect( "disturb", mouseX, mouseY );

} );

Und so per Mousefollow.

Ihr benutzt kein jQuery? Kein Problem. Dann macht es einfach wie folgt ohne jQuery:



Ihr bindet nur die jquery.waterrippleeffect.min.js in eure Seite mit ein.
Der part mit dem settings Objekt ist 1zu1 gleich wie oben für die jQuery Variante beschrieben, weshalb ich das an dieser Stelle nicht noch einmal wiederhole. Ihr könnt diesen Part einfach so von oben übernehmen.
So startet ihr den Effekt:

var waterRippleEffect = new WaterRippleEffect( document.getElementById( 'holder' ), settings );

holder ist hier wieder ein Div und auch hier wird das settings Objekt mit den Parametern für den Effekt übergeben.
Wollt ihr das Ganze per Mausklick steuern ergänzt folgendes:

document.getElementById( 'holder' ).addEventListener( 'click', function( e ) {

    var mouseX = e.layerX;
    var mouseY = e.layerY;

    waterRippleEffect.disturb( mouseX, mouseY );

} );

Für einen Mouse-Follow schreibt ihr einfach:
document.getElementById( 'holder' ).addEventListener( 'mousemove', function( e ) {

    var mouseX = e.layerX;
    var mouseY = e.layerY;

    waterRippleEffect.disturb( mouseX, mouseY );

} );

Das wars. Mehr ist nicht nötig. Ihr könnt euch auch die Demo oben direkt anschauen und den Code aus dem HTML File entnehmen. Dazu einfach hier klicken.

Zum Download stelle ich euch drei Varianten zur freien Verfügung. Die jquery.waterrippleeffect.min.js wie hier in den Beispielen verwendet. Die jquery.waterrippleeffect.js, falls ihr mal hinter die Kulissen schauen wollt und die jquery.waterrippleeffect.min.js.zip als Zip.

Viel Spaß mit diesem jquery Plugin. Falls ihr Fragen oder Anregungen habt würde ich mich über ein paar Kommentare freuen.

 

3/17/2017

Tornado Simulation

Die Tornado Simulation ist ein Experiment das ich schon seit langem starten wollte. Und mit meiner 3D Particle-Engine, die jetzt schon in so zahlreichen anderen Experimenten zum Einsatz kam, und etwas Zeit ließ sich diese Simulation jetzt endlich mal umsetzen.
Für die Simulation selbst kommen keine weiteren Frameworks wie z.B. Three.js zum Einsatz. Einfach pures JavaScript. Dadurch konnte ich auch in diesem Experiment die Dateigröße mit 13KB recht klein halten.
Zum Rendern nutze ich das Canvas-Element und das ImageData Interface um Zugriff auf die Pixel zu bekommen.
Wer sich für dieses Thema interessiert, ich hatte dazu mal ein Tutorial geschrieben.
Aber zurück zum Tornado. Ziel war es im weitesten Sinn eine möglichst realistische Simulation eines Tornados mit den zur Verfügung stehenden Mitteln zu realisieren.
Die Höhe des Tornados ergibt sich aus der Anzahl der „Radial Segments“. Diese sind in einer sich drehenden Spirale angeordnet, die nach oben hin exponentiell größer wird. Auf die Animation der Verschiebung der Spirale könnt ihr mit „Spiral Disp.“ Einfluss nehmen. Um jedes der „Radial Segments“ kreisen die „Tubular Segments“. Deren Anzahl kann nur auf ein Maximum festgelegt werden, da hier der Zufall mitbestimmt wie viele „Tubular Segments“ pro „Radial Segment“ generiert werden. Jedes einzelne „Tubular Segment“, also Partikel, erhält einen per Zufall generierten Graustufen-Wert und kann eine Spur hinter sich herziehen, deren maximale Länge ihr in den Einstellungen per „Max Trail Length“ beeinflussen könnt. Auch auf die Geschwindigkeit und Drehrichtung der Partikel könnt ihr mit „Max Speed“ Einfluss nehmen. Mit „Min Radius“ könnt ihr zudem noch festlegen wie groß/klein der Radius des Tornados unten am Boden ist.
Geht einfach mal in die Einstellungen mit „Open Controls“ und spielt mit den Werten. Aber bitte etwas vorsichtig. Langsame Rechner könnten hierbei schnell an ihre Grenzen gebracht werden!
Ihr könnt die Anwendung direkt hier unterhalb starten (einfach mit der Maus über das untenstehende Fenster fahren), oder ihr öffnet die Simulation in einem neuen Browserfenster. Vor allem User mit mobilen Endgeräten und älteren Rechnern sollten sich die Simulation in einem extra Fenster anschauen.
Viel Spaß und haltet eure Hüte fest.

 

3/09/2017

Lissajous Curve

Die Lissajous-Figur ist aus mathematischer Sicht das parametrische Schaubild einer Funktion erfunden vom französischen Physiker Jules Antoine Lissajous.
Hier umgesetzt mit JavaScript ohne weitere Frameworks und dadurch unter 15KB klein.
Spielt einfach mal mit den Parametern. Damit lassen sich interessante Ergebnisse erzielen. Um ein harmonisches Ergebnis zu erziehlen, sollten die Werte der drei Parameter W1, W2 und W3 nah beieinander liegen. Wie z.B. in den Voreinstellungen sichtbar.

Ihr könnt die Anwendung direkt hier unterhalb anschauen, oder, besonders für mobile Endgeräte empfehlenswert, in einem neuen Browserfenster.

3/06/2017

Dwitter!

Dwitter? Du meinst bestimmt Twitter! Nein, Dwitter.
Was ist Dwitter? „A social network for short JavaScript demos“.
Dwitter ähnelt Twitter sehr. Nur mit dem Unterschied, dass man mit den 140 Zeichen (bytes) keine Textnachrichten verfasst, sondern kleine JavaScript Demos programmiert.
Die große Herausforderung, und gleichzeitig auch der Reiz, besteht darin, sein Vorhaben in 140 Zeichen Code zu verpacken. Dabei muss man seinen Code brutal optimieren und lernt immer wieder neue Kniffe und Tricks um hier und da ein paar Zeichen einzusparen. Natürlich gibt es Tools wie z.B. das sehr empfehlenswerte „JavaScript Compression Tool“ und andere, aber deren Einsatz allein reicht in den meisten Fällen nicht aus, oder kann nur unterstützend eingesetzt werden.
Am besten schaut man sich andere Beispiele auf Dwitter an und versucht deren Code zu verstehen. So kann man ziemlich schnell viele Tricks zum optimieren seines Codes sammeln.
Hier mal meine ersten Gehversuche auf Dwitter:
https://www.dwitter.net/u/Niklas 

Und hier eine kleine Auswahl meiner Favoriten Dweets:
https://www.dwitter.net/d/701
https://www.dwitter.net/d/1494
https://www.dwitter.net/d/1231
https://www.dwitter.net/d/855
https://www.dwitter.net/d/433
https://www.dwitter.net/d/1829
https://www.dwitter.net/d/915
https://www.dwitter.net/d/1232