Плавный поворот камеры в скрипте слежения.

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Плавный поворот камеры в скрипте слежения.

Сообщение Skinner2170 20 ноя 2012, 09:08

Имеется скрипт ходьбы по маршруту, записанному заранее игроком. Он в общем то был найден на просторах интернета. Проблема следующая - перемещение между точками осуществляется плавно, но камера при этом не поворачивается плавно, а либо замирает в одном положении, либо показывает сначала один план и потом сразу другой. Вот кусок скрипта:


Синтаксис:
Используется csharp
    public static void StartWalk(int StartPos)
    {
        if (tmpWalk.Lst.Count > 1)
        {
            flAddWalkPlay = StartPos+1;
            Position cp = (Position)tmpWalk.Lst[StartPos];
            walkCurPos = walkOldPos = cp.Vec3();
            walkOldTime = Time.time;
            //transform.LookAt();
        }
    }
    void DoWalk()
    {
        if ((flAddWalkPlay >= 0) & (tmpWalk.Lst.Count>1))
        {
            Position cp = (Position)tmpWalk.Lst[flAddWalkPlay];
            Vector3 v3 = cp.Vec3();
            if (walkCurPos != v3)
            {
                walkSpeed = (Time.time - walkOldTime) / WalkTimeLept;
                walkCurPos = Vector3.Lerp(walkOldPos, v3, walkSpeed);
                transform.position = walkCurPos;
                //transform.LookAt(v3);
                rotator.position=v3;
                transform.rotation = Quaternion.LookRotation(v3) * rotator.transform.rotation;[/color]
            }
            else
            {
                if (flAddWalkPlay == (tmpWalk.Lst.Count - 1))
                {
                    //êîíåö äâèæåíèÿ
                    flAddWalkPlay = -1;
                    transform.LookAt(v3);
                }
                else
                {
                    StartWalk(flAddWalkPlay);

                }
            }
        }
    }
        // Update is called once per frame
        void Update () {

        DoWalk();
        foreach (char c in Input.inputString)
        {            
            // Backspace - Remove the last character
            if (c.ToString() == "\b")
            //if (c. == KeyCode.Backspace)
            //if (System.Convert.ToByte(c) == KeyCode.Backspace)
            {
                if (txtPosName.Length != 0)
                    txtPosName = txtPosName.Substring(0, txtPosName.Length - 1);
            }            
            else
            {
                if (c.ToString() == "\n")
                {                    
                }
                // Normal text input - just append to the end
                else
                {
                    txtPosName += c;
                }
            }
        }  

 


Пытался использовать кватерион(в оригинале стояло просто LookAt), но безуспешно. Подскажите пожалуйста как это можно сделать. Заранее благодарен.
Skinner2170
UNец
 
Сообщения: 8
Зарегистрирован: 08 ноя 2012, 10:46

Re: Плавный поворот камеры в скрипте слежения.

Сообщение Левш@ 20 ноя 2012, 09:15

Quaternion.Lerp
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

Re: Плавный поворот камеры в скрипте слежения.

Сообщение Skinner2170 20 ноя 2012, 10:00

А как мне по известному Vector3 найти .rotation? только сохранять его заблаговременно?

upd.
Синтаксис:
Используется csharp
public static void StartWalk(int StartPos)
    {
        if (tmpWalk.Lst.Count > 1)
        {
            flAddWalkPlay = StartPos+1;
            Position cp = (Position)tmpWalk.Lst[StartPos];
            walkCurPos = walkOldPos = cp.Vec3();
            walkOldTime = Time.time;
                        Quaternion qu1 = new Quaternion(cp.RotX, cp.RotY, cp.RotZ, cp.RotW);
                        rotator.transform.rotation=qu1;
            //transform.LookAt();
        }
    }
    void DoWalk()
    {
        if ((flAddWalkPlay >= 0) & (tmpWalk.Lst.Count>1))
        {
            Position cp = (Position)tmpWalk.Lst[flAddWalkPlay];
            Vector3 v3 = cp.Vec3();
            if (walkCurPos != v3)
            {
                walkSpeed = (Time.time - walkOldTime) / WalkTimeLept;
                walkCurPos = Vector3.Lerp(walkOldPos, v3, walkSpeed);
                transform.position = walkCurPos;
                                //rotator.position=v3;
                //transform.LookAt(v3);
                                Quaternion qu = new Quaternion(cp.RotX, cp.RotY, cp.RotZ, cp.RotW);
                                rotator1.transform.rotation=qu;
                                //transform.rotation = Quaternion.LookRotation(v3) * rotator.transform.rotation;
                               
                                transform.rotation = Quaternion.Slerp (rotator1.transform.rotation, rotator.transform.rotation, Time.time * 1);
            }
            else
            {
                if (flAddWalkPlay == (tmpWalk.Lst.Count - 1))
                {
                    //êîíåö äâèæåíèÿ
                    flAddWalkPlay = -1;
                    transform.LookAt(v3);
                }
                else
                {
                    StartWalk(flAddWalkPlay);

                }
            }
        }
    }


а нашу позицию мы получаем в cp :

Синтаксис:
Используется csharp
 public static Position FillPos()
    {
        Position cp = new Position();
        Vector3 v3 = Camera.main.transform.position;
        Quaternion q = Camera.main.transform.rotation;
        cp.LevelName = Application.loadedLevelName;
        cp.PosX = v3.x;
        cp.PosY = v3.y;
        cp.PosZ = v3.z;
        cp.RotX = q.x;
        cp.RotY = q.y;
        cp.RotZ = q.z;
        cp.RotW = q.w;
        cp.MRotX = MyMouseLook.rotationX;
        cp.MRotY = MyMouseLook.rotationY;
        //Camera.main.transform.rotation.
        cp.RotEX = Camera.main.transform.eulerAngles.x;
        cp.RotEY = Camera.main.transform.eulerAngles.y;
        cp.RotEZ = Camera.main.transform.eulerAngles.z;
        return cp;
    }


Все еще не работает :(. В каком направлении мне копать? Вроде по логике должно уже заработать, но нет.


upd1. задача частично решилась. осталось разобраться со скоростью вращения.
Skinner2170
UNец
 
Сообщения: 8
Зарегистрирован: 08 ноя 2012, 10:46


Вернуться в Почемучка

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

Сейчас этот форум просматривают: Google [Bot], Yandex [Bot] и гости: 25