2015-01-16 8 views
2

Я новичок в единстве, и я пытаюсь создать прыгающий мяч, так что я сделал много исследований о подпрыгивая realted физики и я нашел формулу:2D подпрыгивая формула не работает должным образом

Формула:

-2*(V dot N)*N + V 

где V вектор скорости и N является нормаль поверхности, на которой мяч отскакивает

Вот мой сценарий:

using UnityEngine; 

using System.Collections; 

public class BallPhysics : MonoBehaviour { 



    void Start() { 
     rigidbody2D.velocity =new Vector2 (-1,-3); 

    } 

    // Update is called once per frame 
    void Update() { 

    } 
    void OnTriggerEnter2D(Collider2D col) { 

     if (col.gameObject.name == "Pong") { 
      tBounce(); 
       } 


    } 

    void tBounce(){ 
     RaycastHit2D hit = Physics2D.Raycast (new Vector2 (transform.position.x,transform.position.y), new Vector2(-1f,-1f)); 
     Vector2 n = hit.normal; 
     Vector2 v = rigidbody2D.velocity; 
     Vector2 R = -2 * (Vector2.Dot (v, n)) * n + v; 
     rigidbody2D.velocity = R; 
    } 
} 

Я передаю мяч вектор скорости в функции запуска, я использую OnTriggerEnter2D для обработки столкновений и raycast2D, чтобы получить нормаль поверхности.

Проблема заключается в том, что сценарий не отражает вектор скорости, называемый R, я думаю, что проблема находится в нормальном векторе.

Например, V является Vector2 (-1, -1), поэтому в основном R должен быть (-1,1), но это не так. R представляет собой (3,1)!

Я успел сделать мяч, прыгающий по горизонтальной/вертикальной поверхности, изменив скорость шара, но это не сработает должным образом с угловыми углами, поэтому я использую эту формулу. Так в чем проблема?

+0

Почему вы не используете материалы физики и не устанавливаете отскок на 1? – JRowan

+0

Я не использую этот метод, потому что мяч будет в одном положении, и я не хочу, чтобы он был настолько реалистичным. – DeltaWeb

+1

thats cool, мне просто интересно, что я посмотрел на этот вопрос, и я заинтересовался им, я не знаю, что вам сказать, я просто сказал, что использовал бы физический материал, удачи :) – JRowan

ответ

1

Ваш raycast, скорее всего, попадает в неправильный коллайдер. Вы начинаете его с transform.position. Это центр вашего объекта шара.

Представьте себе, что луч выходит из центра круга. Какая первая строка попадает? Он сначала попадает в круг. Таким образом, ваш Raycast сообщает о нормальном уровне поверхности мяча, а не весло.

Существует множество способов обойти это. Вы можете применить Physics Layer, который игнорирует raycasts. Я думаю, что есть одно предопределенное. Вы также можете создавать собственные, а также предоставлять маску слоя для вашего raycast.

Есть другие способы решения проблемы, такие как создание raycast из другого места, но поскольку вы делаете это, когда объекты сталкиваются, маска слоя, вероятно, является самой простой.

+0

спасибо, что он работает – DeltaWeb