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

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

玫瑰函數就是一件完美的藝術模型,簡單漂亮,固然還有其餘好比:餛飩圖案、分形圖等等。java

今天就介紹玫瑰函數,其餘的之後再介紹,先看看玫瑰函數的公式:ide

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在必定的區間範圍內取值,就能夠作出各類各樣的圖案。code

UNITY3D具體的代碼是:orm

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);
			
	}

 

上面這段代碼就實現了玫圖案函數的表達式。blog

而後經過設置函數物體或者攝像機物體的旋轉來得到物體的運動。ip

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);

相應的回調函數是:it

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);
	}

進而使得程序大致完成。

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

畢竟是很短的時間內作出來的,之前這個程序寫過,可是代碼丟了,因而今晚再次完成下。

如下是效果圖:

相關文章
相關標籤/搜索