Bounds дерева объектов

Лучший способ помочь другим, поделиться своими находками.

Bounds дерева объектов

Сообщение Zaicheg 11 июн 2010, 17:16

Метод от fox.
Позволяет получить Bounds для дерева объектов.
Синтаксис:
Используется csharp
public static Bounds GetBoundsOfHierarchy(GameObject go)
    {
        Vector3 center = Vector3.zero;
        Vector3 min = Vector3.zero, max = Vector3.zero;
        int count = 0;
        Bounds currB;
        Vector3 currPos;
        foreach (MeshFilter mf in go.GetComponentsInChildren<MeshFilter>())
        {
            currB = mf.sharedMesh.bounds;
            currPos = mf.transform.position;
            center += currB.center + mf.transform.position;
            min.x = Mathf.Min(min.x, currB.min.x + currPos.x);
            min.y = Mathf.Min(min.y, currB.min.y + currPos.y);
            min.z = Mathf.Min(min.z, currB.min.z + currPos.z);
            //
            max.x = Mathf.Max(max.x, currB.max.x + currPos.x);
            max.y = Mathf.Max(max.y, currB.max.y + currPos.y);
            max.z = Mathf.Max(max.z, currB.max.z + currPos.z);
            ++count;
        }
        center /= count;
        return new Bounds(center, max - min);
    }
 
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: Bounds дерева объектов

Сообщение fox 11 июн 2010, 18:17

вообщем метод преобразился до такого
Синтаксис:
Используется csharp
public static Bounds GetBoundsOfHierarchy(GameObject go)
    {
        Bounds currB = new Bounds(Vector3.zero, Vector3.zero);
        bool isInit = false;
        foreach (MeshRenderer mr in go.GetComponentsInChildren<MeshRenderer>())
        {
            if (!isInit)
            {
                currB = mr.bounds;
                isInit = true;
            }
            else
            {
                currB.Encapsulate(mr.bounds.max);
                currB.Encapsulate(mr.bounds.min);
            }
        }
        return currB;
    }
Добавить foxumkov в Skype
Мои проекты:
Turbodrive
Изображение

Изображение
Аватара пользователя
fox
UNITрон
 
Сообщения: 255
Зарегистрирован: 07 ноя 2008, 13:02
Откуда: Питер
  • ICQ

Re: Bounds дерева объектов

Сообщение Neodrop 13 июн 2010, 03:02

Синтаксис:
Используется csharp
private static void GetRenderableBoundsRecurse(ref Bounds bounds, GameObject go)
{
    MeshRenderer component = go.GetComponent<MeshRenderer>();
    MeshFilter filter = go.GetComponent<MeshFilter>();
    if (((component != null) && (filter != null)) && (filter.sharedMesh != null))
    {
        bounds.Encapsulate(component.bounds);
    }
    IEnumerator enumerator = go.transform.GetEnumerator();
    try
    {
        while (enumerator.MoveNext())
        {
            Transform current = (Transform) enumerator.Current;
            GetRenderableBoundsRecurse(ref bounds, current.gameObject);
        }
    }
    finally
    {
        IDisposable disposable = enumerator as IDisposable;
        if (disposable != null)
           disposable.Dispose();
    }
}
 
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Bounds дерева объектов

Сообщение Neodrop 14 сен 2010, 16:47

Новый, немного более универсальный вариант : http://pastebin.com/BmCb99yt


Синтаксис:
Используется csharp
 private static void GetRenderableBoundsRecurse(ref Bounds bounds, GameObject go)
    {
        MeshRenderer component = go.GetComponent<MeshRenderer>();
        MeshFilter filter = go.GetComponent<MeshFilter>();
        if (((component != null) && (filter != null)) && (filter.sharedMesh != null))
        {
            bounds.Encapsulate(component.bounds);
        }
        else
        {
            SkinnedMeshRenderer skined = go.GetComponent<SkinnedMeshRenderer>();
            if (skined != null)
                bounds.Encapsulate(skined.bounds);
        }
        IEnumerator enumerator = go.transform.GetEnumerator();
        try
        {
            while (enumerator.MoveNext())
            {
                Transform current = (Transform)enumerator.Current;
                GetRenderableBoundsRecurse(ref bounds, current.gameObject);
            }
        }
        finally
        {
            IDisposable disposable = enumerator as IDisposable;
            if (disposable != null)
                disposable.Dispose();
        }
    }
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт


Вернуться в Исходники (Копилка)

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

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