передача bounds между плоскими объектами (Решено)

Программирование на Юнити.

передача bounds между плоскими объектами (Решено)

Сообщение ][@FF 05 апр 2011, 21:05

Доброго дня уважаемые.
Столкнулся с такой задачей, необходимо узнать размеры объекта (ОБ1) в сцене и изменить размеры другого объекта(ОБ2) в зависимости от размеров первого(ОБ1)

Кусочки кода = )

Синтаксис:
Используется csharp
using UnityEngine;
using System;
using System.Collections;

public class MC : MonoBehaviour
{
    GameObject MOI;
    GameObject YG;

/*при запуске ищу объекты в сцене над которыми будут производиться действия
MOI - ГУИ текст для отображения полученного значения размера
YG - рамка (объемный объект сцены, а не ГУИ текстура) которая будет появляться вокруг объекта при наведении мыши
*/

     void Start ()
     {
             MOI= GameObject.Find("MOI");
             YG= GameObject.Find("newRamka");
     }

     void OnMouseEnter()
     {
              YG.transform.localScale = new Vector3 (?,?,?);
              MOI.guiText.text = this.collider.bounds.size.x + "";
     }
}


По идее за место new Vector3 (?,?,?); должны стоять некоторые размеры полученные посредством collider.bounds.size.(xyz) или renderer.bounds.size.(xyz), но при выводе в гуи текст я понял что эти значения слишком малы для YG.transform.localScale, если эти значения в сцене равны (1,1,1) то Bounds мне выдает число аж в -9 степени

я так понял что должен быть способ сконвертировать результаты полученные в Bound для Transform, но вот как это сделать?
Спасибо за внимание. Буду рад любой оказанной посильной помощи по данному вопросу.
Последний раз редактировалось ][@FF 08 апр 2011, 16:28, всего редактировалось 2 раз(а).
Аватара пользователя
][@FF
UNIт
 
Сообщения: 62
Зарегистрирован: 24 фев 2011, 20:02
  • ICQ

Re: перевод bounds (размеров объекта)

Сообщение Neyl 05 апр 2011, 21:32

Конвертировать ничего не надо. Все правильно делаете. Сейчас попробовал ваш скрипт с небольшими изменениями
Синтаксис:
Используется csharp
void OnMouseEnter()
     {

              YG.transform.localScale = this.collider.bounds.size;
              MOI.guiText.text = this.collider.bounds.size.ToString() + "";

     }


и размеры отображаются корректно, в метрах. Для модели электропогрузчика получилось значение (1.5, 2.8, 5.4) , стандартный примитив куб соответственно изменил свои размеры.

Возможно, проблема у вас с самой моделью.
Аватара пользователя
Neyl
UNIверсал
 
Сообщения: 404
Зарегистрирован: 20 июн 2010, 10:17

передача bounds (размеры объекта) между плоскими объектами

Сообщение ][@FF 05 апр 2011, 22:17

Спасибо большое, вы правы, проблема была в объекте, не сразу понял это.

Задача была в том чтобы при наведении на картину у нее появлялась рамка, как вы наверно уже поняли картина представляет собой плоский объект (plane), почему то bounds не корректно работает с плоскими объектами (наверно из-за Z координаты, хоть в трансформе и написано 0 на самом деле это не 0 это число очень к нему близкое) а когда мы пытаемся таким образом переприсвоить значение новому объекту то он уже считает что это 0 и плоский объект становится совсем плоскими именно толщиной абсолютного 0. Хотя я могу и ошибаться, но это мое мнение, буду рад если его кто либо опровергнет и доступно разъяснит сию проблему с плоскими объектами и bounds.

к слову если брать координаты от объемного объекта и присваивать плоскому то все замечательно выходит.
Аватара пользователя
][@FF
UNIт
 
Сообщения: 62
Зарегистрирован: 24 фев 2011, 20:02
  • ICQ

Re: передача bounds (размеры объекта) между плоскими объектами

Сообщение ][@FF 08 апр 2011, 16:27

И так, я был прав, вся проблема в том что в мировых координатах толщина плоского объекта практически 0, дабы использовать Bounds всего лишь нужно сделать проверку на эту самую толщину, НО на это проблемы не закончились, Bounds считает размеры в глобальных координатах, загвоздка здесь будет заключаться в том что если объект повернуть на другой угол то размеры сразу же становятся другими, этот момент тоже не сложно исправить достаточно развернуть объект в 0 (то есть чтобы все ейлеровы углы были равны 0) а после просчета размеров вернуть объекту его углы поворота, опять же следует обратить внимание на саму модель (сам столкнулся) перед экспортом модели настоятельно рекомендую проверить удалена ли история, и правильно ли расположены наши два объекта относительно друг друга (в необходимом нам положении их ейлеровы углы должны быть идентичны, так же если у нас будет происходить "наложение плоских объектов" их центры должны совпадать), ну и возможны некоторые траблы с масштабом при передачи размерности между плоскими объектами.
и так сам код

Синтаксис:
Используется csharp
using UnityEngine;
using System;
using System.Collections;

public class MS: MonoBehaviour
{
    GameObject YellowGlow;


        // Use this for initialization
        void Start ()
        {
         YellowGlow = GameObject.Find("YellowGlowPlane");// наша рамка
        }
       
        // Update is called once per frame
        void Update ()
    {
        if (Input.GetKeyUp(KeyCode.Escape))
        {
            MuseimObjectInfo.transform.position = new Vector3(-0.7f, 0.7f, 0);
            MuseimObjectInfo.guiText.fontSize = 12;
        }
        }

    void OnMouseEnter()
    {
        float k = 0f;
// проверка на то что хотя бы один из эйлеровых углов не равен "0", (в моем случае как минимум один из углов не равен "0", потому что объект повернуть на 90 градусов в "вертикальное положение")
        if ((this.transform.localEulerAngles.x != 0) || (this.transform.localEulerAngles.y != 0) || (this.transform.localEulerAngles.z != 0))
        {
            float tempRotationX = this.transform.localEulerAngles.x;
            float tempRotationY = this.transform.localEulerAngles.y;
            float tempRotationZ = this.transform.localEulerAngles.z;
//поворачиваем объект до нулевых ейлеровых углов, чтоб "правильно" узнать размеры объекта
            this.transform.eulerAngles = new Vector3((this.transform.localEulerAngles.x - tempRotationX), (this.transform.localEulerAngles.y - tempRotationY), (this.transform.localEulerAngles.z - tempRotationZ));

// проверка на "толщину" плоского объекта, если толщина меньше самого маленького то перенесем не "0" как того хотел Bounty а "1", остальные размерности такие как у объекта, "k" - коэффициент увеличения рамки, чтобы она не накладывалась на объект, а была чуть больше
            if (this.collider.bounds.size.x <= 0.0001)
            {
                k = 140f;
                YellowGlow.transform.localScale = new Vector3(1f, k * this.collider.bounds.size.y, k * this.collider.bounds.size.z);
            }
            if (this.collider.bounds.size.y <= 0.0001)
            {
                k = 140f;
                YellowGlow.transform.localScale = new Vector3(k * this.collider.bounds.size.x, 1f, k * this.collider.bounds.size.z);
            }
            if (this.collider.bounds.size.z <= 0.0001)
            {
                k = 140f;
                YellowGlow.transform.localScale = new Vector3(k * this.collider.bounds.size.x, k * this.collider.bounds.size.y, 1f);
            }
//возврат объекту первоначального угла поворота
            this.transform.eulerAngles = new Vector3(tempRotationX, tempRotationY, tempRotationZ);
        }
//перенос рамки в центр нашего объекта и поворот на тот же самый угол что и у объекта
        YellowGlow.transform.position = new Vector3(this.transform.position.x, this.transform.position.y, this.transform.position.z);
        YellowGlow.transform.eulerAngles = new Vector3(this.transform.eulerAngles.x, this.transform.eulerAngles.y, this.transform.eulerAngles.z);
    }

//возврат рамки в нулевые координат с нулевым поворотом и скейлом при "уводе" (слово не правильное но другое в голову не лезет) мыши от объекта
    void OnMouseExit()
    {
        YellowGlow.transform.position = new Vector3(0f, 0f, 0f);
        YellowGlow.transform.eulerAngles = new Vector3(0f, 0f, 0f);
        YellowGlow.transform.localScale = new Vector3(0f, 0f, 0f);
    }
}


Собсна вот, если у вас объект сцены имеет начальные координаты 0 то код нужно будет чуток подправить, но думаю тут уж все сами разберетесь.
Последний раз редактировалось ][@FF 08 апр 2011, 22:47, всего редактировалось 1 раз.
Аватара пользователя
][@FF
UNIт
 
Сообщения: 62
Зарегистрирован: 24 фев 2011, 20:02
  • ICQ

Re: передача bounds между плоскими объектами (Решено)

Сообщение Zaicheg 08 апр 2011, 16:39

Используйте теги форматирования кода в форме заполнения ответа, либо pastebin-сервисы.
Дьяченко Роман
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 между плоскими объектами (Решено)

Сообщение ][@FF 08 апр 2011, 22:48

простите, торопился забыл, исправил = )
Аватара пользователя
][@FF
UNIт
 
Сообщения: 62
Зарегистрирован: 24 фев 2011, 20:02
  • ICQ


Вернуться в Скрипты

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

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