what unity from code c# math unity3d geometry

c# - unity - Haz una esfera con vértices equidistantes



unity quad object (6)

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.


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 ángulos (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 }


Si quieres 4, 6, 8, 12 o 20 vértices, 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.


  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<na;ia++,a+=da) // slice sphere to circles in xy planes { r=cos(a); // radius of actual circle in xy plane z=sin(a); // height of actual circle in xy plane nb=ceil(2.0*M_PI*r/da); db=2.0*M_PI/double(nb); // longitude angle step if ((ia==0)||(ia==na-1)) { nb=1; db=0.0; } // handle edge cases for (b=0.0,ib=0;ib<nb;ib++,b+=db) // cut circle to vertexes { x=r*cos(b); // compute x,y of vertex y=r*sin(b); // this just draw the ray direction (x,y,z) as line in OpenGL // so you can ignore this // instead add the ray cast of yours double w=1.2; glBegin(GL_LINES); glColor3f(1.0,1.0,1.0); glVertex3d(x,y,z); glColor3f(0.0,0.0,0.0); glVertex3d(w*x,w*y,w*z); glEnd(); } }

Así es como esto luce:

  • 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)

[Notas]

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

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

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


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

con este objetivo 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.

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

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

Mesh mesh = GetComponent<MeshFilter>().mesh; Vector3[] vv = mesh.vertices; int kVerts=vv.Length for (int i=0; i<kVerts; ++i) Debug.Log ... vv[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 programación casual.

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


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