Posts mit dem Label OrbitControls werden angezeigt. Alle Posts anzeigen
Posts mit dem Label OrbitControls werden angezeigt. Alle Posts anzeigen

2/21/2017

Tentacle Creature

Und wieder ein three.js Experiment.
Warum Tentakeln? Weil ich mit dem Ergebnis in dem Experiment zuvor nicht zufrieden bin. Bei „Procedurally generated trees in JavaScript“ sehen die Baumstämme und Äste einfach viel zu wenig natürlich aus. So gerade und abgehakt wachsen keine Pflanzen und auch die Verbindungen der Äste untereinander wird man so nicht in der Natur vorfinden.
Auf der Suche nach einer Lösung bin ich über die TubeGeometry gestolpert. Mit dieser lässt sich die Form einer Röhre abbilden. Und, für mich besonders wichtig, man kann ihr einen Pfad mit Koordinaten mitgeben und die TubeGeometry richtet sich danach aus. Und das allerbeste, die TubeGeometry akzeptiert als Pfad auch eine CatmullRomCurve3. Eine Kurve, bzw. etwas genauer gesagt ein Spline, die eine gegebene Anzahl an Kontrollpunkten sehr soft miteinander verbindet. Stichwort: Kubisch Hermitescher Spline, oder auch Centripetal Catmull–Rom spline.
Das einzige Problem das jetzt noch bestand war, dass die TubeGeometry nur einen Radius als Parameter akzeptiert. Gibt man ihr einen Radius von 3, dann hat sie an ihrem Anfangspunkt den selben Radius 3 wie am Endpunkt. Mein Ziel aber was es einen Start, und einen End-Radius definieren zu können. So soll es z.B. möglich sein, dass sich die Röhre zum Ende hin konisch verjüngt. Um das zu erreichen musste ich die TubeGeometry umschreiben. Herausgekommen ist dabei die TentacleGeometry.js. Und weil mich beim Entwickeln die ersten Formen so stark an Tentakeln erinnerten ist dieses Experiment hier entstanden. Das Ganze ist also eher nur ein Zwischenschritt für ein neues „Procedurally generated trees“-Experiment.
Ihr könnt das Experiment direkt hier starten, oder ihr öffnet die Anwendung in einem neuen Browser-Fenster.


4/29/2016

Where am i

In letzter Zeit habe ich sehr viel mit Three.js herumexperimentiert, aber ich habe es nie geschafft zumindest mal einen Teil der Experimente hier zu veröffentlichen.
Das wollte ich ändern und herausgekommen ist dabei „Where am i“. Im Prinzip eine sehr primitive Variante von Google Earth, umgesetzt mit Threejs und OpenStreetMap.
Mit Hilfe von „Where am i“ könnt ihr euch anzeigen lassen wo ihr gerade auf der Erde seid. Dazu stehen euch drei Methoden zur Auswahl.
Bei der ersten Methode („position“) liefert euch der Browser (ihr müsst ggf. zustimmen das der Browser euren Standort abfragen darf) automatisch die Daten um zu bestimmen wo ihr euch befindet.
Bei der zweiten Methode („name“) könnt ihr eine Stadt oder einen Ort angeben und OpenStreetMap liefert dann die entsprechenden Daten.
Und bei der dritten Methode („latitude & longitude“) könnt ihr euch per Eingabe von Breiten- und Längengrad eure Position auf der Erde anzeigen lassen.


Ihr könnt die Anwendung direkt hier starten, oder ihr öffnet „Where am i“ in einem neuen Browser-Fenster. Besonders zu empfehlen für Mobile User/Touch Devices!

Und hier noch ein paar kurze Infos zur Umsetzung.

Die meisten der hier eingesetzten Texturen bekommt ihr auf
„Planet Texture Map Collection“. Eine kleine aber feine und vor allem kostenlose Kollektion an guten Texturen für Planeten. Neben der üblichen ColorMap bekommt ihr hier auch noch BumpMap und SpecularMap mit dazu. Perfekt also für den Einsatz mit Three.js.

An die Daten von OpenStreetMap gelangt ihr wie folgt.
Um an Latitude und Longitude zu kommen per z.B. Städtename benutze ich diese Funktion hier:

function geocode( location ) {

    var geocode = 'http://nominatim.openstreetmap.org/search/' + encodeURI( location ) + '?format=json&polygon=1&addressdetails=1';

    $.getJSON( geocode, function( data ) {

        var lat = parseFloat( data[ 0 ].lat );
        var lon = parseFloat( data[ 0 ].lon );

        console.log( lat, lon );

    } );

};

Und umgekehrt funktioniert das auch. Nämlich mit dieser kleinen Funktion:

function geocodeReverse( lat, lon ) {

    var geocode = 'http://nominatim.openstreetmap.org/reverse?format=json&lat=' + lat + '&lon=' + lon + '&zoom=18&addressdetails=1';

    $.getJSON( geocode, function( data ) {

        var city = data.address.city;

        console.log( city );

    } );

};

Details dazu kann man sich hier durchlesen. Eine wirklich sehr gute Anleitung mit vielen Beispielen.
Wie ihr am Dollarzeichen sicher schon erkannt habt braucht ihr hierfür jQuery. Mit jQuery ist es einfach super komfortabel um an das JSON mit den Daten zu gelangen.

Und hier gibt es die Anleitung (mit Beispiel) wie ihr mit getCurrentPosition an die Positionsdaten des Clients/Device gelangt.

Die Umrechnung der Koordinaten von Breiten- und Längengrad in ein Sphärisches Koordinaten System erfolgt mit dieser Funktion hier:
function cartesianToSpherical( radius, lat, lon ) {

    var phi   = deg2rad( 90 - lat );
    var theta = deg2rad( lon + 180 );

    var x = -( radius * Math.sin( phi ) * Math.cos( theta ) );
    var z =  ( radius * Math.sin( phi ) * Math.sin( theta ) );
    var y =  ( radius * Math.cos( phi ) );

    return new THREE.Vector3( x, y, z );

};

function deg2rad( degAngle ) {

    return ( degAngle * Math.PI ) / 180;

};

Mehr dazu erfahrt ihr hier.
 

Und hier noch ein paar weitere sehr nützliche Links.
Wenn ihr euch für den Glow-Effekt um die Erde interessiert, dann schaut mal hier vorbei.
Und hier gibt es noch ein sehr gutes Beispiel wie ihr eine Sphere so drehen könnt, dass eine ausgewählte Koordinate auf der Sphere in Richtung der Kamera zeigt.
Die Animationen sind mit TwennLite von GreenSock umgesetzt.