天天看點

flash特效原理 螺旋效果 (3)

分享一下我老師大神的人工智能教程。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://blog.csdn.net/jiangjunshow

    最近對高數起了很大的興趣,掏錢買了一本高等數學。發現裡面的真是一份寶物,最近看了一個人的部落格。關于高等數學的知識,對螺旋線的形态原來不僅僅是一種。過去嘗試制作的圖形也是一種的方式,現在提及這種螺旋線不是圍繞着圓柱形狀旋轉,而是圓錐。對無錯,圓錐體。又是讓人覺得不爽的數學,不過細心發覺,這種形态看起來更加像自然界的龍卷風。看起來,很美。

flash特效原理 螺旋效果 (3)

我們之前所做的做法圍繞着圓柱的形式旋轉,是以螺旋點分布都是落在圓的軌迹上。而圓錐的螺旋形式,同樣是落在圓的軌迹上,不過這個是圓是随着他的圓的半徑變化而變化。 從這張圖說明,螺旋點的分布會随着高度而收縮。最後落在頂端上。

好吧,你一定是高興來不及嘗試寫一下這種的實作方式,而相對上一次的代碼,僅僅改動的地方很少。

看看下面的效果如何:

flash特效原理 螺旋效果 (3)

image.x=Math.cos(anglePer*i)*(R-i*R/num);//改變半徑的變化    image.z=Math.sin(anglePer*i)*(R-i*R/num);//改變半徑

而我們所需要改變僅僅是他是半徑。半徑趨向應該是向圓錐頂點減少,向它的底增加,是以使用這種遞減的方式進行模拟出這種效果。

image.x=Math.cos(anglePer*i)*(i*R/num);//改變半徑的變化    image.z=Math.sin(anglePer*i)*(i*R/num);//改變半徑

我們定義一個R,作為半徑作為圓錐體的底圓。而這個是固定的大小的。随着他(i*R/num)變量變化,會趨向于R.接近R。或者(i*R/(num-1))

而這種方式也會讓效果發生改變,從圖中可以看出,螺旋點分布會随着半徑的增大而擴充分布。

flash特效原理 螺旋效果 (3)

 package { import flash.display.MovieClip; import flash.events.*; import flash.geom.PerspectiveProjection; import flash.geom.Matrix3D; import flash.geom.Vector3D; import flash.display.DisplayObject; public class Main extends MovieClip {  private var num:int=50;//一共有多少個螺旋點  private var numOfRotations:int=3;//圈數  private var anglePer:Number = ((Math.PI*2) *numOfRotations) / num;  private var R:int=400;//半徑  private var h:int=0;//高度  private var contain:MovieClip=new MovieClip();//容器  private var list:Array=new Array();  public function Main()  {   init();   creat3D();  }  private function init():void  {   root.transform.perspectiveProjection.fieldOfView=100;//初始化透視角度   addChild(contain);   contain.x=stage.stageWidth/2;   contain.y=stage.stageHeight/2-800;   contain.z=600;     }        //建立螺旋效果  private function creat3D():void  {   for (var i:int=0; i<num; i++)   {    var image:photo=new photo();    list.push(image);    contain.addChild(image);    image.x=Math.cos(anglePer*i)*(i*R/(num-1));//改變半徑的變化    image.z=Math.sin(anglePer*i)*(i*R/(num-1));//改變半徑    //image.x=Math.cos(anglePer*i)*(R-i*R/num);//改變半徑的變化    //image.z=Math.sin(anglePer*i)*(R-i*R/num);//改變半徑    image.y=h+=30;//每一個螺旋點都遞增30    image.rotationY = (-i*anglePer) * (180/Math.PI)+90;//偏移    image.addEventListener(Event.ENTER_FRAME,Run);   }  }  private function Run(event:Event):void  {   contain.rotationY+=0.01;   sortZ();  }  private function sortZ():void  {   list.sort(depthSort);   for (var i:int=0; i<list.length; i++)   {    var myimage:photo=list[i];    contain.setChildIndex(myimage,i);   }  }  private function depthSort(objA:DisplayObject,objB:DisplayObject):int  {   var posA:Vector3D=objA.transform.matrix3D.position;   posA=contain.transform.matrix3D.deltaTransformVector(posA);   var posB:Vector3D=objB.transform.matrix3D.position;   posB=contain.transform.matrix3D.deltaTransformVector(posB);   return posB.z-posA.z;  } }}

小結:

總得來講改動的地方很少,涉及代碼也很少,看到的效果很酷。但是會付出一點開銷的代價,之前遇到了一個問題,那就是深度管理的問題,發現之前所做的一種做法有一些地方有錯誤,參考make thing move 作者的做法 對3d容器作了一點解析。但是對于自己還是不太了解深度管理如何處理會更加好。是以借用他的代碼。對于日後了解了,再去讨論這些深度管理的問題。或者在cs5來到之前,他們adobe會意識到這個問題會進行改進。

附錄:網上摘錄

螺旋線的定義:

空間一個點M在圓錐面 x^2+y^2=z^2 上以角速度 w 繞 z 軸旋轉,同時又以線速度 v 沿平行于 z 軸的正方向上升,這點M的軌迹就是一條螺旋線

分享一下我老師大神的人工智能教程。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://blog.csdn.net/jiangjunshow

    最近對高數起了很大的興趣,掏錢買了一本高等數學。發現裡面的真是一份寶物,最近看了一個人的部落格。關于高等數學的知識,對螺旋線的形态原來不僅僅是一種。過去嘗試制作的圖形也是一種的方式,現在提及這種螺旋線不是圍繞着圓柱形狀旋轉,而是圓錐。對無錯,圓錐體。又是讓人覺得不爽的數學,不過細心發覺,這種形态看起來更加像自然界的龍卷風。看起來,很美。

flash特效原理 螺旋效果 (3)

我們之前所做的做法圍繞着圓柱的形式旋轉,是以螺旋點分布都是落在圓的軌迹上。而圓錐的螺旋形式,同樣是落在圓的軌迹上,不過這個是圓是随着他的圓的半徑變化而變化。 從這張圖說明,螺旋點的分布會随着高度而收縮。最後落在頂端上。

好吧,你一定是高興來不及嘗試寫一下這種的實作方式,而相對上一次的代碼,僅僅改動的地方很少。

看看下面的效果如何:

flash特效原理 螺旋效果 (3)

image.x=Math.cos(anglePer*i)*(R-i*R/num);//改變半徑的變化    image.z=Math.sin(anglePer*i)*(R-i*R/num);//改變半徑

而我們所需要改變僅僅是他是半徑。半徑趨向應該是向圓錐頂點減少,向它的底增加,是以使用這種遞減的方式進行模拟出這種效果。

image.x=Math.cos(anglePer*i)*(i*R/num);//改變半徑的變化    image.z=Math.sin(anglePer*i)*(i*R/num);//改變半徑

我們定義一個R,作為半徑作為圓錐體的底圓。而這個是固定的大小的。随着他(i*R/num)變量變化,會趨向于R.接近R。或者(i*R/(num-1))

而這種方式也會讓效果發生改變,從圖中可以看出,螺旋點分布會随着半徑的增大而擴充分布。

flash特效原理 螺旋效果 (3)

 package { import flash.display.MovieClip; import flash.events.*; import flash.geom.PerspectiveProjection; import flash.geom.Matrix3D; import flash.geom.Vector3D; import flash.display.DisplayObject; public class Main extends MovieClip {  private var num:int=50;//一共有多少個螺旋點  private var numOfRotations:int=3;//圈數  private var anglePer:Number = ((Math.PI*2) *numOfRotations) / num;  private var R:int=400;//半徑  private var h:int=0;//高度  private var contain:MovieClip=new MovieClip();//容器  private var list:Array=new Array();  public function Main()  {   init();   creat3D();  }  private function init():void  {   root.transform.perspectiveProjection.fieldOfView=100;//初始化透視角度   addChild(contain);   contain.x=stage.stageWidth/2;   contain.y=stage.stageHeight/2-800;   contain.z=600;     }        //建立螺旋效果  private function creat3D():void  {   for (var i:int=0; i<num; i++)   {    var image:photo=new photo();    list.push(image);    contain.addChild(image);    image.x=Math.cos(anglePer*i)*(i*R/(num-1));//改變半徑的變化    image.z=Math.sin(anglePer*i)*(i*R/(num-1));//改變半徑    //image.x=Math.cos(anglePer*i)*(R-i*R/num);//改變半徑的變化    //image.z=Math.sin(anglePer*i)*(R-i*R/num);//改變半徑    image.y=h+=30;//每一個螺旋點都遞增30    image.rotationY = (-i*anglePer) * (180/Math.PI)+90;//偏移    image.addEventListener(Event.ENTER_FRAME,Run);   }  }  private function Run(event:Event):void  {   contain.rotationY+=0.01;   sortZ();  }  private function sortZ():void  {   list.sort(depthSort);   for (var i:int=0; i<list.length; i++)   {    var myimage:photo=list[i];    contain.setChildIndex(myimage,i);   }  }  private function depthSort(objA:DisplayObject,objB:DisplayObject):int  {   var posA:Vector3D=objA.transform.matrix3D.position;   posA=contain.transform.matrix3D.deltaTransformVector(posA);   var posB:Vector3D=objB.transform.matrix3D.position;   posB=contain.transform.matrix3D.deltaTransformVector(posB);   return posB.z-posA.z;  } }}

小結:

總得來講改動的地方很少,涉及代碼也很少,看到的效果很酷。但是會付出一點開銷的代價,之前遇到了一個問題,那就是深度管理的問題,發現之前所做的一種做法有一些地方有錯誤,參考make thing move 作者的做法 對3d容器作了一點解析。但是對于自己還是不太了解深度管理如何處理會更加好。是以借用他的代碼。對于日後了解了,再去讨論這些深度管理的問題。或者在cs5來到之前,他們adobe會意識到這個問題會進行改進。

附錄:網上摘錄

螺旋線的定義:

空間一個點M在圓錐面 x^2+y^2=z^2 上以角速度 w 繞 z 軸旋轉,同時又以線速度 v 沿平行于 z 軸的正方向上升,這點M的軌迹就是一條螺旋線