vector3 vector2 unity tutorial script example deactivate c# math vector unity3d geometry

c# - vector2 - vector3 direction unity3d



Obtener vector3 aleatorio en aviĆ³n (3)

Están el planeta y algunos satélites en el espacio 3D. Necesito calcular el eje de rotación para cada satélite. Deberían girar alrededor del centro del planeta.

Calculé el vector del satélite al centro del planeta.

vec1 = planetCenter - sputnikCenter;

Con vec1 y planetCenter puedo calcular la ecuación de plano, que es perpendicular a vec1.

ecuación así:

A.x + B.y + C.z + D = 0

Ahora, debería obtener un vector aleatorio en este plano. Este vector será el eje de rotación. Pero, ¿cómo puedo obtener este vector al azar?


Ahora tu pregunta es clara. Desea rotar el objeto alrededor de otro, como la Tierra y el Sol. Puede haber otras soluciones disponibles, pero lo haría a través de LookAt y la ecuación paramétrica del círculo.

x = r * cos(theta) + displacementX

z = r * sin(theta) + displacementZ

donde r es radio, distancia en su caso displacementX y displacementZ son la distancia desde el origen. Si ambos ( displacementX y displacementZ ) es 0, girará alrededor del origin (0,0)

En el script Object (Earth), hazlo de la siguiente manera

public Transform _sun; float _theta = 0; void Start () { StartCoroutine ("ChangeAngle"); } void Update () { transform.LookAt (_sun); float newX = (5 * Mathf.Cos (_theta)) + _sun.position.x; float newZ = (5 * Mathf.Sin (_theta)) + _sun.position.z; transform.position = new Vector3 (newX, _sun.position.y, newZ); } IEnumerator ChangeAngle () { while (true) { yield return new WaitForSeconds (0.01f); _theta += 0.1f; if (_theta >= 360) _theta = 0; } }

Puedes jugar más con eso


bueno, si obtuviste el plano Ax + By + Cz + D = 0 entonces n(A,B,C) es el vector normal. Así que creo que el enfoque más fácil para su tarea es usar vectores de base . Entonces necesitas 2 vectores perpendiculares en este plano. Para eso puedes explotar producto cruzado. primero algunas definiciones:

knowns:

  • p posición del centro del planeta (o el punto central de tus rotaciones o cualquier punto en el plano así que en el peor de los casos puedes probar p=0,0,-D/C o cualquier otra combinaciónn ...)
  • n vector normal
  • q= (1,0,0) or (0,1,0) eligió el que tiene menos |dot(n,q)|

operaciones:

  • vector = cross(a,b) = a x b - el producto cruzado devuelve el vector perpendicular a a,b
  • scalar = dot(a,b) = (a . b) - producto de punto devuelve 0 si a,b son perpendiculares
  • |a| = abs(a) |a| = abs(a) - valor absoluto (tanto escalar como vectorial )
  • scalar = Rand() - valor pseudoaleatorio flotante en el intervalo <0.0,1.0>

incógnitas:

  • u,v - vectores de base
  • r - tu punto pseudoaleatorio

Así que primero obtén u,v explotando productos cruzados:

u=cross(n,q) v=cross(n,u)

Y ahora el punto:

r = p + u*(2.0*Rand()-1.0) + v*(2.0*Rand()-1.0)

Si solo desea un vector aleatorio, entonces ignore la posición de inicio p

r'' = u*(2.0*Rand()-1.0) + v*(2.0*Rand()-1.0)

Eso es todo ... para que pueda calcular u,v una vez (por cambio de vector normal) y generar la r tantas veces como lo necesite. Si u,v son vectores unitarios, esto generará puntos dentro de 2x2 cuadrados ... si quieres más o menos solo agrega escalas a ellos ...

ver ¿Es posible hacer una simulación realista del sistema solar n-body? y generar parámetros orbitales aleatorios para la ecuación de Kepler en su lugar ...


Parece que su eje de rotación podría ser un vector aleatorio independiente de vec1. Puede generar un vector de unidad aleatorio con distribución uniforme utilizando métodos para la selección de puntos de esfera .

El método de Marsaglia (ecuación 9-11) es conveniente para generar este vector:
Genera x1 y x2 en el rango -1..1 como p = x1^2 +x2^2 <= 1 (rechazando pares malos).
Entonces

x = 2 * x1 * Sqrt(1 - p) y = 2 * x2 * Sqrt(1 - p) z = 1 - 2 * p