Страница 1 из 3

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

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

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

СообщениеДобавлено: 05 май 2009, 18:24
Neodrop
Увы. Ничего более оптимального чем цепь джойнтов, пожалуй нет.
Можно ещё написать хитроумный скрипт, который станет обрабатывать положение точек такой веревки и создать её с помощью LineRenderer. :-? Но это ещё сложнее.
Точнее требует ловкого и хитро.опого кода.

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

СообщениеДобавлено: 05 май 2009, 18:40
gnoblin
А с костями не вариант?

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

СообщениеДобавлено: 05 май 2009, 18:46
Neodrop
Ну так я это и имею в виду. Коллидеры то к костям аттачить нужно. Как ещё то?

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

СообщениеДобавлено: 06 май 2009, 07:58
Mr_Anderson
Спасибо за ответы! :) Значит будем как обычно с кучей джоинтов...

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

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

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

СообщениеДобавлено: 14 май 2009, 07:57
Neodrop
Configurable Joint

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

СообщениеДобавлено: 14 май 2009, 08:56
Mr_Anderson
хммм.... ладно джоинты конечно покопаем, но вроде много чего пробовали

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

СообщениеДобавлено: 19 май 2009, 08:07
Mr_Anderson
Снова подниму тему... 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"));
        }
    }
}

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

СообщениеДобавлено: 19 май 2009, 08:40
Neodrop
Тросы и цепи мне тоже оч понадобятся в будущем. С удовольствием бы поглядел, но совсем нет времени в ближайшие дни.

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

СообщениеДобавлено: 27 май 2009, 13:18
Mr_Anderson
Физика в юнити продолжает трахать мозг :(((( (или может я ваще затупил???)... залил проект-пример
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

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

СообщениеДобавлено: 30 май 2009, 13:28
Neodrop
Немедленно добавьте описание к архиву, иначе он будет удалён с ФТП.

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

СообщениеДобавлено: 03 июн 2009, 04:08
Neodrop


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

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

Попробуйте. Я бы сделал сам, но нет просто ни минуты свободной. :-?

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

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

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

СообщениеДобавлено: 04 июн 2009, 13:34
Neodrop
В виду того, что хардварная поддержка физики не реализована пока, тормоза будут всегда при таком количестве, единовременно подверженных физике, объектов.