Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Make a sphere with equidistant vertices

I'm trying to make a spherical burst of rays for the purpose of checking collision, but having specific interactions happen based upon what or where each ray hit. Hence why I'm using rays rather then something simpler such as OverlapSphere.

The reason I'm looking for how to make a sphere is because I can use the same math for my rays, by having them go to the vertices of where the sphere would be. But every way I can find for making a sphere has the lines get closer the near to the poles, which makes sense, as its pretty easy to do. But as you can imagine, its not that useful for my current project.

TL;DR: How do I make a sphere with equidistant vertices? If its not perfectly equidistant its fine, it just needs to pretty close. If this happens, it would be great if you could give how much the difference would be, and where, if applicable.

Extra notes: I've looked at this and this, but the math is way over my head, so what I've been looking for might've just been staring me in the face this whole time.

like image 859
Matrixian Avatar asked Jul 29 '14 10:07

Matrixian


Video Answer


2 Answers

You could use an icosphere. As the vertices are distributed on equilateral triangles, your vertices are guaranteed to be equidistant.

enter image description here

To construct the icosphere, first you make an icosahedron and then split the faces recursively in smaller triangles as explained in this article.

like image 71
Elie Génard Avatar answered Sep 27 '22 15:09

Elie Génard


Are you aware that the sphere given to you by Unity is in fact designed

with this exact goal in mind?

ie, the entire raison d'etre of the sphere built-in to Unity is that the points are fairly smoothly space ...... roughly equidistant, as you phrase it.

enter image description here

To bring up such a sphere in Unity, just do this:

enter image description here

You can then instantly get access to the verts, as you know

Mesh mesh = GetComponent<MeshFilter>().mesh;
Vector3[] vv = mesh.vertices;
int kVerts=vv.Length
for (int i=0; i<kVerts; ++i)
  Debug.Log ... vv[i] 

Note you can easily check "which part of the sphere" they are on by (for example) checking how far they are from your "cities" (or whatever) or just check (for example) the z values to see which hemisphere they are in .. et cetera.


Furthermore...

Please note. Regarding your overall reason for wanting to do this:

but having specific interactions happen based upon what or where each ray hit

Note that it could not be easier to do this using PhysX. (The completely built-in game physics in Unity.) Indeed, I have never, ever, looked at a collision without doing something "specific" depending on "where it hit!"

You can for example get the point where the contact was with http://docs.unity3d.com/ScriptReference/RaycastHit-point.html

It's worth noting it is absolutely inconceivable one could write something approaching the performance of PhysX in casual programming.

I hope this makes things easier!

like image 20
Fattie Avatar answered Sep 27 '22 16:09

Fattie