Плавное перемещение камеры через множество точек(Решено)

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

Плавное перемещение камеры через множество точек(Решено)

Сообщение ][@FF 01 май 2011, 20:24

Доброго дня.
Знаю что данная тема уже открывалась,
viewtopic.php?f=5&t=1624
но в процессе упрощения кода (в топике выше, было описано как перемещать объект плавно, но приходилось постоянно дублировать код, я захотел сделать это через цикл) у меня возникла странная ситуация. в чем странность объясню в описании кода.

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

public class Excursion : MonoBehaviour
{
    public GUIStyle ExcursionStyle;//стиль окна и кнопки
    float ExcursionWindowX;
    float ExcursionWindowY;
    public GUIStyle ExcursionBtnStyle;
    bool ExcursionBool;
   
    GameObject MainCamGG; //камера ГГ, ее и будем двигать
    GameObject GOText1234567; // создал GUIText для проверки, где была "странность"
    string ThisRoom;//значение комнаты, в рассмотренном случае =1

    int NumMark;//размер массивов с точками, временем и ключами(bool)
    Vector3[] MarkPosition;//тички перемещения, [0]-стартовое
    float[] BetweenTime;//время необходимое для преодоление расстояния между точками
        bool[] dvi;//массив ключей
        bool dvi1, dvi2;

    float speed;//скорость выскчитывается от времени
    float oldTime = 0f;
   
    Vector3 oldPosition;
    Vector3 mPosition;

    bool OneTime;//ключ нужен для того чтобы наша камера начала свое передвижение с первой точки а не с того места где камера была на момент старта сцены
    bool somebool;
       
        void Start ()
    {
        GOText1234567 = GameObject.Find("Text1234567");

        ThisRoom = "1";
        MainCamGG = GameObject.Find("MainCam");
       
        oldTime = Time.time;
       
        OneTime = true;
        somebool = true;
        }
       
        // Update is called once per frame
        void Update ()
    {
        if (ExcursionBool)
        {
            if (ThisRoom == "1")
            {
                NumMark = 3;
                Vector3[] MarkPosition = new Vector3[NumMark]; // 3 точки
                float[] BetweenTime = new float[NumMark - 1];
                bool[] dvi = new bool[NumMark];

                MarkPosition[0] = new Vector3(32.37901f, 1.922392f, 1.876713f);//первое положение
                BetweenTime[0] = 20;
                dvi[0] = false;
                MarkPosition[1] = new Vector3(13.17782f, 1.922392f, 19.61474f);
                BetweenTime[1] = 20;
                dvi[1] = false;
                MarkPosition[2] = new Vector3(-15.90358f, 1.922392f, 12.12216f);
                BetweenTime[2] = 20;
                dvi[2] = false;

                MainCamGG.transform.position = MarkPosition[0]; //переносим камеру в первую точку

                if (OneTime)
                {
                    mPosition = oldPosition = MarkPosition[0];
                    //dvi[0] = true;
                                        dvi1 = true;
                    OneTime = false;
                }

                if (dvi1)//if (dvi[0])
                {
                    if (mPosition != MarkPosition[1])
                    {
                                                //при проверка (если заменить все dvi1 на аналогичные значения массивов dvi[0]...) эта часть кода еще выполняется
                        speed = (Time.time - oldTime) / BetweenTime[0];
                        mPosition = Vector3.Lerp(oldPosition, MarkPosition[1], speed);
                        MainCamGG.transform.position = mPosition;
                    }
                    else
                    {
                                                //эта уже нет
                        dvi1 = false;//dvi[0]=false;
                        mPosition = oldPosition = MarkPosition[1];
                        oldTime = Time.time;
                        dvi2 = true;//dvi[1]=true;
                    }
                }

                if (dvi2)//dvi[1]
                {
                    if (mPosition != MarkPosition[2])
                    {
                        speed = (Time.time - oldTime) / BetweenTime[1];
                        mPosition = Vector3.Lerp(oldPosition, MarkPosition[2], speed);
                        MainCamGG.transform.position = mPosition;
                    }
                    else
                    {
                        dvi2 = false;//dvi[1]=false;
                        ExcursionBool = false;
                    }
                }
            }
        }
        }

    void OnGUI()
    {
        GUI.Window(9, new Rect(0, 0, ExcursionWindowX, ExcursionWindowY), ExcursionWindow, "", ExcursionStyle);// Экскурсия по комнате
    }
   
    void ExcursionWindow(int windowID)
    {
        GUI.BringWindowToFront(9);
        ExcursionWindowX = 59;
        ExcursionWindowY = 49;

        if (GUI.Button(new Rect(0, 0, ExcursionWindowX, ExcursionWindowY), "", ExcursionBtnStyle))//
        {
            ExcursionBool = true;
        }
    }
}


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

Re: Плавное перемещение камеры через множество точек

Сообщение Order 01 май 2011, 20:43

Что то не очень понятно, что хотите добиться и зачем ключи.

Делал перемещение камеры, лерпом по массиву векторов, все нормально работает.

Есть предложение, сделать класс чекпоинтов или точек пути, в котором будут координаты, ключи и что пожелаете. Из него сделать массив точек пути.

Использовать как ВекторЛерп(точка[текущий индекс],точка[текуший индекс +1]) с проверкой (текущий индекс +1) < размеру массива , или существования точки.

Или ввести еще две переменных класса Точки для текущей и будущей точки.

С ткущей точки можно достать ключи..

Еще со скоростью... нужно рассчитывать скорость движения с учетом расстояния между точками.
Добавить rusorder в Skype , _juc4you@mail.ru ;
Платные консультации, программирование ваших проектов Unity3d,C#,IOS,Android.
Скрытый текст:
_ttp://www.youtube.com/watch?v=1m2qTnatSjM&list=UUjcKNvONEUHCILG7QrX1NFg
Order
Старожил
 
Сообщения: 805
Зарегистрирован: 21 фев 2010, 10:34

Re: Плавное перемещение камеры через множество точек

Сообщение Neodrop 01 май 2011, 20:44

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

Re: Плавное перемещение камеры через множество точек

Сообщение ][@FF 01 май 2011, 21:03

Neodrop, спасибо. Разберусь отпишу решение. Это скорее всего то что нужно.

Order, я хочу вогнать все это в цикл, чтобы не дублировать код.

Синтаксис:
Используется csharp
         
          while (somebool)
                {
                    if (dvi[i]==true)
                    {
                        if (mPosition != MarkPosition[i + 1])
                        {
                            speed = (Time.time - oldTime) / BetweenTime[i];
                            mPosition = Vector3.Lerp(oldPosition, MarkPosition[i + 1], speed);
                            MainCamGG.transform.position = mPosition;
                        }
                        else
                        {
                            //if (i + 1 == NumMark)
                            if (i != NumMark-1)
                            {
                                dvi[i] = false;
                                mPosition = oldPosition = MarkPosition[i + 1];
                                oldTime = Time.time;
                                dvi[i + 1] = true;
                            }
                            else
                            {
                                dvi[i] = false;
                                ExcursionBool = false;
                                somebool = false;
                            }
                        }
                    }
                }

Именно когда я попытался заменить dvi1 и dvi2 на dvi[0], dvi[1], код перестал работать, с момента где я указал в посте выше. Попробуйте поменять у себя простые dvi1 на массивные dvi[0], если код перестанет работать возможно вы поймете что я имел ввиду, если останется рабочим сообщите мне пожалуйста. Не исключено что ошибка где то у меня закралась.

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

Re: Плавное перемещение камеры через множество точек

Сообщение Neodrop 01 май 2011, 21:35

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

Re: Плавное перемещение камеры через множество точек

Сообщение ][@FF 02 май 2011, 12:00

И таак. Предложение Neodrop'а оказалось просто великолепным, так я узнал о сим великом инструменте (Antares), создание кривой (кривые безье) не единственный плюс сего детища (Neodrop'а и остальных из его команды), кому интересно прочитаете сами.
Необходимые ссылки
1) http://www.unity3d.ru/ANTARES/AntaresBrowser_rus.pdf
Прежде чем что то качать нужно почитать что для чего и какие возможности предоставляет.
2) http://shop.unity3d.ru/index.php/en/en/ ... le/18.html
мы почитали нам понравилось, решили скачать
3)в пдф файле
http://www.unity3d.ru/ANTARES/AntaresBrowser_rus.pdf
в разделе
ДИНАМИЧЕСКОЕ СОЗДАНИЕ И РЕДАКТИРОВАНИЕ КРИВЫХ.
качаем "Скачать Демо-проект" (у меня сам проект не запустился, но я и так разобрался)
так же можете сразу просмотреть демку, в ней по кривой движется кубик
4) дополнительная информация
http://www.unity3d.ru/distribution/view ... &sk=t&sd=a (у нас)
http://forum.unity3d.com/threads/47696- ... pen-Source)-1.5.5-Coming-soon?highlight=Antares (с офф форума)
рекомендую просмотреть все видео которые есть ну и почитать тоже лишним не будет

и так вот мы сделали все необходимые пункты
теперь создаем новый проект (кто хочет может сразу в основном)
(устанавливаем Наш Антарес, все что ниже есть в пдф файле)
жмем Assets → Import Package
ищем скачанный ранее нами файлик AntaresBrowserAndAddon(номер версии).unitypackage
жмем ок и применить, ждем пока установится, после успешной установки, а вашем проекте (в окне проекта) появятся несколько новых папок с файлами (ошибок с установкой быть не должно)
после этого
"Наведите курсор на любую команду в верхней строке. На пример — на Assets. Окно Редактора обновится и вы увидите новый элемент Antares"

создание кривой, прежде чем ее создать необходимо создать поверхность (она может быть не обязательно прямой, может иметь даже неровные выступы и впадины, трещинки), я создал плейн (простую плоскую поверхность)
далее
"Чтобы содать Кривую, выбираем Antares → Curve → Create Curve"
"В окне Hierarchy появится новый объект Curve"
(можете его переименовать, не суть = ))
"В Инспекторе этого объекта мы увидим :" Интересную менюшку, не буду вдаваться в описание, жмем "Create Points by Mouse Click" (создание точки по нажатии ЛКМ по всей поверхности (плейну в моем случае)), создаем кривую на нашей поверхности, если необходимо чтобы угол был более острым, тыкайте практически в одном месте побольше раз (старайтесь делать все с первого раза, добавлять точки в середину кривой "кажется нельзя").
Вот мы создали путь приподнимите всю кривую над плоскостью на высоту вашей камеры/головы(ГГ - главный герой)

далее ищем файлик с демкой (у меня он назывался на этот момент MoveOnCurve_26_05_10.rar) из нее нам понадобится всего лишь один скрипт написанный Neodrop'ом (при желании можете переделать, там не сложно разобраться: "все гениальное просто, не все простое гениально" = )) и таак скрипт открываем архив открываем папку Assets->DemoScripts и в ней мы видим MoveOnCurve.cs
копируем этот скрипт в нашу сцену
откройте с помощью любого удобного вам редактора и за комментируйте следующие строчки (логотип антареса)

/*public Texture antaresTexture;
void OnGUI()
{
GUIStyle.none.Draw(new Rect(0, 0, 120, 124), new GUIContent(antaresTexture), true, true, true, true);
}*/

теперь вешаем наш скрипт на нужный объект (в нашем случае камера)
теперь у камеры добавляем Curve (перетаскиваем из окна иерархии нашу кривую)
поиграете с настройками если захотите, можно менять скорость количество контрольных точек и тд, сами разберетесь.

Запускаем, мы видим что камера движется по кривой (Но при этом на самой камере еще нет ни контроллера ни скриптов управления движением и вращением)

когда вы добавите элементы управления камерой (следите за высотой курвы)
+ необходимо будет включать/выключать скрипты либо управления либо движения по кривой

go(некий Game Object).GetComponent<MoveOnCurve>().enabled = false;
или как в нашем случае скрипты находятся на камере
Camera.main.GetComponent<MoveOnCurve>().enabled = false; //этим мы отключаем действие скрипта движения камеры по кривой

Вот. Вроде все описал. Если что то забыл спрашивайте дополняйте = ) И не забудьте сказать спасибо Neodrop'у и группе разработчиков.
Аватара пользователя
][@FF
UNIт
 
Сообщения: 62
Зарегистрирован: 24 фев 2011, 20:02
  • ICQ

Re: Плавное перемещение камеры через множество точек(Решено)

Сообщение Neodrop 02 май 2011, 19:59

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


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

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

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