Моделирование веревок, тросов и т.п.

Физика в Unity

Моделирование веревок, тросов и т.п.

Сообщение Mr_Anderson 05 май 2009, 13:55

Собственно одна из актуальных (и возможно нубских :))) задач в теме: сделать красивые веревки, тросы, цепи и т.п. Можно конечно разбить участки веревок на цилиндры, определить, например, коллайдеры-капсулы и точки соединения цилиндров, только не всегда получается красиво... особенно если веревку двигать по всяким направляющим и укладывать на объекты... Может есть более оптимальные решения? ;)
Mr_Anderson
UNIт
 
Сообщения: 143
Зарегистрирован: 16 апр 2009, 13:32

Re: Моделирование веревок, тросов и т.п.

Сообщение Neodrop 05 май 2009, 18:24

Увы. Ничего более оптимального чем цепь джойнтов, пожалуй нет.
Можно ещё написать хитроумный скрипт, который станет обрабатывать положение точек такой веревки и создать её с помощью LineRenderer. :-? Но это ещё сложнее.
Точнее требует ловкого и хитро.опого кода.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Моделирование веревок, тросов и т.п.

Сообщение gnoblin 05 май 2009, 18:40

А с костями не вариант?
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Моделирование веревок, тросов и т.п.

Сообщение Neodrop 05 май 2009, 18:46

Ну так я это и имею в виду. Коллидеры то к костям аттачить нужно. Как ещё то?
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Моделирование веревок, тросов и т.п.

Сообщение Mr_Anderson 06 май 2009, 07:58

Спасибо за ответы! :) Значит будем как обычно с кучей джоинтов...
Mr_Anderson
UNIт
 
Сообщения: 143
Зарегистрирован: 16 апр 2009, 13:32

Re: Моделирование веревок, тросов и т.п.

Сообщение Mr_Anderson 14 май 2009, 07:55

Моделим металлический трос из кучи сферических звеньев с SphereCollider и ConfigurableJoint... вроде в целом неплохо, но есть косяки:
- трос ведет себя как обычная цепь (т.е. джоинты совершенно не имеют сопротивления в местах соединений, а хотелось бы как раз придать им некоторую упругость чтоб было похоже на жесткий трос);
- при приложении больших сил (или подвешивания к тросу большого груза) коллайдеры начинает "колбасить", т.е. они теряют устойчивость и все превращается в кучу прыгающих шариков :))), что конечно совсем не гуд...
Может кто подскажет что нужно настроить для устранения этих косяков? ;)
Mr_Anderson
UNIт
 
Сообщения: 143
Зарегистрирован: 16 апр 2009, 13:32

Re: Моделирование веревок, тросов и т.п.

Сообщение Neodrop 14 май 2009, 07:57

Configurable Joint
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Моделирование веревок, тросов и т.п.

Сообщение Mr_Anderson 14 май 2009, 08:56

хммм.... ладно джоинты конечно покопаем, но вроде много чего пробовали
Mr_Anderson
UNIт
 
Сообщения: 143
Зарегистрирован: 16 апр 2009, 13:32

Re: Моделирование веревок, тросов и т.п.

Сообщение Mr_Anderson 19 май 2009, 08:07

Снова подниму тему... ConfigurableJoint и Rigidbody настраиваются отлично, когда нет коллайдеров, т.е. вся физика работает как надо, НО нужно чтоб трос взаимодействовал с другими объектами (наматывался, укладывался и т.п.). Вешаем и пытаемся настроить коллайдеры и в цепи из 50 (например) связанных элементов и начинается полный бардак и неустойчивость...
Кстати, в англоязычном форуме подобные вопросы задавались... тока внятных ответов я не увидел :(((

Макрос по созданию троса из сферических элементов в редакторе:

Код: Выделить всё
using UnityEditor;
using UnityEngine;
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using System.Reflection;


public class CreateCableFromElements
{
    [MenuItem("Macros/CreateCableFromElements")]
    public static void CreateCable()
    {
        // выделенный в редакторе объект
        GameObject GO = (GameObject)(Selection.objects[0]);

        // количество потомков выделенного объекта
        int GO_child_count = GO.transform.childCount;

        // нахождение необходимого физического материала из готовых наборов
        UnityEngine.Object[] PMs = GameObject.FindObjectsOfTypeIncludingAssets(typeof(PhysicMaterial));
        PhysicMaterial cablePM = null;
        for (int i = 0; i < PMs.Length; i++)
            if (((PhysicMaterial)(PMs[i])).name == "CableMaterial")
            {
                cablePM = (PhysicMaterial)(PMs[i]);
                break;
            }

        // конфигурирование объектов-потомков (создание компонент)
        for (int i = 0; i < GO_child_count; i++)
        {
            GameObject GO_child = GO.transform.GetChild(i).gameObject; // текущий потомок

            SphereCollider compSC = (SphereCollider)(GO_child.AddComponent("SphereCollider"));
            compSC.radius = 0.03f;
            compSC.material = cablePM;

            ConfigurableJoint compCJ = (ConfigurableJoint)(GO_child.AddComponent("ConfigurableJoint"));

            compCJ.anchor = new Vector3(0f, 0f, 0f);
            compCJ.axis = new Vector3(1f, 0f, 0f);

            compCJ.angularXMotion = ConfigurableJointMotion.Free;
            compCJ.angularYMotion = ConfigurableJointMotion.Locked;
            compCJ.angularZMotion = ConfigurableJointMotion.Free;

            compCJ.xMotion = ConfigurableJointMotion.Locked;
            compCJ.yMotion = ConfigurableJointMotion.Locked;
            compCJ.zMotion = ConfigurableJointMotion.Locked;

            compCJ.projectionMode = JointProjectionMode.PositionAndRotation;
            compCJ.projectionDistance = 0f;
            compCJ.projectionAngle = 0f;

            compCJ.configuredInWorldSpace = true;

            Rigidbody compRB = (Rigidbody)(GO_child.GetComponent("Rigidbody"));

            compRB.useGravity = true;
            compRB.mass = 5f;
            compRB.drag = 1f;
            compRB.angularDrag = 2f;
        }

       
        // конфигурирование объектов-потомков (создание связей)

        Rigidbody compRB_prev = (Rigidbody)(GO.transform.GetChild(0).gameObject.GetComponent("Rigidbody"));

        for (int i = 1; i < GO_child_count; i++)
        {
            GameObject GO_child = GO.transform.GetChild(i).gameObject; // текущий потомок

            ConfigurableJoint compCJ = (ConfigurableJoint)(GO_child.GetComponent("ConfigurableJoint"));

            compCJ.connectedBody = compRB_prev;

            compRB_prev = (Rigidbody)(GO_child.GetComponent("Rigidbody"));
        }
    }

    [MenuItem("Macros/DestroyCableProperties")]
    public static void DestroyCable()
    {
        // выделенный в редакторе объект
        GameObject GO = (GameObject)(Selection.objects[0]);

        // количество потомков выделенного объекта
        int GO_child_count = GO.transform.childCount;

        // удаление связей в точках соединений
        for (int i = 0; i < GO_child_count; i++)
        {
            GameObject GO_child = GO.transform.GetChild(i).gameObject; // текущий потомок

            ((ConfigurableJoint)(GO_child.GetComponent("ConfigurableJoint"))).connectedBody = null;
        }

        // удаление компонент
        for (int i = 0; i < GO_child_count; i++)
        {
            GameObject GO_child = GO.transform.GetChild(i).gameObject; // текущий потомок
           
            GameObject.DestroyImmediate(GO_child.GetComponent("SphereCollider"));

            GameObject.DestroyImmediate(GO_child.GetComponent("ConfigurableJoint"));

            GameObject.DestroyImmediate(GO_child.GetComponent("Rigidbody"));
        }
    }
}
Mr_Anderson
UNIт
 
Сообщения: 143
Зарегистрирован: 16 апр 2009, 13:32

Re: Моделирование веревок, тросов и т.п.

Сообщение Neodrop 19 май 2009, 08:40

Тросы и цепи мне тоже оч понадобятся в будущем. С удовольствием бы поглядел, но совсем нет времени в ближайшие дни.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Моделирование веревок, тросов и т.п.

Сообщение Mr_Anderson 27 май 2009, 13:18

Физика в юнити продолжает трахать мозг :(((( (или может я ваще затупил???)... залил проект-пример
ftp://ftp.unity3d.ru/Upload/RopeSimulation.zip

Там очень простой пример глючной веревки из капсул с Rigidbody, CapsuleCollider и ConfigurableJoint.
Вообще эксперименты показали, что цепь подвижных ConfigurableJoint невозможно закрепить за оба конца при использовании гравитации так чтобы можно было делать натянутые веревки... один из концов обязательно срывает и получается расколбас :((( На официальном форуме тоже есть подобные обсуждения с ConfigurableJoint, но ничего конструктивного :(((

Ссылка на пару схожих тем на официальном форуме юнити:
http://forum.unity3d.com/viewtopic.php? ... light=rope
http://forum.unity3d.com/viewtopic.php? ... light=rope
Mr_Anderson
UNIт
 
Сообщения: 143
Зарегистрирован: 16 апр 2009, 13:32

Re: Моделирование веревок, тросов и т.п.

Сообщение Neodrop 30 май 2009, 13:28

Немедленно добавьте описание к архиву, иначе он будет удалён с ФТП.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Моделирование веревок, тросов и т.п.

Сообщение Neodrop 03 июн 2009, 04:08



Вот тут есть код для XNA, реализующий эти цепи. Передрать его, думаю не составит большого труда, так как это тоже C#

http://www.ziggyware.com/readarticle.php?article_id=229

Попробуйте. Я бы сделал сам, но нет просто ни минуты свободной. :-?
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Моделирование веревок, тросов и т.п.

Сообщение Mr_Anderson 04 июн 2009, 12:52

Спасибо за ссылку ;) Тока пока не хочется уходить дальше физики Юнити, ибо нужна не просто цепочка (веревка, канат), а талевая система с кучей блоков :(
Есть тема на форуме nVidia
http://developer.nvidia.com/forums/inde ... topic=2707
там, например, с тензорами инерции твердых тел рекомендуют поиграться... пробовали, помогло... но все равно есть косяки с джоинтами ;) срывает джоинты, сцуко, как ни настраивай :(
в самом крайнем случае будем писать свою физику для таких задач...
Кстати, еще проблема с прохождением сквозь коллайдеры всплывает... есть на вики-ресурсе решение, я его в шарп передрал... работает, но когда трос из 2000 капсул тормоза ацкие ): копаем дальше, короче...
Mr_Anderson
UNIт
 
Сообщения: 143
Зарегистрирован: 16 апр 2009, 13:32

Re: Моделирование веревок, тросов и т.п.

Сообщение Neodrop 04 июн 2009, 13:34

В виду того, что хардварная поддержка физики не реализована пока, тормоза будут всегда при таком количестве, единовременно подверженных физике, объектов.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

След.

Вернуться в PhysX

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11