Pregunta

Estoy teniendo problemas con la física en la unidad 3D.Estoy deseando que mi bola se recuperara de las paredes y veo otra dirección.Cuando la pelota golpea la pared, simplemente rebota en línea recta.He intentado cambiar la dirección para ser ortogonal a la dirección que golpea en la pared, pero no cambia de dirección.Debido a esto, la pelota sigue golpeando la pared y rebotando hacia atrás.

En segundo lugar, a veces la pelota pasa por la pared.Las paredes tienen colinadores de caja mientras la pelota tiene un colisionador de esfera.Todos tienen una dinámica continua como el modo de detección de colisiones.

¿Fue útil?

Solución

Aquí hay un enlace a un hilo similar:

http://forum.unity3d.com/threads/22063-i-shot-an-arrow-up-in-the-air...?highlight=shootings+arrow

Personalmente, codificaría la rotación usando lookat cuando Gargarathsunman sugiere en este enlace, pero si desea hacerlo con la física, probablemente necesitará construir la jabalina en al menos un par de partes, ya que los otros sugierenen el enlace, y agregue diferentes valores de arrastre y arrastre angular a cada parte, tal vez densidad también.Si lanzas una jabalina en un vacío, nunca aterrizaría apuntando porque el arrastre aéreo juega una parte tan importante (todas las cosas caen a la misma tasa, independientemente de la masa, gracias, Sir Isaac Newton).Es una simulación difícil para que el motor de física se realice a la derecha.

Otros consejos

Tal vez intente obtener el punto de colección entre su esfera y su pared, luego atrape su velocidad de cuerpo rígido y revertirlo por el punto de colisión normal.

Un ejemplo de un script para hacer eso ---> (poner este script en una pared con colisionador)

C # Script:
public class WallBumper : MonoBehaviour
{
    private Vector3 _revertDirection;
    public int speedReflectionVector = 2;
    /***********************************************
    * name : OnCollisionEnter
    * return type : void
    * Make every gameObject with a RigidBody bounce againt this platform
    * ********************************************/
    void OnCollisionEnter(Collision e)
    {
        ContactPoint cp = e.contacts[0];
        _revertDirection = Vector3.Reflect(e.rigidbody.velocity, cp.normal * -1);
        e.rigidbody.velocity = (_revertDirection.normalized * speedReflectionVector);
    }
}

Recientemente tengo un problema con un cohete que pasa por los objetivos debido a la velocidad e incluso con una detección de colisión dinámica continua. No podría evitar que esto suceda mucho.

Solución de esto usando un script "dontgothroughthings" publicado en wiki. unity3d.com. Esto utiliza RAYCASTING entre las posiciones actuales y anteriores y, a continuación, garantiza que los extremos del bastidor con los colliders conectados para los mensajes un evento ONTRIGGER. Ha funcionado cada vez que, y es solo una cuestión de adjuntar el script para que sea súper fácil de usar.

Creo que la respuesta de la física es lo más que otros han sugerido usar múltiples componentes con un arrastre diferente, aunque normalmente creo que solo quiere un solo cuerpo rígido en el padre. En lugar de la dirección utilizando Transform.Lookat, podría intentar calcular el uso de cuaternion.LookRotation desde el Body.Velocity. Luego use vector3.angle para averiguar cuánto están apagados. Cuanto mayor sea la diferencia del ángulo, más fuerza debe experimentarse y luego usar el cuerpo rígido.ApplyTorque. Tal vez use el pecado (anglodiferferencia) * una constante, por lo que se aplica una fuerza tan baja a Torque a medida que se acerca a la rotación adecuada.

Aquí hay algún código que utilicé en mi cohete, aunque tendrás que sustituir algunas cosas, ya que estaba apuntando hacia un objetivo fijo y querrás usar tu velocidad.

var rotationDirection = Quaternion.LookRotation(lockedTarget.transform.position - this.transform.position);
var anglesToGo = Vector3.Angle(this.transform.rotation.eulerAngles, rotationDirection.eulerAngles);

if (anglesToGo > RotationVelocity)
{
    var rotationDirectionToMake = (rotationDirection * Quaternion.Inverse(this.transform.rotation)).eulerAngles.normalized * RotationVelocity;

    transform.Rotate(rotationDirectionToMake);
}

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top