Unity學習筆記(3)-----製作一個模擬星系(複雜版)【Step3】
阿新 • • 發佈:2019-02-18
- 行星的軌道離心率普遍較低。
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;
}
這些之前都解釋過了。,不贅述 然後是離心率的問題。當然在此之前, 我們有必要先給這個類加一些視覺化引數,使得我們能夠在檢視面板中輕鬆得知他們的資訊。 新增引數如下: LifeTime, Dist, Max, Min. 先加這些, 之後的引數等會再說。 LifeTime表示生存時間。 其實就是記錄當前這個星系“進化的情況”。 進化完成的標誌, 就是當前星系中, 所有星球的LifeTime都處於一個較高的值 Dist表示到中心天體的距離, Max表示軌道最遠距離, Min表示軌道最近距離。 之後, 完成程式碼如下: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); }
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。