查看: 1056|回复: 0
打印 上一主题 下一主题

unity虚拟视觉效果创建(四)

[复制链接]

5552

主题

2

听众

8万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
11

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2012-6-11 15:01:24 |只看该作者 |倒序浏览
Let's finish Grapher2 by adding a Ripple function, which is a single sine wave emanating from the center of the grid. Here's the entire script.

using UnityEngine;
public class Grapher2 : MonoBehaviour {

public enum FunctionOption {

Linear,

Exponential,

Parabola,

Sine,

Ripple

}

private delegate float FunctionDelegate (Vector3 p, float t);

private static FunctionDelegate[] functionDelegates = {

Linear,

Exponential,

Parabola,

Sine,

Ripple

};

public FunctionOption function;

public int resolution = 10;

private int currentResolution;

private Particle[] points;

private ParticleEmitter emitter;

void Start () {

emitter = GetComponent<articleEmitter>();

CreatePoints();

}

private void CreatePoints () {

if(resolution < 2){

resolution = 2;

}

else if(resolution > 127){

resolution = 127;

}

currentResolution = resolution;

emitter.ClearParticles();

emitter.Emit(resolution * resolution);

points = emitter.particles;

float increment = 1f / (resolution - 1);

int i = 0;

for(int x = 0; x < resolution; x++){

for(int z = 0; z < resolution; z++){

Vector3 p = new Vector3(x * increment, 0f, z * increment);

points.position = p;

points[i++].color = new Color(p.x, 0f, p.z);

}

}

}

void Update () {

if(currentResolution != resolution){

CreatePoints();

}

FunctionDelegate f = functionDelegates[(int)function];

for(int i = 0; i < points.Length; i++){

Vector3 p = points.position;

p.y = f(p, Time.timeSinceLevelLoad);

points.position = p;

Color c = points.color;

c.g = p.y;

points.color = c;

}

emitter.particles = points;

}

private static float Linear (Vector3 p, float t) {

return p.x;

}

private static float Exponential (Vector3 p, float t) {

return p.x * p.x;

}

private static float Parabola (Vector3 p, float t){

p.x = 2f * p.x - 1f;

p.z = 2f * p.z - 1f;

return 1f - p.x * p.x * p.z * p.z;

}

private static float Sine (Vector3 p, float t){

return 0.50f +

0.25f * Mathf.Sin(4 * Mathf.PI * p.x + 4 * t) * Mathf.Sin(2 * Mathf.PI * p.z + t) +

0.10f * Mathf.Cos(3 * Mathf.PI * p.x + 5 * t) * Mathf.Cos(5 * Mathf.PI * p.z + 3 * t) +

0.15f * Mathf.Sin(Mathf.PI * p.x + 0.6f * t);

}

private static float Ripple (Vector3 p, float t){

float squareRadius = (p.x - 0.5f) * (p.x - 0.5f) + (p.z - 0.5f) * (p.z - 0.5f);

return 0.5f + Mathf.Sin(15 * Mathf.PI * squareRadius - 2f * t) / (2f + 100f * squareRadius);

}

}
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

关闭

站长推荐上一条 /1 下一条

手机版|纳金网 ( 闽ICP备08008928号

GMT+8, 2024-5-8 05:10 , Processed in 0.080225 second(s), 29 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部