2011-03-27 11 views
7

वेबगेल में एनीमेशन जैसी इस सुरंग को कैसे कार्यान्वित करें?वेबगेल में एनीमेशन जैसी इस सुरंग को कैसे कार्यान्वित करें?

enter image description here

स्रोत: http://dvdp.tumblr.com/

यह भी देखें: How to implement this rotating spiral in WebGL?

+2

(30 सेकंड के लिए देखने के बाद निकलती है) – Blender

+0

दीवार पर उसका प्रदर्शन एक प्रोजेक्टर का उपयोग करके देखें;) – zproxy

+2

इस जबकि गया है एक स्वीकृत जवाब है, हमारे समुदाय में नहीं हो रहा है आपकी व्यक्तिगत सुविधा के लिए कोड फैक्ट्री प्रदान करने के लिए उपयोग किया जाता है। – Kev

उत्तर

26

खैर, यह मजेदार था। :)

एक WebGL डेमो यहाँ उपलब्ध है: http://boblycat.org/~knute/webgl/tunnel/

मुख्य एल्गोरिथ्म टुकड़ा शेडर में है। मूल विचार काले रंग के छल्ले/सर्किलों पर बड़े से छोटे से लूप के लिए एक सुरंग जैसी प्रभाव उत्पन्न करने के लिए केंद्र को ऑफसेट करने के लिए है।

किसी भी पिक्सेल को देखते हुए, हम जांच सकते हैं कि पिक्सेल अंगूठी के लिए पर्याप्त है जो काले पिक्सेल के लिए उम्मीदवार बनता है या नहीं। यदि यह अंगूठी के बाहर है, तो बड़े छल्ले के माध्यम से छोटे छल्ले देखने से बचने के लिए लूप को तोड़ दें।

पिछले (बाहरी) सर्कल की दूरी का उपयोग पैटर्न को "निचोड़" करने के लिए किया जाता है जब अंगूठियां बंद होती हैं, इससे 3 डी सतह के भ्रम पैदा होते हैं।

प्रत्येक अंगूठी का लहर पैटर्न निश्चित रूप से एक साइन वक्र है। प्रत्येक अंगूठी के लिए लहर पैटर्न को एनिमेट करने के लिए पिक्सेल के कोण (सर्कल सेंटर की तुलना में) को एक समान समय पैरामीटर के साथ जोड़ा जाता है।

और आखिरकार, लक्ष्य एनीमेशन के नजदीक परिणाम प्राप्त करने के लिए विभिन्न पैरामीटर और पावर() जैसे रूपांतरण कार्यों के साथ बहुत सारे प्रयोग थे। यह सही नहीं है, लेकिन बहुत करीब है।

टुकड़ा शेडर कोड:

#ifdef GL_ES 
precision highp float; 
#endif 

const float PI = 3.14159265358979323846264; 
const float TWOPI = PI*2.0; 

const vec4 WHITE = vec4(1.0, 1.0, 1.0, 1.0); 
const vec4 BLACK = vec4(0.0, 0.0, 0.0, 1.0); 

const vec2 CENTER = vec2(0.0, 0.0); 

const int MAX_RINGS = 30; 
const float RING_DISTANCE = 0.05; 
const float WAVE_COUNT = 60.0; 
const float WAVE_DEPTH = 0.04; 

uniform float uTime; 
varying vec2 vPosition; 

void main(void) { 
    float rot = mod(uTime*0.0006, TWOPI); 
    float x = vPosition.x; 
    float y = vPosition.y; 

    bool black = false; 
    float prevRingDist = RING_DISTANCE; 
    for (int i = 0; i < MAX_RINGS; i++) { 
     vec2 center = vec2(0.0, 0.7 - RING_DISTANCE * float(i)*1.2); 
     float radius = 0.5 + RING_DISTANCE/(pow(float(i+5), 1.1)*0.006); 
     float dist = distance(center, vPosition); 
     dist = pow(dist, 0.3); 
     float ringDist = abs(dist-radius); 
     if (ringDist < RING_DISTANCE*prevRingDist*7.0) { 
      float angle = atan(y - center.y, x - center.x); 
      float thickness = 1.1 * abs(dist - radius)/prevRingDist; 
      float depthFactor = WAVE_DEPTH * sin((angle+rot*radius) * WAVE_COUNT); 
      if (dist > radius) { 
       black = (thickness < RING_DISTANCE * 5.0 - depthFactor * 2.0); 
      } 
      else { 
       black = (thickness < RING_DISTANCE * 5.0 + depthFactor); 
      } 
      break; 
     } 
     if (dist > radius) break; 
     prevRingDist = ringDist; 
    } 

    gl_FragColor = black ? BLACK : WHITE; 
} 
+0

कमाल लग रहा है! अच्छी नौकरी। – Qcom

+0

मेरी कम-अंत प्रणाली पर फ़ायरफ़ॉक्स का परीक्षण करते समय: शेडर लिंक त्रुटि: सी: \ उपयोग \ फ़ायरफ़ॉक्स-3.7a5pre.en-US.win32 \ फ़ायरफ़ॉक्स \ मेमोरी (98,16): चेतावनी X3206: वेक्टर प्रकार सी का निहित छंटनी : \ util \ firefox-3.7a5pre.en-US.win32 \ firefox \ memory (33,5): त्रुटि X3511: लूप को अनलॉक करने में असमर्थ, लूप समय-समय पर समाप्त नहीं होता है (17 पुनरावृत्तियों), [ अनलोल (एन)] एक सटीक उच्च संख्या – zproxy

+0

को मजबूर करने के लिए विशेषता MAX_RINGS = 10: शेडर लिंक त्रुटि: सी: \ उपयोग \ फ़ायरफ़ॉक्स-3.7a5pre.en-US.win32 \ फ़ायरफ़ॉक्स \ मेमोरी (98,16): चेतावनी X3206: वेक्टर प्रकार सी का अंतर्निहित छंटनी: \ util \ firefox-3.7a5pre.en-US.win32 \ firefox \ memory (74,4): त्रुटि X5608: संकलित शेडर कोड बहुत अंकगणितीय निर्देश स्लॉट (733) का उपयोग करता है। मैक्स। लक्ष्य (ps_2_0) द्वारा अनुमत 64 है। (1,1): त्रुटि X5609: संकलित शेडर कोड बहुत अधिक निर्देश स्लॉट (733) का उपयोग करता है। मैक्स। लक्ष्य (ps_2_0) द्वारा अनुमत 96 है। – zproxy

संबंधित मुद्दे