Jump to content
UnitySpain

Aceptamos donaciones vía Paypal.

UnitySpain.com es un servicio gratuito, pero mantener la Comunidad conlleva una serie de gastos.

Fondo Anual Unityspain: Donados 15,00€ de 150,00€

  • Servidor: Dominio.com y Hosting Web
  • Mantenimiento de los Foros
  • Contenido y Servicios Extras
  • Mantenimiento para Redes Sociales
yhuj

Cálculo entre vectores 2D

Recommended Posts

Hola, buenas a todos, sobre la duda que tengo es un poco “rara” de explicar, así que lo haré por guiones para que quede más esquemático:

1)      Tengo en la escena un UI image, que está situado en el punto A de la foto adjunta 1 y 2

2)      De donde he pulsado con el ratón en la UI image (punto A), a donde se encuentre el ratón manteniendo pulsado (punto B), me forma un vector. Este vector juntamente con el horizontal (AC), forman un ángulo, que es el que yo busco.

3)      Hay que tener en cuenta que la UI image puede tener diferentes ángulos, y por eso el vector horizontal AC es respecto a la UI image y no respecto al escenario 2D (ejemplo foto 1 y 2)

He hecho varios intentos, y con el que me he acercado más ha sido con que adjunto. Lo que he hecho ha sido crear una variable “coordRaton” que es el punto B de la foto. La variable “coordRatonPulsado” pretende guardar las coordenadas de donde se ha pulsado encima de la UI image (punto A). Para que me calcule el ángulo una vez he pulsado encima de la UI image estando encima de esta o no, he creado la variable “pulsado”. Para finalizar, dentro del condicional pulsado == 1, he cargado a la consola el valor del ángulo entre el vector AB (vectRadio) y AC (vectHorizontal).

Pero no da el resultado deseado. Como se ve en la tercera imagen, cuando estoy en la izquierda marca 0º y a medida que voy trazando un semicírculo hacia arriba llego a 90º y después a 180º. El problema está en que cuando empiezo a descender el ratón, me marca los valores que están en rojo, y no los que están en negro que son los que quiero. Así pues, ¿cómo puedo hacer que me vaya de 0º hasta 360º, en vez de 0º a 180º y de 180º a 0º?

Adjunto también un pequeño gif para acabar de aclarar la idea de la foto 3.

Por favor, si alguien puede ayudarme se lo agradecería mucho, he hecho muchas pruebas y he buscado en muchos sitios, pero no he dado con la solución. Y si me he complicado mucho la vida con la idea o con el script proponedme otra alternativa más sencilla por favor.

Muchas gracias por su tiempo y ayuda

 

Vector2 coordRaton;
Vector2 coordRatonPulsado;
int pulsado; // 0 no pulsado y 1 sí pulsado


void Update()
{
  coordRaton = Input.mousePosition;

  Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
  Debug.DrawRay(ray.origin, ray.direction * 100, Color.green);
  RaycastHit hit;

  if (Input.GetMouseButton(0) && Physics.Raycast(ray, out hit) == true)
  {
    if (hit.collider.name == "Image")
    {
      coordRatonPulsado = Input.mousePosition;
      pulsado = 1;
    }
  }

  if (Input.GetMouseButtonUp(0))
  {
    pulsado = 0;
  }

  if (pulsado == 1)
  {
    Vector2 vectRadio = new Vector2(coordRatonPulsado.x - coordRaton.x, coordRatonPulsado.y - coordRaton.y);
    Vector2 vectHorizontal = new Vector2(coordRatonPulsado.x, 0);

    float grados = Vector2.Angle(vectRadio, vectHorizontal);
    Debug.Log(grados);
  }
}

 

captura.gif

foto.png

Share this post


Link to post
Share on other sites

Hola, a ver ...

13 minutes ago, yhuj said:

 Hay que tener en cuenta que la UI image puede tener diferentes ángulos, y por eso el vector horizontal AC es respecto a la UI image y no respecto al escenario 2D (ejemplo foto 1 y 2)

eso podés especificarlo con un típico transform.right "versión UI", no se si podés hacerlo con un rectTransform directamente, creo que con transform directamente debería funcionar igual ya que interesa el versor (una dirección). Pero ojo con las coordenas, (más abajo)

28 minutes ago, yhuj said:

if (Input.GetMouseButton(0) && Physics.Raycast(ray, out hit) == true) { if (hit.collider.name == "Image") { coordRatonPulsado = Input.mousePosition; pulsado = 1; } }

No se si es así pero tené en cuenta que que "coordratónpulsado" se está actualizando cuadro a cuadro mientras estén cliqueando, funciona como un "getKey" y seguramente busques un "getKeydown", usá "GetMouseButtonDown" ... o quizás no sea así, pero como vi el GetMouseButtonUp abajo me pareció que se te pasó así que lo menciono.

 

Me parece que todo pasa por una cuestión de sistemas de coordenadas, no estoy seguro pero puede llegar a ser. Tenés que tener en cuenta que el vector resultante de Input.mousePosition será por ej (750,480) es decir un vector2 respecto a la pantalla, que no es lo mismo que usar la info de la colisión del ray , el "hitInfo.point" (hitInfo un raycasthit). Digo esto porque estás queriendo usar el "vector horizontal AC respecto a la UI Image" como especificás, y eso hacerlo directamente como un Vector2 (es decir en el mundo pixels) la verdad no se como hacerlo, o ahora no se me ocurre, por eso te propongo pasar todo a espacio 3D.

 

podés usar el transform.right del objeto UI con el ray.point y sacar tus calculos. Un ejemplo

Vector3 AC = hitInfo.point - referencia;
Vector3 AB = transformUI.right;
float angleABAC = Vector3.SignedAngle(AC,AB); //o alrevés

 

36 minutes ago, yhuj said:

Pero no da el resultado deseado. Como se ve en la tercera imagen, cuando estoy en la izquierda marca 0º y a medida que voy trazando un semicírculo hacia arriba llego a 90º y después a 180º. El problema está en que cuando empiezo a descender el ratón, me marca los valores que están en rojo, y no los que están en negro que son los que quiero. Así pues, ¿cómo puedo hacer que me vaya de 0º hasta 360º, en vez de 0º a 180º y de 180º a 0º?

Simplemente no funciona porque el resultado viene de un sistema "sin memoria", Unity no sabe que vos estás girando en sentido horario ponele, simplemente ve este punto y aquel punto y saca un ángulo. Una cosa que aprendés de tener estos problemas clásicos es que vos mismo tenés que llevar cuenta de todo, sirve para este casoy para muchos otros casos más (ej una freeCam ) que necesite de gr que se yo, vos determinás como "se mueve la cosa".

Una cosa que podés hacer para esto es ir calculando el delta del angulo, y en base a esto ir modificando un valor general (muuuuy común hacer esto), para esto necesitas tener el vector AB anterior, cosa de calcular el delta del ABnuevo vs el ABviejo, tener ángulos absolutos no te sirve tanto, podrías llegar a algún lugar con esto, pero tenés que ir teniendo en cuenta el cuadrante y, seee , se vuelve más tedioso al pedo.

Ej1: angulo ABAC es de 180° , entra el cuadro, te moviste 1 grado en sentido antihorario (resultado sería 181° ) , el delta calculado da 1 grado, entonces subas a los 180° ese grado del delta.

Ej2: angulo ABAC es de 180° , entra el cuadro, te moviste 1 grado en sentido horario (resultado sería 179° ) , el delta calculado da -1 grado, entonces subas a los 180° ese grado negativo del delta.

 

Saludos

Share this post


Link to post
Share on other sites

×
×
  • Create New...