關(guān)于模仿流體的一點構(gòu)思

來個果凍

jdfw.gif
](http://upload-images.jianshu.io/upload_images/1744941-78b07f08d22f9a57.gif?imageMogr2/auto-orient/strip)
至于調(diào)用,只要放一張
6.png

這樣的小圓圖两曼,創(chuàng)建一個精靈-用

auto ac1 = CCLiquid::create(1, CCSizeMake(12,12), 3, 22);
pSprite->runAction(ac1);

看起來是不是有點像果凍秫逝,或者說點擊果凍的時候
這個流體的術(shù)是什么,在我們點擊的時候到底對這張圖片做了什么操作
CCliquid這個函數(shù)的創(chuàng)建放在CCActionGrid3D這里唉铜,liquid的創(chuàng)建傳入了四個參數(shù)
執(zhí)行時間玖院、切割細(xì)致程度菠红,彈動次數(shù),彈動幅度

void CCLiquid::update(float time)
{
    int i, j;
    for (i = 1; i < m_sGridSize.width; ++i)
    {
        for (j = 1; j < m_sGridSize.height; ++j)
        {
            ccVertex3F v = originalVertex(ccp(i, j));
            v.x = (v.x + (sinf(time * (float)M_PI * m_nWaves * 2 + v.x * (1.0f - pow(time,4))*0.01) * m_fAmplitude * m_fAmplitudeRate));
            v.y = (v.y + (sinf(time * (float)M_PI * m_nWaves * 2 + v.y * (1.0f - pow(time,4))*0.01) * m_fAmplitude * m_fAmplitudeRate));
            setVertex(ccp(i, j), v);
        }
    }
}

這里你和cocos2d該文件下的原函數(shù)做對比可能也發(fā)現(xiàn)了

//原函數(shù)
v.x = (v.x + (sinf(time * (float)M_PI * _waves * 2 + v.x * .01f) * _amplitude * _amplitudeRate));
//不變原效果的小改造
v.x = (v.x + (sinf(time * (float)M_PI * m_nWaves * 2 + v.x * (1.0f - pow(time,4))*0.01) * m_fAmplitude * m_fAmplitudeRate));
yuan.png

這里多了一個 (1.0f - pow(time,4)) 這是因為原函數(shù)將一個圖形的頂點進行拉伸后难菌,到時間結(jié)束试溯,狀態(tài)并沒有將它復(fù)原,動作完成這時候time=1.0f 帶入原函數(shù)
v.x = v.x + sin(v.x0.01) 到結(jié)束的時候X軸還是多出了sin(0.01v.x)
因此我所加的 (1.0f - pow(time,4)) 作用便是在結(jié)束的時候把動畫拉回來郊酒,同期修復(fù)的還有ccwave3d遇绞,CCRipple3D 键袱,CCshake3d,CCwaves 好吧這算一個方法摹闽,當(dāng)然蹄咖,僅僅修改原本存在的小bug這算什么事,那我多嘮兩句吧付鹿!

用wave3d試試

我們讓水波動起來


bowen.gif
 D.imgp("illustrated/bg.png", 0, 0):anchor(ccp(0, 0)):to(self)
-- 水波紋1
    local ripple1 = D.imgp("illustrated/ripple.png", 0, 0):anchor(ccp(0, 0)):to(self)
    local waves3D = CCLiquid:create(8, CCSize(10, 10), 4, 10)
    local RepeatForever = CCRepeatForever:create(waves3D)
    ripple1:runAction(RepeatForever)

簡單的Shader模仿

jdfw.gif

好吧澜汤,敢用Shader的前提是你所用的框架處理shader的垃圾回收處理做的不錯,不會因為開一小會就卡的不行倘屹,這里我直接放源碼,原理就是像素點的偏移

#ifdef GL_ES
    precision mediump float;
#endif
//固定模式傳入長寬,resolution即分辨率 CC_Texture0為自身像素 PosX,PosY為鼠標(biāo)位置
//v_texCoord 圖片全屏?xí)r候等于 vec2( gl_FragCoord.x/width, (1.-gl_FragCoord.y/height) ); 

uniform float width;
uniform float height;
uniform float PosX; 
uniform float PosY; 

#define resolution vec2(width,height)
uniform sampler2D CC_Texture0;
varying vec2 v_texCoord;
varying vec4 v_fragmentColor;
//uniform float time;
#define time CC_Time.x

const float PI = 3.1415926535897932;  
const float speed = 0.2;  
const float speed_x = 0.3;  
const float speed_y = 0.3;  
 
const float intensity = 3.0;  
const int steps = 8;  
const float frequency = 4.0;  
const int angle = 7; 
 
const float delta = 20.0;  
const float intence = 400.0;  
const float emboss = 0.3;  


float col(vec2 coord)  
{  
    float delta_theta = 2.0 * PI / float(angle);  
    float col = 0.0;  
    float theta = 0.0;  
    for (int i = 0; i < steps; i++)  
    {
        vec2 adjc = coord;
        theta = delta_theta * float(i);
        adjc.x += cos(theta)*time*speed + time * speed_x;  
        adjc.y -= sin(theta)*time*speed - time * speed_y;  
        col = col + cos((adjc.x*cos(theta) - adjc.y*sin(theta))*frequency)*intensity;  
    }
    return cos(col);
} 
void main()
{

    vec2 p = (gl_FragCoord.xy) / resolution.xy, c1 = p, c2 = p;  
    float cc1 = col(c1);  
 
    c2.x += resolution.x/delta;  
    float dx = emboss*(cc1-col(c2))/delta;  
 
    c2.x = p.x;  
    c2.y += resolution.y/delta;  
    float dy = emboss*(cc1-col(c2))/delta;  
 
    c1.x += dx;  
    c1.y += dy;  
    float alpha = 1.+dot(dx,dy)*intence;  
    gl_FragColor = v_fragmentColor*texture2D(CC_Texture0,vec2(c1.x,1.-c1.y))*(alpha*alpha);//*(alpha) *v_color*(alpha);  
}                                                                                       

等等...發(fā)生了什么情況,我剛插了一張gif結(jié)果前面寫的東西不見了...這是有長度限制慢叨?那就先到這里吧纽匙!--ByBBChangwei-16-04-04

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市拍谐,隨后出現(xiàn)的幾起案子烛缔,更是在濱河造成了極大的恐慌,老刑警劉巖轩拨,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件践瓷,死亡現(xiàn)場離奇詭異,居然都是意外死亡亡蓉,警方通過查閱死者的電腦和手機晕翠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來砍濒,“玉大人淋肾,你說我怎么就攤上這事“中希” “怎么了樊卓?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長杠河。 經(jīng)常有香客問我碌尔,道長,這世上最難降的妖魔是什么券敌? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任唾戚,我火速辦了婚禮,結(jié)果婚禮上待诅,老公的妹妹穿的比我還像新娘颈走。我一直安慰自己,他們只是感情好咱士,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布立由。 她就那樣靜靜地躺著轧钓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪锐膜。 梳的紋絲不亂的頭發(fā)上毕箍,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天,我揣著相機與錄音道盏,去河邊找鬼而柑。 笑死,一個胖子當(dāng)著我的面吹牛荷逞,可吹牛的內(nèi)容都是我干的媒咳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼种远,長吁一口氣:“原來是場噩夢啊……” “哼涩澡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起坠敷,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤妙同,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后膝迎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粥帚,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年限次,在試婚紗的時候發(fā)現(xiàn)自己被綠了芒涡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡卖漫,死狀恐怖拖陆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情懊亡,我是刑警寧澤依啰,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站店枣,受9級特大地震影響速警,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鸯两,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一闷旧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧钧唐,春花似錦忙灼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽酸舍。三九已至,卻和暖如春里初,著一層夾襖步出監(jiān)牢的瞬間啃勉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工双妨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留淮阐,地道東北人。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓刁品,卻偏偏與公主長得像泣特,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子挑随,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354

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