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。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章