Unity学习笔记(3)-----制作一个仿真星系(复杂版)【Step3】

卧槽一天就写这个了, 好累啊。。。orz

以后还是写的浓缩点吧。。

----------------------正文分割--------------------------

这篇文章, 主要讨论之前提到的, 我对于约束条件的一些看法。

在我看来, 这种过程类似于自然选择的过程。 而约束在我看来有2种, 一是对行星产生时的约束, 二是淘汰行星的约束。


产生行星的约束:

从太阳系的数据来看, 有几个点可以发掘:

1. 轨道的倾斜角都不高

2. 速度与轨道半径存在一定的关系。


淘汰行星的约束:
  1. 行星的轨道离心率普遍较低。
首先来看倾斜角的问题。
前面提到过, 只要将行星产生的位置约束于X轴附近, 再加上初始受到的动量方向, 就可以基本控制住行星运动的倾角。两个函数代码如下:
	Vector3 ProperArea(float min, float max) {
		float x = (max - min) * Random.value + min;
		float y = (max - min) * Random.value + min;
		float z = (max - min) * Random.value + min;
		return new Vector3 (x * PosiOrNega(), y * PosiOrNega() / 10, z * PosiOrNega() / 10);
	}
	int PosiOrNega() {
		return Random.Range (1, 3) * 2 - 3;
	}


	Vector3 ProperDirect(Vector3 pos) {
		float x = Random.value , y = Random.value / 10, z = Random.value;
		//Debug.Log (x.ToString ()+y.ToString() +z.ToString());
		float Norm = Mathf.Sqrt (y * y + z * z);
		if (pos.y > 0)
			y = -y;
		if (pos.x > 0) return new Vector3 (0 , y / Norm,  z / Norm);
		else return new Vector3 (0 , y / Norm,  -z / Norm);
	}

这些之前都解释过了。,不赘述


然后是离心率的问题。当然在此之前, 我们有必要先给这个类加一些可视化参数,使得我们能够在检视面板中轻松得知他们的信息。
添加参数如下: LifeTime, Dist, Max, Min.
先加这些, 之后的参数等会再说。
LifeTime表示生存时间。 其实就是记录当前这个星系“进化的情况”。 进化完成的标志, 就是当前星系中, 所有星球的LifeTime都处于一个较高的值
Dist表示到中心天体的距离, Max表示轨道最远距离, Min表示轨道最近距离。
之后, 完成代码如下:
	void EclipseFliter(float k) {
		if (Dist > max)
			max = Dist;
		if (Dist < min)
			min = Dist;
		if (LifeTime < 300f  && (2 * (max - min) / (max + min) > k || (max - min) > k / 3 * GalaxyRange)) {
			if (max == Dist)
				ForceCoff*= 0.99f;
			if (min == Dist)
				ForceCoff*= 1.01f;
			
			Destroy (this.gameObject);
		}
	}

这里面的参数有很多。。 每个都代表一个想法。。。
首先说明, 这函数是一个Fliter, 用于强约束条件下的筛选。

第一个条件, 是对已经保持稳定的星球, 不再筛选。
第二第三个条件, 均是控制离心率所用。
而Destroy前的if比较有意思。 ForceCoff是控制其初始力的大小的常数。 注意, 是static变量。
这样就实现了动态控制。 也算是一点新鲜的想法吧。


啊, 终于写完了。 不过这还只是一个半成品呢。。 以后抽空把这些坑都填了、、、包括约束条件什么的啊。。。讲道理, 这个虽然做出来看上去不错, 但是我写的时候还是感觉越写越乱,
等以后整理了吧。

The end。



你可能感兴趣的:(Unity3D学习,Unity,C#)