258 次瀏覽

[Unity] 以任意角度取圓周上座標之原理與語法

因為要在 Unity 上做一個能在圓周上隨機生成物件的功能,回去研究了一下關於圓與角度的數學。

原理

一、我們會先定義好圓心和半徑,這邊的圓心為 (0, 0)、C = 半徑、θ 為角度,可繪製出以下圖形:

(B, A) 就是我們要求的座標。

二、帶入三角函數公式,其實這就是邊的比例。

\sin\theta=\frac{A}{C}

\cos\theta=\frac{B}{C}


先取 x 座標,我們已知 C = 半徑,為了拿到 B 值,要用 C 乘 \cos\theta

x=C\times\cos\theta

已知 \cos\theta 等於 \frac{B}{C},所以等同

x=C\times\frac{B}{C}

去分母後就是 B 值。


y 座標同理,只不過改成 C 乘 \sin\theta

y=C\times\sin\theta

一樣去分母…

y=C\times\frac{A}{C}


語法

知道為什麼需要乘 \sin\theta\cos\theta 後,接下來就是用腳本來實現他。

一、定義圓心與半徑。

var center = new Vector3(0, 0, 0);
var radius = 3;

二、計算弧度,因為 Unity 自帶的 Mathf.Cos 和 Mathf.Sin 只能輸入弧度並非角度,所以需要事先進行換算。(rad = 弧度、\theta = 角度)

rad=\theta\times\frac{\pi}{180}

以 20 度為例:

var rad = 20 * Mathf.PI / 180;

三、計算 XY 座標,如圓心不在 (0, 0) 時需要加上圓心座標。

var x = center.x + radius * Mathf.Cos(rad);
var y = center.y + radius * Mathf.Sin(rad);

四、最後加入物件生成後會像這樣,指定於角度 20 度座標位置生成一個 Ball 物件:

public GameObject Ball;

private void Start()
{
    var center = new Vector3(0, 0, 0);
    var radius = 3;
    var rad = 20 * Mathf.PI / 180;
    var x = center.x + radius * Mathf.Cos(rad);
    var y = center.y + radius * Mathf.Sin(rad);
    Ball.transform.position = new Vector3(x, y, center.z);
    Instantiate(Ball);
}

Unity 預覽,紅點為圓心,白點為生成的 Ball。

五、實際運用方面,我們可以用迴圈達成「在圓周上每 20 度生成一個物件」的目的。

public GameObject Ball;

private void Start()
{
    var center = new Vector3(0, 0, 0);
    var radius = 3;
    for (int i = 0; i < 360; i += 20)
    {
        var rad = i * Mathf.PI / 180;
        var x = center.x + radius * Mathf.Cos(rad);
        var y = center.y + radius * Mathf.Sin(rad);
        Ball.transform.position = new Vector3(x, y, center.z);
        Instantiate(Ball);
    }
}

輸出結果

留言版

發表留言