《物理學的彈性》分析

來源:互聯網
上載者:User
  對藍色理想經典論壇中的一篇關於“物理學的彈性”教程的分析,講解比較清晰……

  首先,來認識一下彈性效果,我們這裡把它理解為力,這個力拖動物體到目的地,並且當物體與目的地越遠,這個力越大,就想彈簧上吊了一個物體!

現在,開始一步步寫代碼。
首先,隨便製造一個mc,比如畫一個小球,把它放在舞台的左邊,對該mc寫如下代碼:

onClipEvent(load){   vx=1;} onClipEvent(enterFrame){   _x+=vx;}

   vx表示沿x軸方向的速度,_x+=vx 等於_x=_x+vx. 我們在mc每一楨都使其x座標加上速度。測試動畫,我們能看到小球勻速運動。那要是讓它是變速的,怎麼辦?對了,我們可改變vx,讓vx逐楨變換,即給它一個加速度:

onClipEvent(load){   vx=1;  ax=.1;} onClipEvent(enterFrame){   vx+=ax;  _x+=vx;}

   測試動畫,我們看到小球逐漸加速。如果把vx變為5,ax該為-0.1,這時小球先減速,再反向加速。
我們的目的應是小球先向右加速,然後減速再反向,再迴圈,好像以一定點為中心震動。

下一步,我們設定一個中心,用tx表示該中心的x座標,然後求出tx和_x間的距離,加速度ax與距離成正比,即距離越近,加速度越小。

onClipEvent(load){   tx=250;}onClipEvent(enterFrame){   // ax is a fraction of the distance from tx to _x  ax=(tx-_x)*.2;  vx+=ax;  _x+=vx;}

   現在,我們看到小球在來回跳躍,現實情況應該就像有能量損失,小球的振幅應逐漸減小。現在用k代替上式中的0.2,它就像彈簧的勁度係數;用damp=0.9表示每次振幅減小的幅度:

onClipEvent(load){   tx=250;  k=.2;  damp=.9;}onClipEvent(enterFrame){   // ax is a fraction of the distance from tx to _x  ax=(tx-_x)*k;  vx+=ax;  vx*=damp;  _x+=vx;}

   現在,你就可看到真實的彈性效果,你可改變參數damp和k;另外,如法炮製對y座標採用同樣的方法。代碼如下:

onClipEvent(load){   tx=250;  ty=250;  k=.2;  damp=.9;}onClipEvent(enterFrame){   ax=(tx-_x)*k;  ay=(ty-_y)*k;  vx+=ax;  vy+=ay;  vx*=damp;  vy*=damp;  _x+=vx;  _y+=vy;}

   我們還讓小球能被拖動,如下:
1.雙擊小球進入編輯狀態;
2.選中整個小球,把它轉變為一個按鈕;
3.在按鈕上寫代碼:

on(press){   startDrag("");  drag=true;}on(release, releaseOutside){   stopDrag();  drag=false;}

  4.回到mc的代碼中,改變如下:

onClipEvent(enterFrame){   if(!drag){     ax=(tx-_x)*k;    ay=(ty-_y)*k;    vx+=ax;    vy+=ay;    vx*=damp;    vy*=damp;    _x+=vx;    _y+=vy;  }}

   到現在,我們用的是一個定點(250,250),我們也可把他改為滑鼠的座標,用_root._xmouse等來表示:

onClipEvent(load){   k=.2;   damp=.9;}onClipEvent(enterFrame){   ax=(_root._xmouse -_x)*k;   ay=(_root._ymouse -_y)*k;  vx+=ax;   vy+=ay;   vx*=damp;  vy*=damp;   _x+=vx;   _y+=vy; }

   至此,教程就算結束.

  轉自經典:Aero-lk

  這份教程的目的是能產生出一定數量的條件下彈性效果的動作指令碼提供一種起實際作用的知識。即彈性數學計算知識。從迅速移動、擺動到實際上的彈性動作,這些數學知識都是基於胡克定律的,而且幾乎在每本關於物理的書上都能找到該定律。

  概述:

  彈性動畫是非常迷人的,它能賦予物體反應、動作上的靈性。問題關鍵在於要對有關數學原理有一個實際的理解。你必須熟悉以下三個基本術語:

  position(p) : 位置(p)
velocity(v) : 速度(v)
acceleration(a) : 加速度(a)

  上面三個概念在彈性動畫中都有應用。你可能對這些事實非常熟悉了,即一根彈簧對外力有反應(例如展開作用),加在它身上的外力越大,那麼這根彈簧的反作用力就越大。這個事實是彈性動畫的基礎,也就是所說的胡克定律。

  彈簧反作用力是由被稱為"彈性係數(k)"的常數決定的。進一步的說,在一個無摩擦的環境中,這根彈簧是永遠的伸縮擺動下去的,只要一旦它被外力拉動。所以我們再引入一個"阻礙常量(c)"來限制動作慢慢的停下來。因此,下面就是我們要使用到的數學計算公式:

-k*(P-Po)=A  //一個元素,其加速度與彈簧的位移比例 c*v=A  //一個元素,其加速度與速度成比例已限制動作的進行

  因此,

A=-k*(P-Po)+c*v

  上面公式中:
Po是初始條件,也就是物體在螢幕上的初始位置、初始比例或者初始大小。
k是彈性係數
c是阻礙常數

  在這個等式,你會注意到兩項都會產生加速度,它會改變物體的速度,正如速度可以改變物體的位移一樣。因此原理分析如下 : 當我們將一個物體從其初始狀態而變為另一個狀態時,一個加速度就產生了,它可以依次產生一個速度,而這個速度又會改變物體的位移以便使其回到原來狀態。然而,當它回到初始位置時,又沒有作用力去讓它停下來,因此它會繼續運動(過頭了)。再一次,彈簧會產生一個加速度讓物體回到它的初始位置,所以若沒有阻礙力,物體將在其初始位置左右不停的擺動或者左右移動。初始狀態可以是它在螢幕上的位置、大小、比例、透明度等等。
有關位移狀態、速度和加速度的公式是:

A=-k*(P.current-P.initial) //即A=-k*(目前狀態-初始狀態)V.current=c*V.last+A//即當前速度=c*前一速度+P.current=P.last+V.current //即目前狀態=前一狀態+當前速度

  將這種動作應用於MC的方法是:

onClipEvent (enterFrame) {  dx = this._xscale-xo; //初始化X軸座標下的彈性形變或擺動  dy = this._yscale-yo; //初始化Y軸座標下的彈性形變或擺動   ax = -_root.spring*dx; //產生X軸座標下的加速度  ay = -_root.spring*dy; //產生Y軸座標下的加速度  vx = vx*_root.damp+ax; //產生X軸座標下的速度  vy = vy*_root.damp+ay; //產生Y軸座標下的速度  this._xscale += vx; //將物體向其初始化的X軸座標移動  this._yscale += vy; //將物體向其初始化的Y軸座標移動}

  彈性值可以安下述方法設定其初始狀態:

onClipEvent (load) {   xo = 100;   yo = 100; } 


相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。