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

进而使得程序大体完成。

其实还可以加上粒子系统、背景图案、颜色、坐标系统等等来控制获得更好的效果。

毕竟是很短的时间内做出来的,以前这个程序写过,但是代码丢了,于是今晚再次完成下。

以下是效果图:

猜你喜欢

转载自my.oschina.net/u/248241/blog/1941905