用程序画出一些函数图形,这是一件赏心悦目的事情。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); }
进而使得程序大致完成。
其实还能够加上粒子系统、背景图案、颜色、坐标系统等等来控制得到更好的效果。
毕竟是很短的时间内作出来的,之前这个程序写过,可是代码丢了,因而今晚再次完成下。
如下是效果图: