Почему объекты слипаются в Unity? - PullRequest
0 голосов
/ 08 декабря 2018

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

Boxes

У меня есть префаб, который простоспрайт круга с двумерным коллайдером.

Наконец, к моей основной камере прикреплен скрипт под названием «Атмосфера», который заполнит поле множеством экземпляров префаба и даст им скорость в произвольном направлении.

using UnityEngine;

public class Atmosphere : MonoBehaviour
{
    public GameObject Molecule;
    void Start()
    {
        float x = -4.5f;
        while (x < 4.5f)
        {
            float y = -4.5f;
            while (y < 4.5f)
            {
                var inst = GameObject.Instantiate(Molecule);
                inst.transform.position = new Vector3(x, y, 0);
                var rb = inst.GetComponent<Rigidbody2D>();
                float xForce = Random.value * 2f - 1f;
                float yForce = Random.value * 2f - 1f;
                rb.AddForce(new Vector2(xForce, yForce) * 100f);
                y += 0.5f;
            }
            x += 0.5f;
        }
    }
}

В течение некоторого времени точки отскакивают друг от друга и от краев коробки.

Happy bouncing

Но через некоторое время они в итоге застряли по краям коробки.

Sticky balls

И коробка, и шары, и стенки коробки имеют один и тот же физический материал

Physics material

, который имеет нулевое трение и изгиб1.

Physics material settings

Почему они прилипают к стенам и как я могу предотвратить это?

ЗагрузитьДемонстрация Unity 3D

ОБНОВЛЕНИЕ Если я уроню одну молекулу в коробку с прикрепленным ниже сценарием, она немедленно застрянет на стене.

[RequireComponent(typeof(Rigidbody2D))]
public class Molecule : MonoBehaviour
{
    Rigidbody2D RigidBody2D;

    void Start()
    {
        transform.position = new Vector3(0, 1, 0);
        RigidBody2D = GetComponent<Rigidbody2D>();
        float xForce = Random.value * 2f - 1f;
        float yForce = Random.value * 2f - 1f;
        RigidBody2D.AddForce(new Vector2(-.25f, -0.25f) * 100f);
    }
}

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Unity3D имеет порог скорости.Объекты со скоростью ниже этого порога не будут подпрыгивать и т. Д.

Решение состоит в том, чтобы перейти к Правка> Настройки проекта> Физика 2D и установить порог скорости ниже.

0 голосов
/ 10 декабря 2018

РЕДАКТИРОВАТЬ - Реальное решение:

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

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

То, что вы пытаетесь достичь, - это упругое столкновение, что означает, что оно удовлетворяет как сохранению энергии, так и импульса.Хитрость в том, чтобы добавить скрипт к каждому объекту, который сохраняет энергию системы, добавляя скорость, исправляющую ошибки, со временем.Независимо от того, используете ли вы энергетический маршрут или нет, зависит от вас, существует несколько способов отслеживать и модифицировать энергию, что приводит к изменению скорости.Моментум будет самым легким для отслеживания на мой взгляд.То, что вы пытаетесь достичь, - это упругое столкновение, что означает, что оно удовлетворяет условиям сохранения, т.е.

  1. Создайте компонент, который сохраняет скалярное количество кинетической энергии или импульса (вероятно, он произведетте же результаты)

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

  3. Каждый кадр в событии обновления проверяет скорость твердого тела.Найдите изменение импульса или изменение энергии, добавьте -различие и примените его к объекту.

Я сомневаюсь, что вам придется работать и над событиями столкновения, особенно если вы используете одинаковую массу для каждого объекта.Вот ссылка с примером, где кто-то исправил физику без трения единицы, используя сохранение энергии https://answers.unity.com/questions/168393/frictionless-physics.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...