Jump to content
Sign in to follow this  
nomoregames

Detección colisiones precisas

Recommended Posts

Buenos días a todos

Tengo en la punta de sus brazos un trigger, que al colisionar manda una señal para que el brazo retroceda hasta su posición inicial, pues bien...

https://drive.google.com/open?id=1D458m5HAQV58xFYLj-wVUMfFPgrqbjPr

Como podéis ver en el vídeo, la colisión no es nada precisa.... como hago para que sea exacta al 100%

Gracias de antemano

Share this post


Link to post
Share on other sites

Yo intentaría realizar la detección con Raycast, si estas realizando el movimiento del brazo en ciclos diferentes a del motor de fisica muchas veces fallara.

Share this post


Link to post
Share on other sites
2 hours ago, nomoregames said:

He echo las pruebas, pero nada, sigue traspasando

Nada es más exacto que hacer un raycast, te permite predecir y corregir de manera exacta donde va a parar el IK, además de que podés medir frame a frame el desplazamiento de este trigger. Podría decirse que lo podés considerar "Temporal" de alguna manera, mientras que un OnTrigger se llama en un frame y no te da ninguna data de nada.

El OnTriggerEnter corre cuando haya overlap con un collider por primera vez. Ojo, es overlap, acá no se habla de contacto. Si necesitás el contacto (o más de uno) vas a tener que involucrar un rigidbody dinámico.

Se me ocurren dos ahora mismo:

1. Podrías también obtener el "Closest Point": https://docs.unity3d.com/ScriptReference/Physics2D.ClosestPoint.html

... y de ahí modificar el IK en base al punto obtenido. Igual esto no tiene en cuenta el desplazamiento del IK frame a frame.

2. Podrías realizar el raycast midiendo el desplazamiento del IK frame a frame, o bien realizarlo una sola vez cuando suceda un OnTriggerEnter (vas a tener que guardar la posición vieja).

En los dos casos, una vez que tengas el punto de interés modificas el peso del IK involucrado (LeftHand o RightHand) a 1 y lo posicionas en el Raycasthit.point + un offset (opcional), el tiempo que quieras. Si vas a manejar IK asegurate de hacerlo en OnAnimatorIK.

Aclaro que no tengo idea como exactamente es que el brazo regresa a la posición original (por IK? un clip de animación? un blend?).

Share this post


Link to post
Share on other sites

Mmm, entonces:

Retomo la pregunta anterior, donde es que tengo que poner el raycast hit??

 RaycastHit2D hit;
    if (Physics2D.CircleCast(Prueba.transform.position,Prueba.transform.forward,out hit,0))
            {

        }

Y respondiendo a tu duda, estoy usando IK, y para mover-lo todo utilizo Position.MoveTowards.... esto podría resultar un problema?

Gracias de antemano

 

[Edit] He estado probando con ray en vez de sphere, y a la hora de poner RaycastHit (que sirbe para poder obtener la info de los objetos con los que entre en contacto el rayo... ¿no?) sigue sin funcionar 😅

Share this post


Link to post
Share on other sites
8 hours ago, nomoregames said:

es que tengo que poner el raycast hit??

En 2D el RaycastHit2D es el valor que retorna el método, no es un "out" como en 3D:

RaycastHit2D hitInfo = Physics2D.Raycast( ...);

 

8 hours ago, nomoregames said:

Y respondiendo a tu duda, estoy usando IK, y para mover-lo todo utilizo Position.MoveTowards.... esto podría resultar un problema?

El cómo definas un Vector3 (o 2) no es el problema, podés usar lo que quieras. Lo que sí importa es el Vector3 que pases al sistema de IK, al usar SetIKPosition( ... ).

8 hours ago, nomoregames said:

[Edit] He estado probando con ray en vez de sphere, y a la hora de poner RaycastHit (que sirbe para poder obtener la info de los objetos con los que entre en contacto el rayo... ¿no?) sigue sin funcionar 😅

Para el ejemplo que dí antes quizás un lineCast sería mejor, lo hacés desde la posición del frame anterior a la actual. Tené en cuenta la layermask también (algunos de estos métodos 2D también usan un ContactFilter2D creo, basicamente tienen layerMask, profundidad, y más ).

Share this post


Link to post
Share on other sites

A que te refieres con esto??

12 hours ago, lightbug said:

Lo que sí importa es el Vector3 que pases al sistema de IK, al usar SetIKPosition( ... ).

te refieres a hacia donde indico que se mueva el ik?

PD: he echo mas pruebas y... nada, excepto cuando bajo la velocidad con la que se mueven los puños... Puede tener algo que ver??

 

 

Share this post


Link to post
Share on other sites
On 4/30/2020 at 9:32 AM, nomoregames said:

te refieres a hacia donde indico que se mueva el ik?

No te puedo creer, pensé que te había contestado y al final no jajaja.

Bueno, con eso me refería a que el MoveTowards, Lerp o similar solamente te devuelven un Vector3, nada más. Sí, como bien dices, solamente el valor que indicas de destino del IK.

Subí el código de última.

Share this post


Link to post
Share on other sites

Tengo una manera de detectar colisiones con objetos que van muy rápido y se ejecutan por transforms:

private Vector3 position;
private LayerMask layerMaskEnemy;
private float speed = 40f;

private void Update {
  RaycastHit[] hits;
  Ray ray;

  this.position = this.transform.position;
  this.transform.Translate(this.transform.forward * this.speed * Time.deltaTime, Space.World);
  ray = new Ray(this.position, (this.transform.position - this.position).normalized);
  hits = Physics.RaycastAll(ray, (this.transform.position - this.position).magnitude, this.layerMaskEnemy);

  for (int i = 0; i < hits.Length; i++) {
    Debug.Log(hits[i].transform.gameObject.name + " " + hits[i].distance);
  }
  Debug.DrawLine(this.transform.position, this.position);
}

La idea de base es saber si el objeto ya ha traspasado el objeto a colisionar. Se guarda la posición anterior al movimiento en "position" y luego se mueve el objeto (por Transform). Se crea un ray que va desde la posición actual a la posición anterior. Luego un raycast con solo ese ray y el layer de detección que corresponda. Si en la lista de hits aparece "algo" es que ha sido atravesado.

Share this post


Link to post
Share on other sites
Sign in to follow this  

UnitySpain © Todos los derechos reservados 2020
×
×
  • Create New...