Единство 3D Физика - PullRequest
       29

Единство 3D Физика

1 голос
/ 12 февраля 2011

У меня проблемы с физикой в ​​единстве 3d. Я хочу, чтобы мой мяч отскочил от стен и пошел в другом направлении. Когда мяч попадает в стену, он просто отскакивает прямо назад. Я попытался изменить направление, чтобы оно было ортогональным по отношению к направлению удара о стену, но это не меняет направление. Из-за этого мяч просто продолжает ударяться о стенку и отскакивает прямо назад.

Во-вторых, иногда мяч проходит сквозь стену. Стены имеют коробчатые коллайдеры, а шар - сферический коллайдер. Все они имеют непрерывную динамику в качестве режима обнаружения столкновений.

Ответы [ 3 ]

1 голос
/ 23 февраля 2015

Возможно, попытайтесь получить точку коллайдера между вашей сферой и вашей стеной, а затем поймайте скорость вашего твердого тела и верните ее на нормальную точку столкновения.этот скрипт на стене с коллайдером)

C # скрипт:

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);
    }
}
1 голос
/ 28 марта 2011

Вот ссылка на похожую тему:

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

Лично я бы закодировал вращение, используя LookAt, как предлагает GargarathSunman в этой ссылке, но если вы хотите сделать это с помощью физики, вам, вероятно, нужно будет построить копье, по крайней мере, в нескольких частях, как предлагают другие в ссылку, и добавьте различные значения сопротивления и углового сопротивления для каждой части, возможно, также плотность Если вы бросите метание копья в вакууме, оно никогда не упадет, потому что сопротивление воздуха играет такую ​​важную роль (все вещи падают с одинаковой скоростью независимо от массы, спасибо сэр Исаак Ньютон). Это сложная симуляция для физического движка, чтобы получить права.

0 голосов
/ 20 августа 2017

У меня недавно была проблема с ракетой, проходящей через цели из-за скорости, и даже при непрерывном динамическом обнаружении столкновений я не мог этого избежать.

Я решил это с помощью сценария "DontGoThroughThings" опубликовано на wiki.unity3d.com.При этом используется лучевая передача между текущими и предыдущими позициями, а затем обеспечивается завершение кадра с коллайдерами, подключенными для сообщений о событии OnTrigger.С тех пор работает каждый раз, и это просто вопрос присоединения скрипта, который очень прост в использовании.

Я думаю, что физический ответ такой, как другие предлагали использовать несколько компонентов с разным перетаскиванием, хотя обычно я думаю, что вам нужен толькоодиночный RigidBody на родителя.Вместо направления с использованием transform.LookAt вы можете попытаться вычислить с помощью Quaternion.LookRotation из hardbody.velocity.Затем используйте Vector3.Angle, чтобы узнать, сколько их.Чем больше разность углов, тем больше силы следует испытать, а затем использовать RigidBody.ApplyTorque.Возможно, используйте Sin (angleDifference) * постоянную, чтобы к моменту вращения подходило меньшее усилие.

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

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...