2011-01-09 9 views
8

Czy ktoś mógłby zaimplementować daną animację w przykładzie modułu cieniującego WebGL? Byłoby wspaniale dla ludzi uczących się WebGL jak ja.Jak zaimplementować tę spiralę obrotową w WebGL?

alt text

Źródło: http://dvdp.tumblr.com/post/2664387637/110109

+1

Oto niektóre eksperymenty HTML Canvas w tym kierunku, aby pomóc. Kluczem jest praca we współrzędnych biegunowych: [Spiral 1] (http://phrogz.net/tmp/canvas_spiral_1.html), [Spiral 2] (http://phrogz.net/tmp/canvas_spiral_2.html), [ Spiral 3] (http://phrogz.net/tmp/canvas_spiral_3.html), [Spiral 4] (http://phrogz.net/tmp/canvas_spiral_4.html). – Phrogz

+0

i [Spiral 5] (http://phrogz.net/tmp/canvas_spiral_5.html), nieco bliżej tego projektu. – Phrogz

+2

Spodziewamy się, że spróbujesz rozwiązać ten problem samemu, zamiast poprosić społeczność o znalezienie dla ciebie kompletnego rozwiązania. Jeśli masz jakiś kod, który nam pokazuje, który pokazuje ci jakikolwiek wysiłek (nawet jeśli jest nie tak), zaktualizuj swoje pytanie i oznacz flagę, aby ponownie otworzyć. Dzięki. – Kev

Odpowiedz

20

I zostały wdrożone animacji na http://www.brainjam.ca/stackoverflow/webglspiral.html. Otrzymasz komunikat "WebGL nie jest obsługiwany", jeśli twoja przeglądarka nie obsługuje WebGL. Jest dostosowany z sandbox created by mrdoob. Podstawową ideą jest pokazanie prostokątnej powierzchni (składającej się z dwóch trójkątów) i zastosowanie modułu cieniującego na powierzchni.

Rzeczywisty kod shaderów jest następujący:

uniform float time; 
uniform vec2 resolution; 
uniform vec2 aspect; 

void main(void) { 

    vec2 position = -aspect.xy + 2.0 * gl_FragCoord.xy/resolution.xy * aspect.xy; 
    float angle = 0.0 ; 
    float radius = length(position) ; 
    if (position.x != 0.0 && position.y != 0.0){ 
     angle = degrees(atan(position.y,position.x)) ; 
    } 
    float amod = mod(angle+30.0*time-120.0*log(radius), 30.0) ; 
    if (amod<15.0){ 
     gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0); 
    } else{ 
     gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);      
    } 
} 

Spirala zmienia rozmiar z okna przeglądarki, ale można łatwo zdecydować się na stałym rozmiarze płótnie zamiast.

Aktualizacja: Tak dla zabawy, tutaj jest dokładnie to samo wdrożenie w jsfiddle: http://jsfiddle.net/z9EmN/

+0

Awesome :) thank you – zproxy

+0

Wersja ShaderToy: https://www.shadertoy.com/view/4tfGD4 – Michaelangel007

+0

ah tak. Widziałem wersję Shadertoy i pomyślałem. hej lat temu zapytałem o to na stackoverflow. i oto jest. :) – zproxy