倒水小游戲

這是我學(xué)習(xí)shader的一個練手項目


倒水.gif

實現(xiàn)倒水動作灵汪,核心問題有三個戒傻。

  • 杯子傾斜過程中脑奠,水面要保持水平
  • 水要根據(jù)顏色分層
  • 倒水的時候第一層水面要蕩漾起來

對于問題一,旋轉(zhuǎn)的過程中要保證水的體積不變赖钞,我是假定瓶子是個矩形(不考慮圓底),根據(jù)瓶子水量和瓶子傾斜角度聘裁,計算出水面的中點(diǎn)雪营,然后將紋理坐標(biāo)繞這個中點(diǎn)進(jìn)行旋轉(zhuǎn),然后丟棄y>0的像素衡便。

計算中點(diǎn)需要區(qū)分高度和傾斜角的幾種情況献起,要判斷水面有沒有觸及瓶口以及瓶底洋访,再根據(jù)三角關(guān)系算出體積不變的情況下,對某一傾斜角度水面的中點(diǎn)

    float ratio = iResolution.y/iResolution.x;
    bool toLeft = sin(angle)>=0.0;
    vec2 center = vec2(0.5,1.0-_height);//水面傾斜時谴餐,以哪個店為中心點(diǎn)

    float _t = abs(tan(angle));
    if(_height<0.5){//水的體積小于杯子的一半,先碰到下瓶底
      bool is_bottom = _t/ratio>2.0*_height;//傾斜角度達(dá)到瓶底
      if(is_bottom){
        center.x = sqrt(2.0*_height/_t*ratio)/2.0;
        center.y = 1.0 - sqrt(2.0*_height*_t/ratio)/2.0;

        bool is_top = _t>(ratio)/(_height*2.0);//傾斜角度達(dá)到瓶口
        if(is_top){
          center.y = 0.5;
          center.x = _height;
        }
      }
      if(!toLeft){
        center.x = 1.0-center.x;
      }
    }else{//水比較多姻政,先碰到上瓶底
      bool is_top = _t>2.0*ratio*(1.0-_height);
      if(is_top){
        center.x = sqrt(2.0*ratio*(1.0-_height)/_t)/2.0;
        center.y = sqrt(2.0*ratio*(1.0-_height)*_t)/2.0/ratio;

        bool is_bottom = _t>ratio/(2.0*(1.0-_height));
        if(is_bottom){
          center.y = 0.5;
          center.x = 1.0-_height;
        }
      }

      if(toLeft){
        center.x = 1.0-center.x;
      }
    }
    
    uv.y = uv.y*ratio;
    uv -= vec2(center.x,center.y*ratio);
    
    vec2 uv1 = tranPt(uv,angle,vec2(0.0));

對于問題2,是傳入顏色岂嗓、高度數(shù)組汁展,從最下面顏色開始遍歷,使用不同的高度進(jìn)行繪制厌殉,如果繪制成功就跳出循環(huán)食绿。

    for(int i=0;i<MAX_ARR_LEN;i++){
      if(heights[i].x<0.001){
        continue;
      }
      _height+=heights[i].x;
      a += drawWater(uv,angle,_height,size,i);
      if(a>0.0){//繪制過的,跳過
          ret *= a*colors[i]; 
          break;
      }
    }

水面蕩漾公罕,我使用的是最簡單的三角函數(shù)器紧,還不是很自然,怎樣模擬自然的水面蕩漾效果楼眷,還有待學(xué)習(xí)铲汪。

float y = 0.0;

    bool hasWave = curIdx==arrSize-1;//只有最上面一層有波浪
    hasWave = hasWave;
    if(hasWave){
      // 代入正弦曲線公式計算模擬水面波浪 y = Asin(ωx ± φ)
      float amplitude = 0.0;// 振幅(控制波浪頂端和底端的高度)
      float angularVelocity = 0.0;// 角速度(控制波浪的周期)
      float frequency = 0.0;// 頻率(控制波浪移動的速度)
      if(abs(waveType-1.0)<0.01){//往里倒水
        amplitude = 0.06;
        angularVelocity = 10.0;
        frequency = 10.0;
      }else if(abs(waveType-2.0)<0.01){//往外倒水
        amplitude = 0.03;
        angularVelocity = 5.0;
        frequency = 6.0;
      }
      
      y = amplitude * sin((angularVelocity * uv1.x) + (frequency * cc_time.x)*(toLeft ? 1. : -1.));
    }

傾倒的水流是用的cc.Graphics組件。

倒水的過程其實就是不停的減少水面高度罐柳、修改杯子傾斜度掌腰。

倒水小游戲完整源碼,已經(jīng)發(fā)布到 cocosstore

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末硝清,一起剝皮案震驚了整個濱河市辅斟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芦拿,老刑警劉巖士飒,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蔗崎,居然都是意外死亡酵幕,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門缓苛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芳撒,“玉大人,你說我怎么就攤上這事未桥”噬玻” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵冬耿,是天一觀的道長舌菜。 經(jīng)常有香客問我,道長亦镶,這世上最難降的妖魔是什么日月? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任袱瓮,我火速辦了婚禮,結(jié)果婚禮上爱咬,老公的妹妹穿的比我還像新娘尺借。我一直安慰自己,他們只是感情好精拟,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布燎斩。 她就那樣靜靜地躺著,像睡著了一般串前。 火紅的嫁衣襯著肌膚如雪瘫里。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天荡碾,我揣著相機(jī)與錄音谨读,去河邊找鬼。 笑死坛吁,一個胖子當(dāng)著我的面吹牛劳殖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拨脉,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼哆姻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了玫膀?” 一聲冷哼從身側(cè)響起矛缨,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎帖旨,沒想到半個月后箕昭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡解阅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年落竹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片货抄。...
    茶點(diǎn)故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡述召,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蟹地,到底是詐尸還是另有隱情积暖,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布怪与,位于F島的核電站夺刑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏琼梆。R本人自食惡果不足惜性誉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望茎杂。 院中可真熱鬧错览,春花似錦、人聲如沸煌往。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽刽脖。三九已至羞海,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間曲管,已是汗流浹背却邓。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留院水,地道東北人腊徙。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像檬某,于是被迫代替她去往敵國和親撬腾。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容