## Tuesday, February 08, 2011

### Uniform Points On a Sphere

As promised, here is my code for creating a uniform set of points on a sphere.
`using UnityEngine;using System.Collections.Generic;public class PointsOnSphere : MonoBehaviour {    public GameObject prefab;    public int count = 10;    public float size = 20;        [ContextMenu("Create Points")]    void Create () {        var points = UniformPointsOnSphere(count, size);        for(var i=0; i<count; i++) {            var g = Instantiate(prefab, transform.position+points[i], Quaternion.identity) as GameObject;            g.transform.parent = transform;        }    }        Vector3[] UniformPointsOnSphere(float N, float scale) {        var points = new List<Vector3>();        var i = Mathf.PI * (3 - Mathf.Sqrt(5));        var o = 2 / N;        for(var k=0; k<N; k++) {            var y = k * o - 1 + (o / 2);            var r = Mathf.Sqrt(1 - y*y);            var phi = k * i;            points.Add(new Vector3(Mathf.Cos(phi)*r, y, Mathf.Sin(phi)*r) * scale);        }        return points.ToArray();    }}`

Hans Schmidt said...

sounds nice - an example would be neat...

Simon Wittber said...

This script is designed to be used from the inspector.

Simply add the component to a game object, assign a prefab, then right click the component and click "Create Points".

Unknown said...

Wow - that is an amazing snippet, how did you come about it.

Works great!

crimi said...

Works nice in C#.

Iam looking for a way to do this in JS. Please help me.

var prefab : GameObject;
var count : int= 10;
var size : float= 20;

function Start () {
var points = UniformPointsOnSphere(count, size);
for(var i=0; i<count; i++) {
var g = Instantiate(prefab, transform.position+points[i], Quaternion.identity) as GameObject;
g.transform.parent = transform;
}
}

function UniformPointsOnSphere ( N : float , scale : float ) : Vector3[] {
var points = new Array (Vector3(0, 0, 0));
var i = Mathf.PI * (3 - Mathf.Sqrt(5));
var o = 2 / N;
for(var k=0; k<N; k++) {
var y = k * o - 1 + (o / 2);
var r = Mathf.Sqrt(1 - y*y);
var phi = k * i;
points.Add(new Vector3(Mathf.Cos(phi)*r, y, Mathf.Sin(phi)*r) * scale);
}
return points.ToArray();
}