Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Colisiones entre Objetos

Iniciado por eder, Septiembre 02, 2016, 12:56:44 AM

Tema anterior - Siguiente tema
Hay alguna forma de evitar que cuando un objeto que va rapido y choca contra otro este parece como que se intenta meter dentro de el y como no puede hace como que se mete un poco
 
Hay alguna manera de evitar esto?
 
PD: el rigidbody lo tengo puesto con deteccion de colisiones en ContinuousDynamic

Puedes probar con los ajustes de project settings/ time y physics, alguna vez me ha ido bien ajustar el fixed timestep en time,ojo bajalo muy poco a poco ya que el consumo se puede disparar bastante.Las fisicas es de toquetear mucho las propiedades hasta que das en el clavo,intenta tener unas escalas de los objetos lo mas  razonables posibles, 1unidad=1metro.
 
Seguro alguien nos puede dar mas pistas,pero prueba a ver.

Tengo el mismo problema, pero ocurre cuando un solido que controlo con un script por ejemplo choca una esfera con rigidbody.

A ver, no juntéis transform con addforce para los movimientos. Si marcáis el trigger de collider, adiós físicas, se desactivan. Luego, si los objetos están muy escalados, se les irá la pinza con las físicas y harán cosas raras.

si adjuntas un rigidbody a un gameobject ya no es bueno usar el transform o que?
 
 

No es que no sea bueno, es un tema de, o utilizar el transform o utilizar físicas para todos los objetos que intervengan. Sino las colisiones no os serán fiables o realistas.

aaa vale, entonces a los objetos que estan quietos ya sea una pared o un obstaculo tambien les añado rigidbody?
 
 

No, con que uno de los dos objetos que van a colisionar tenga Rigidbody basta, pero si el obstáculo se debería de mover entonces sí.

Cita de: eder date=1472996352aaa vale, entonces a los objetos que estan quietos ya sea una pared o un obstaculo tambien les añado rigidbody?
   
   
       
   


A lo que se refiere iRobb es si vais a utilizar físicas el movimiento lo tenéis que hacer con el método addforce de los rigibodies. Si el movimiento lo haces modificando el transform del objeto puede ocurrir que se metan objetos dentro de otros o incluso los atraviesen. Los objetos que son estáticos no necesitan rigibodies por que son objetos que no les van a afectar las físicas.
 
Esto ocurre por que al ir demasiado rápido lo que estas haciendo es incrementar con saltos muy grandes la posición del objeto.
 
Ejemplo, si tenemos un cubo en la posición (0,0,0) y un plano en la posición (1,0,0) y el incremental que le estamos aplicando al transform del cubo es (200,0,0) * Time.DeltaTime , entonces imaginemos que en el momento que empezamos a movernos tenemos un DeltaTime de 0.02, en el siguiente frame la posición sera (4,0,0) (200*0.02=4), habremos atravesado el plano. Si en vez de un plano tuviéramos un cubo o cualquier objeto con volumen nuestro cubo podría terminar dentro, si ademas no tenemos ninguna constrain definida nuestro cubo saldrá disparado por efecto de las fuerzas.
 
 
 
Espero a ver sido suficientemente claro.

Cita de: esr date=1473061888A lo que se refiere iRobb es si vais a utilizar físicas el movimiento lo tenéis que hacer con el método addforce de los rigibodies. Si el movimiento lo haces modificando el transform del objeto puede ocurrir que se metan objetos dentro de otros o incluso los atraviesen. Los objetos que son estáticos no necesitan rigibodies por que son objetos que no les van a afectar las físicas.
   
   
      Esto ocurre por que al ir demasiado rápido lo que estas haciendo es incrementar con saltos muy grandes la posición del objeto.
   
   
      Ejemplo, si tenemos un cubo en la posición (0,0,0) y un plano en la posición (1,0,0) y el incremental que le estamos aplicando al transform del cubo es (200,0,0) * Time.DeltaTime , entonces imaginemos que en el momento que empezamos a movernos tenemos un DeltaTime de 0.02, en el siguiente frame la posición sera (4,0,0) (200*0.02=4), habremos atravesado el plano. Si en vez de un plano tuviéramos un cubo o cualquier objeto con volumen nuestro cubo podría terminar dentro, si ademas no tenemos ninguna constrain definida nuestro cubo saldrá disparado por efecto de las fuerzas.
   
   
       
   
   
      Espero a ver sido suficientemente claro.
   


Estimado, perfectamente claro.
 
Lo que busco es un efecto de "caja con juguetes". Tengo el problema que si muevo la caja, los juguetes dentro de ella tambien se mueven pero con movimientos mas fuertes, los juguetes atraviesan la caja como tu lo explicas.
 
Entonces la preguntas del millon, ¿como mani***r sin transform para realizar este efecto realista?
 

No he podido utilizar la fuerza Torque para girar una malla con MeshCollider. Unity mostraba el siguiente mensaje de error:
 



   
      Non-convex MeshCollider with non-kinematic Rigidbody is no longer supported in Unity 5.

      If you want to use a non-convex mesh either make the Rigidbody kinematic or remove the Rigidbody component.
   

[/quote]
 
Así que no ha habido otra forma de girar la malla que no sea rotando desde el Transform.
 
Para evitar que los objetos traspasen la malla del recipiente, pues creo que se debería limitar la rotación o el desplazamiento. También lo he hecho desde la función utilizada en físicas FixedUpdate:
 

using UnityEngine;
using System.Collections;
public class ControlRecipiente : MonoBehaviour {
    public float multiplicador = 2f;
    public float giroMax = 2f;
    public float anguloMax = 10f;

void FixedUpdate () {
        Vector3 temp = this.transform.eulerAngles;
        float ax = (temp.x > 180f) ? temp.x - 360f : temp.x;
        float az = (temp.z > 180f) ? temp.z - 360f : temp.z;
        float x = Mathf.Clamp(Input.GetAxis("Mouse Y") * multiplicador, -this.giroMax, this.giroMax);
        float z = Mathf.Clamp(-Input.GetAxis("Mouse X") * multiplicador, -this.giroMax, this.giroMax);
        ax = Mathf.Clamp(ax + x, -this.anguloMax, this.anguloMax);
        az = Mathf.Clamp(az + z, -this.anguloMax, this.anguloMax);
        this.transform.eulerAngles = new Vector3(ax, 0f, az);
    }
}

 
 

Cómo mueves la caja¿? Si la mueves usando el Transform siempre vas a tener ese problema.

Como dice Kaito la forma mas facil seria limitando las transformaciones, la otra forma que se me ocurre seria controlando tu las colisiones, pero yo no me metería en ese lió.

Octubre 07, 2016, 01:39:33 PM #13 Ultima modificación: Octubre 07, 2016, 06:55:24 PM por pioj
Cita de: juanma_teso date=1475791637Cómo mueves la caja¿? Si la mueves usando el Transform siempre vas a tener ese problema.
   


E usado todo lo que dicen las guias, pero pareciera que todos usan solamente transform para el movimiento final:
 
Quaternions:
 



   
      transform.localEulerAngles = new Vector3 (transform.localEulerAngles.x + mouseY, transform.localEulerAngles.y + mouseX, 0);
   

[/quote]
 
Addforce:
 



   
      GetComponent<Rigidbody> ().AddTorque (transform.up * h, ForceMode.VelocityChange);
   

[/quote]
 
Y el clasico transform, que como es lógico no causa el efecto deseado.
 
 
 
¿Cual seria la mejor forma de mover para alcanzar el efecto deseado?

Lo ideal sería usar fuerzas (addTorque), pero prueba a usar la funcione MoveRotation de Rigidbody que son similares al Transform.

Etiquetas: