Непонятные баги с поворотами...

Общие вопросы о Unity3D

Непонятные баги с поворотами...

Сообщение Левш@ 16 мар 2012, 22:58

Есть обьект, на нем висит предположим стандартный mouseLook включены обе оси вращение X & Y.
Ограничение поворота на обоих осях снято ( -360, 360 и -360, 360 по осям X & Y).
Если мышью повернуть обьекту Vector3.forward вертикально вверх или вниз строго на 90гр наблюдаем интересную картину - в таком положении он отказываеться вращаться по другой оси... а на близких углах к 90 резко сужаеться диапазон поворота.
Если повернуть обьект дальше до 180гр (вверх ногами) поворот по горизонтали вообще реверситься (начинает работать наоборот).
:-? Если вторая проблема решима, можно менять по условию полярность градусов, то первую никак решить не удаеться... :-w
Нужен поворот через голову (мертвая петля) но так чтоб сохранить горизонтальную маневренность поворота.
Есть идеи как тут выкрутиться? 3 дня вожусь уже, все методы перепробовал, результат нулевой, мертвая точка и все тут.
Код такой:
Синтаксис:
Используется javascript
var plrKurs : Transform;
var rotSpeed : int = 5;
var snstvX : float = 1.0;
var snstvY : float = 1.0;
var minX : float = -360.0;
var maxX : float = 360.0;
var minY : float = -360.0;
var maxY : float = 360.0;
private var rotX : float = 0.0;
private var rotY : float = 0.0;
private var rotZ : float = 0.0;
   
function Update () {
        rotX += Input.GetAxis("Mouse X") * snstvX;
        rotY += Input.GetAxis("Mouse Y") * snstvY;
        plrKurs.rotation = Quaternion.AngleAxis (rotX, Vector3.up);
        plrKurs.rotation *= Quaternion.AngleAxis (rotY, Vector3.left);
        transform.rotation = Quaternion.Slerp (transform.rotation, plrKurs.rotation, rotSpeed * Time.deltaTime);
    if (rotX < -360)
        rotX += 360;
    else if (rotX > 360)
        rotX -= 360;
    if (rotY < -360)
        rotY += 360;
    else if (rotY > 360)
        rotY -= 360;
        rotX = Mathf.Clamp (rotX, minX, maxX);
        rotY = Mathf.Clamp (rotY, minY, maxY);
}


Дема, посмотреть:

Скрытый текст:
HTML код для вашего блога :
Код: Выделить всё
<script language='javascript' type="text/javascript"> document.write("<iframe marginheight='0' src='http://unity3d.ru/distribution/player.php?url=http://dl.dropbox.com/u/22496904/Test.unity3d&w=400&h=400&t=false&preview=1' height='"+(400+30)+"' width='400' frameborder='0' scrolling='no'></iframe>"); </script>
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

Re: Непонятные баги с поворотами...

Сообщение seaman 16 мар 2012, 23:13

Попробуйте проще:
Синтаксис:
Используется csharp
        rotX += Input.GetAxis("Mouse X") * snstvX;
        rotY += Input.GetAxis("Mouse Y") * snstvY;
        transform.rotation = Quaternion.Slerp (transform.rotation, Quaternion.Euler(rotY, rotX, 0), rotSpeed * Time.deltaTime);
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Непонятные баги с поворотами...

Сообщение Левш@ 16 мар 2012, 23:16

Попробуйте проще:

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

Re: Непонятные баги с поворотами...

Сообщение seaman 16 мар 2012, 23:20

Вторая проблема остается, а вот первой я вроде не вижу. Т.е. в вертикальном положении можно крутить по другим осям.
ЗЫ: голова уже не варит, но мне кажется можно как то все это обойти. Завтра подумаю.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Непонятные баги с поворотами...

Сообщение Левш@ 16 мар 2012, 23:25

Там сложно поймать эту точку, но она есть ровно на 90гр. Либо вообще не крутит, либо вместо поворота вокруг ветикальной оси в штопор загоняет.
Но повернуть так же полноценно как и в нуле по вертикале не удастся. А это не дело...

Вторая проблема остается

Вторая не столь важна потому что решима, сделать реверс не проблема, а вот первая это жесткий, нерешимый баг! :-w Тут обходной маневр нужен, а я исчерпал свои идеи... надеюсь кто подкинет идею как решить.
В 2.5 пока не сменили систему вращения этот момент нормально работал.
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

Re: Непонятные баги с поворотами...

Сообщение Syberex 17 мар 2012, 00:01

Не это ли есть та самая проблема углов Эйлера с блокировкой оси? :-\
Ты вроде как как-раз последовательно применяешь вращение к объекту ...
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: Непонятные баги с поворотами...

Сообщение Левш@ 17 мар 2012, 00:23

Не это ли есть та самая проблема углов Эйлера с блокировкой оси?

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

Re: Непонятные баги с поворотами...

Сообщение Syberex 17 мар 2012, 00:45

Не знаю :D
... углы Эйлера страдают от так называемой фиксации оси,
из-за которой объект перестает вращаться так, как от него этого ждут, в зависимости
от последовательности вращений
.


Попробовать поставить ограничение на 90 градусов или изменить принцип задания кватерниона по моему :)
Аватара пользователя
Syberex
Адепт
 
Сообщения: 2292
Зарегистрирован: 14 янв 2011, 20:35
Откуда: Кострома
  • Сайт

Re: Непонятные баги с поворотами...

Сообщение waruiyume 17 мар 2012, 04:49

Можно попробовать как-нибудь так:
Синтаксис:
Используется csharp
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
    private float force;

    public float speed;

    public Vector3 rotSpeedMult = new Vector3(5f, 5f, 10f);

    public float rotSpeedMax = 45f;

    private Quaternion newRotation;

    private Vector3 inpDamp;
       
    void Start()
    {
        Screen.lockCursor = !Screen.lockCursor;
    }

        void Update ()
        {
            inpDamp += new Vector3(

                -Input.GetAxis("Mouse Y")*rotSpeedMult.x*Time.deltaTime,

                Input.GetAxis("Mouse X")*rotSpeedMult.y*Time.deltaTime,

                -Input.GetAxis("Horizontal")*rotSpeedMult.z*Time.deltaTime);

        inpDamp.x = Mathf.Clamp(inpDamp.x, -180f, 180f);
        inpDamp.y = Mathf.Clamp(inpDamp.y, -180f, 180f);
        inpDamp.z = Mathf.Clamp(inpDamp.z, -180f, 180f);


            newRotation = Quaternion.Euler(inpDamp);

            transform.rotation = Quaternion.RotateTowards(transform.rotation, transform.rotation*newRotation,
                                                          rotSpeedMax*Time.deltaTime);
            inpDamp = Vector3.Lerp(inpDamp,Vector3.zero,3f*Time.deltaTime);

            force = Input.GetAxis("Vertical");

        if(Input.GetKeyDown(KeyCode.F1))
            Screen.lockCursor = !Screen.lockCursor;
        }

    void FixedUpdate()
    {
        rigidbody.AddRelativeForce(Vector3.forward*(force*speed),ForceMode.Acceleration);
    }
}
 
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Непонятные баги с поворотами...

Сообщение Левш@ 17 мар 2012, 13:46

waruiyume, спасибо огромное! :)
Вся глупость ситуации в том, что я вдобавок ко всему еще пытался удержать горизонт в нуле.
Щас допер, что полноценно поворачивать и так чтоб крена к горизонту не было, невозможно. :D
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

Re: Непонятные баги с поворотами...

Сообщение Kann 17 мар 2012, 16:54

можно так....
Синтаксис:
Используется csharp
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(plrKurs.rotation, transform.up), rotSpeed * Time.deltaTime);
Kann
Старожил
 
Сообщения: 553
Зарегистрирован: 05 ноя 2009, 14:06


Вернуться в Общие вопросы

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

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