Noticias

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

Choque entre Rigidbody

Iniciado por Diego Pavez, Febrero 18, 2016, 10:52:35 PM

Tema anterior - Siguiente tema
Hola, bueno para hacer mas corto este tema 
Estoy ocupando Unity 5.3.2f y desde hace años he querido crear un juego que tenga las mismas físicas que tiene una pelota de fútbol en la actualidad
pero nunca estoy conforme porque siempre me falta algo ... Ese algo descubri que era un simple script en el cual no se que componente usar para que cuando:
Un rigidbody(Pelota) detecte la colision de rigidbody(Pie)
Este es mi codigo adjunto a la Pelota:
 
#pragma strict   

public var Fuerza : float;
var rigbody : Rigidbody;

function Start() {
    rigbody = GetComponent.<Rigidbody>();
}


function OnCollisionEnter (col : Collision) {
    if(col.gameObject.name == "Pie")
    {
        rigbody.GetComponent.<Rigidbody>().AddForce(transform.forward * Fuerza);
    }
}
  En la ultima linea he probado con "up" y con "forward" pero no resulta lo que deseo 
Lo ideal seria poder aplicar una fuerza según la dirección del pie


Toda ayuda es siempre bien recibida, Muchas Gracias!

En tu caso al estar aplicando la fuerza en una escala de tiempo muy baja deberias superar los valores de 500 o mas para que tenga efecto. 

En tu caso al estar aplicando la fuerza en una escala de tiempo muy baja deberias superar los valores de 500 o mas para que tenga efecto. [/quote]Lo tengo en 2500 dependiendo de la masa de la pelota y si rebota pero hacia arriba(eso es por el UP) y a veces queda trancada o como que le pego(FORWARD) y solo se levanta levemente 
Lo ideal seria poder hacer reaccionar a la "Pelota" según la dirección del "Pie"

Partiendo de la frase que tienes en negrita "Lo ideal seria poder aplicar una fuerza segun la direccion del pie" lo que debes corregir es el codigo que contiene la funcion OnCollisionEnter porque tal y como lo tienes puesto esta aplicando una fuerza en la direccion de la pelota y no del pie ... deberias sustituir esa funcion por lo siguiente :
function OnCollisionEnter (col : Collision) {

    if (col.gameObject.name == "Pie") {
   
        rigidbody.GetComponent<Rigidbody> ().AddForce (col.gameObject.transform.forward * Fuerza);
    }
}
Quiero dejar claro que con esto no digo que vayas a conseguir un efecto realista ni mucho menos ... no lo he probado, pero la verdad es que apostaria a que no sera asi. Simplemente aplicara la fuerza en la direccion del pie, que es lo que dices que seria lo ideal

Febrero 19, 2016, 02:45:12 PM #4 Ultima modificación: Febrero 19, 2016, 02:46:18 PM por ftejada
Bueno yo creo que lo que dice Arthure está bien, pero se puede dar el caso en el que se golpee el balon con la parte externa o trasera del pie por ejemplo. Eso queire decir que el forward del pie no corresponderia con la direccion y sentido del vector3 de la fuerza. Realmente no se si estoy consiguiendo explicarme a lo que me refiero, pero es dificil explicarlo por escrito... El caso es que si tomas el punto de colision entre el pie y donde es golpeada la pelota,
ContactPoint points = col.contacts[0];  //El primer contacto
Vector3 puntoColision = points.point;
con esto puedes crear un vector3 de direccion desde el centro de la pelota hasta el punto de golpeo y cambiarle el sentido 180º
//calculamos un vector de direccion desde la posicion de la pelota hasta el punto de colision
    Vector3 dir = puntoColision - Pelota.transform.position;
cambiamos el sentido y normalizamos
//Ahora tenemos que hacer que esta direccion sea la opuesta (180 grados)
        dir = dir * -1;
        Vector3 dirFuerza = dir + Pelota.transform.position;
        dirFuerza.normalize;
y ahora aplicarle la fuerza,  al rigidbody Pelota, en esa direccion y sentido para que siempre vaya en la direccion contraria desde donde es golpeada independientemente de cual sea el forward del golpeador (en este caso el pie)... No lo he probado y lo he escrito improvisando, lo que puede que haya algo mal escrito. Pero creo que como idea puede valer. De todos modos si hay algo mal dilo y afinamos más. Un saludos  

[quote author=ftejada date=1455889512" data-ipsquote="" data-cite="ftejada" class="ipsQuote">Bueno yo creo que lo que dice Arthure está bien, pero se puede dar el caso en el que se golpee el balon con la parte externa o trasera del pie por ejemplo. Eso queire decir que el forward del pie no corresponderia con la direccion y sentido del vector3 de la fuerza. Realmente no se si estoy consiguiendo explicarme a lo que me refiero, pero es dificil explicarlo por escrito...[/quote]Te has explicado muy bien y desde luego esta mas currado que lo que me habia limitado a hacer yo ... pero desde el principio he avisado que con mi correccion no iba a conseguir un efecto realista, que tan solo iba a conseguir lanzar la pelota en la direccion del pie limitandome a lo que el autor habia establecido como ideal.Pero que al final, si se trata de hacer en la direccion en que se golpea y no en la direccion del pie tambien se puede hacer mucho mas facil con dos lineas igual y sin mayores calculos :
    
        Vector3 direction = col.gameObject.GetComponent<RigidBody> ().velocity;
       
        this.rigbody.AddForce (direction.normalize * Fuerza);
    }
}
 

[quote author=Arthure date=1455897484" data-ipsquote="" data-cite="Arthure" class="ipsQuote">Te has explicado muy bien y desde luego esta mas currado que lo que me habia limitado a hacer yo ... pero desde el principio he avisado que con mi correccion no iba a conseguir un efecto realista, que tan solo iba a conseguir lanzar la pelota en la direccion del pie limitandome a lo que el autor habia establecido como ideal.Pero que al final, si se trata de hacer en la direccion en que se golpea y no en la direccion del pie tambien se puede hacer mucho mas facil con dos lineas igual y sin mayores calculos :
function OnCollisionEnter (col : Collision) {if (col.gameObject.name = "Pie") {
   
        Vector3 direction = col.gameObject.GetComponent<RigidBody> ().velocity;
       
        this.rigbody.AddForce (direction.normalize * Fuerza);
    }
}
 [/quote]Pues si que es mejor ya que utiliza menos codigo. Saludos

Etiquetas: