1. 程式人生 > >unity3d畫出漂亮的玫瑰圖案函式。

unity3d畫出漂亮的玫瑰圖案函式。

用程式畫出一些函式圖形,這是一件賞心悅目的事情。

玫瑰函式就是一件完美的藝術模型,簡單漂亮,當然還有其他比如:餛飩圖案、分形圖等等。

今天就介紹玫瑰函式,其他的以後再介紹,先看看玫瑰函式的公式:

x=(a+b)cosθ-acos[(a+b)θ/b];   
y=(a+b)sinθ-asin[(a+b)θ/b];

一個高中生就能看得懂的函式公式,極其簡單,X、Y的座標由3個值來決定,θ在0-360度或者0-720度的之間範圍取值,而a,b在一定的區間範圍內取值,就可以做出各種各樣的圖案。

UNITY3D具體的程式碼是:

for (var i=0; i<numberOfPoints; i++) {
			theta = i * Mathf.PI / 180;
		linePoints [i] = new Vector3 ((a + b) * Mathf.Cos(1*theta) -a*Mathf.Cos((a +b) * theta / b), (a +b) * Mathf.Sin (1*theta)-a* Mathf.Sin ((a +b) * theta / b), 1.0);
			
	}

 

上面這段程式碼就實現了玫圖案函式的表示式。

然後通過設定函式物體或者攝像機物體的旋轉來獲得物體的運動。

var rotateSpeed = 10.0;

function Update () {
	transform.Rotate(Vector3.up * Time.deltaTime * rotateSpeed);
}

a、b的值可以用slider等UI控制元件來解決。

    btn=gameObject.Find("Canvas/Panel/Button").GetComponent(UI.Button);
    btn.onClick.AddListener(onClick);
    
    sca=gameObject.Find("Canvas/Panel/Slidera").GetComponent(UI.Slider);
    sca.onValueChanged.AddListener(SliderA);
    
    scb=gameObject.Find("Canvas/Panel/Sliderb").GetComponent(UI.Slider);
    scb.onValueChanged.AddListener(SliderB);
    
    scc=gameObject.Find("Canvas/Panel/Sliderc").GetComponent(UI.Slider);
    scc.onValueChanged.AddListener(SliderC);

相應的回撥函式是:

	function Slidera (temp:float)
	{
	 a=  temp/100;
     LineSetup (true);
	}
	function Sliderb (temp:float)
	{
		b= temp/1000;
        LineSetup (true);
	}

下面有用到C的值,這是因為為了更好顯示在攝像機中,因為函式畫出來的影象可能有大有小,需要通過一個C值來來調節,C值=攝像機到函式的距離,這樣就可以調節C值把函式圖案完美的顯示在手機螢幕中央了,這樣就大功告成了。

	function Sliderc (temp:float)
	{
    var gb= GameObject.Find("Main Camera");
    gb.transform.position=new Vector3( gb.transform.position.x, gb.transform.position.y, temp);
	}

進而使得程式大體完成。

其實還可以加上粒子系統、背景圖案、顏色、座標系統等等來控制獲得更好的效果。

畢竟是很短的時間內做出來的,以前這個程式寫過,但是程式碼丟了,於是今晚再次完成下。

以下是效果圖: