Haz una esfera con vértices equidistantes

Estoy tratando de hacer una ráfaga esférica de rayos con el propósito de verificar la colisión, pero teniendo interacciones específicas ocurren en función de qué o dónde golpea cada rayo. De ahí que use rayos en lugar de algo más simple como OverlapSphere .

La razón por la que estoy buscando cómo hacer una esfera es porque puedo usar la misma matemática para mis rayos, haciendo que vayan a los vértices de donde estaría la esfera. Pero cada forma que puedo encontrar para hacer una esfera hace que las líneas se acerquen lo más cerca posible de los polos, lo que tiene sentido, ya que es bastante fácil de hacer. Pero como puedes imaginar, no es tan útil para mi proyecto actual.

TL; DR: ¿Cómo hago una esfera con vértices equidistantes? Si no es perfectamente equidistante, está bien, solo necesita bastante cerca. Si esto sucede, sería genial si pudieras indicar la diferencia y dónde, si corresponde.

Notas adicionales: He visto esto y esto , pero las matemáticas están muy por encima de mi cabeza, así que lo que he estado buscando podría haber estado mirándome todo el tiempo.

¿Sabía que la esfera que Unity le ha dado está diseñada de hecho?

con este objective exacto en mente?

es decir, toda la razón de ser de la esfera incorporada a la Unidad es que los puntos son bastante suavemente espaciales … más o menos equidistantes, como usted lo dice.

enter image description here

Para que aparezca esa esfera en la Unidad, solo haz esto:

enter image description here

A continuación, puede obtener acceso instantáneo a los veteranos, como usted sabe

 Mesh mesh = GetComponent().mesh; Vector3[] vv = mesh.vertices; int kVerts=vv.Length for (int i=0; i 

Tenga en cuenta que puede verificar fácilmente "en qué parte de la esfera" están (por ejemplo) comprobando qué tan lejos están de sus "ciudades" (o lo que sea) o simplemente verifique (por ejemplo) los valores z para ver qué hemisferio son en .. etcétera.


Además...

Tenga en cuenta. En cuanto a su razón general para querer hacer esto:

pero tener interacciones específicas ocurren en función de qué o dónde golpeó cada rayo

Tenga en cuenta que no podría ser más fácil hacerlo con PhysX. (La física del juego completamente integrada en Unity.) De hecho, nunca, nunca, he visto una colisión sin hacer algo "específico" dependiendo de "¡dónde golpeó!"

Por ejemplo, puede obtener el punto donde estaba el contacto con http://docs.unity3d.com/ScriptReference/RaycastHit-point.html

Vale la pena señalar que es absolutamente inconcebible que se pueda escribir algo que se acerque al rendimiento de PhysX en progtwigción casual.

¡Espero que esto haga las cosas más fáciles!

Podrías usar una icosfera. Como los vértices se distribuyen en triangularjs equiláteros, se garantiza que sus vértices serán equidistantes.

enter image description here

Para construir la icosfera, primero se hace un icosaedro y luego se dividen las caras recursivamente en triangularjs más pequeños como se explica en este artículo .

  1. cortar la esfera en N círculos
  2. calcular el perímetro de la misma
  3. divídalo por el mismo ángulo que crea la porción
    • esto te da la cantidad de vértices
    • y también paso de ángulo dentro del círculo
  4. rayos de fundición

Así es como lo codifiqué en C ++ + OpenGL:

 // draw unit sphere points (r=1 center=(0,0,0)) ... your rays directions int ia,na,ib,nb; double x,y,z,r; double a,b,da,db; na=16; // number of slices da=M_PI/double(na-1); // latitude angle step for (a=-0.5*M_PI,ia=0;ia 

Así es como esto luce:

vértices de esfera

  • Las líneas R, G, B son el sistema de coordenadas de la esfera axises X, Y, Z
  • Las líneas blancas son tus vértices (blanco) + dirección (gris)

sistemas coordinados

[Notas]

  • no te olvides de incluir math.h
  • y reemplaza las cosas de OpenGL con las tuyas

Si quieres 4, 6, 8, 12 o 20 vértices, entonces puedes tener vértices exactamente equidistantes como el sólido platónico que todos caben dentro de una esfera. Las coordenadas reales de estos deberían ser fáciles de obtener. Para otros números de vértices, puedes usar otros poliedros y escalar las verties para que se encuentren en una esfera. Si necesitas muchos puntos, un domo geodésico puede ser una buena base. El bucky-ball C60 podría ser una buena base con 60 puntos. Para la mayoría de estos, debería poder encontrar modelos tridimensionales de los que pueda extraer coordenadas.

Creo que la manera más fácil de controlar puntos en una esfera es mediante el uso de coordenadas esféricas . Luego puede controlar la posición de los puntos alrededor de la esfera utilizando dos angularjs (rho y phi) y el radio.

Código de ejemplo para llenar puntos uniformemente alrededor de una esfera giratoria (por diversión):

 var time = 1; // Increment this variable every frame to see the rotation var count = 1000; for (int i = 0; i < count; i++) { var rho = time + i; var phi = 2 * Math.PI * i / count; var x = (float)(radius * Math.Sin(phi) * Math.Cos(rho)); var z = (float)(radius * Math.Sin(phi) * Math.Sin(rho)); var y = (float)(radius * Math.Cos(phi)); Draw(x, y, z); // your drawing code for rendering the point } 

Como ya han sugerido algunas respuestas, use una solución basada en icosaedro. La fuente de esto es bastante fácil de conseguir (y he escrito la mía varias veces), pero considero que el excelente plugin Primitives Pro es extremadamente útil en muchas otras circunstancias, y siempre uso su esfera en lugar del Unity incorporado.

Enlace al componente Primitives Pro

Opciones Primitives Pro