unity3d畫出漂亮的玫瑰圖案函式。
阿新 • • 發佈:2018-11-25
用程式畫出一些函式圖形,這是一件賞心悅目的事情。
玫瑰函式就是一件完美的藝術模型,簡單漂亮,當然還有其他比如:餛飩圖案、分形圖等等。
今天就介紹玫瑰函式,其他的以後再介紹,先看看玫瑰函式的公式:
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); }
進而使得程式大體完成。
其實還可以加上粒子系統、背景圖案、顏色、座標系統等等來控制獲得更好的效果。
畢竟是很短的時間內做出來的,以前這個程式寫過,但是程式碼丟了,於是今晚再次完成下。
以下是效果圖: