ограничить поворот

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

ограничить поворот

Сообщение allash 07 авг 2012, 12:02

всем привет. помогите пожалуйста с таким вопросом:
есть скрипт пушки которая поворачивается вслед за камерой, т.е. куда камера, туда и пушка. Как можно ограничить поворот пушки от -90 до 90 градусов?

Синтаксис:
Используется csharp
        public float speed;
        public Transform cannon;
        public int mainCameraCurrentRot;
        private Quaternion zeroRot;
       
        void Start()
        {
                zeroRot = cannon.rotation;
        }
       
        void LateUpdate()
        {
                mainCameraCurrentRot = (int)mainCamera.transform.eulerAngles.y;
                cannon.rotation = Quaternion.Slerp(cannon.rotation, zeroRot*Quaternion.AngleAxis(mainCameraCurrentRot, Vector3.forward), speed * Time.deltaTime);                
        }

 
allash
UNец
 
Сообщения: 46
Зарегистрирован: 15 ноя 2011, 22:38

Re: ограничить поворот

Сообщение Receptor 07 авг 2012, 12:08

Например так:

Синтаксис:
Используется csharp
if (mainCamera.transform.eulerAngles.y < 90 || mainCamera.transform.eulerAngles.y > 270){ // Или можно заюзать localEulerAngles
//поворачиваться
}
 


Или такое условие:
Синтаксис:
Используется csharp
if (Mathf.Abs(mainCamera.transform.eulerAngles.y) < 90)
 


Но я не уверен.
_VK.com
Аватара пользователя
Receptor
Адепт
 
Сообщения: 1706
Зарегистрирован: 22 ноя 2011, 07:09
Откуда: Волгодонск

Re: ограничить поворот

Сообщение Multirezonator 07 авг 2012, 12:31

Думаю так должно сработать
Синтаксис:
Используется csharp
public float speed;
   public Transform cannon;
   //public int mainCameraCurrentRot;
   private Quaternion zeroRot;
   private float maxAngle=90f;
       
   void Start()
   {
        zeroRot = cannon.rotation;
   }
       
        void LateUpdate()
        {
//              mainCameraCurrentRot = (int)mainCamera.transform.eulerAngles.y;
//            cannon.rotation = Quaternion.Slerp(cannon.rotation, zeroRot*Quaternion.AngleAxis(mainCameraCurrentRot, Vector3.forward), speed * Time.deltaTime);                
                Quaternion camRot=Camera.main.transform.rotation;
                //---- смотрим какой угол между камерой и начальной позицией пушки
                float angle=Quaternion.Angle(zeroRot, camRot);
                //---- поворот на камеру с учетом макс угла поворота
                camRot=Quaternion.Slerp(zeroRot, camRot, maxAngle/angle);
                //---- теперь поворот пушки
                cannon.rotation=Quaternion.Slerp(cannon.rotation, camRot, speed * Time.deltaTime);
        }
 
Скрытый текст:



Аватара пользователя
Multirezonator
UNITрон
 
Сообщения: 248
Зарегистрирован: 15 фев 2010, 16:12
Откуда: Украина, Луганск
  • Сайт

Re: ограничить поворот

Сообщение allash 07 авг 2012, 12:54

Спасибо за ответы. В первом варианте условие работает когда стоит прямо, а когда например поворачиваешь сам объект влево на 90 градусов, то работает так как бы стоял прямо, то есть ограничение уже от 0 до 180. Как сделать ограничение, чтобы когда поворачиваешь сам объект, условие работало для любого положения?
allash
UNец
 
Сообщения: 46
Зарегистрирован: 15 ноя 2011, 22:38

Re: ограничить поворот

Сообщение Левш@ 07 авг 2012, 15:56

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

Re: ограничить поворот

Сообщение allash 07 авг 2012, 16:40

Левш@ писал(а):Попробуйте вместо transform.eulerAngles.y - написать transform.localEulerAngles.y
Надеюсь пушка дочерняя ?

пушка дочерняя, но не работает всё равно так как надо, 90 градусов ещё ограничивает, а от 0 до -270 нет

Синтаксис:
Используется csharp
        public float speed;
        public Transform cannon;
        public int mainCameraCurrentRot;
        private Quaternion zeroRot;
       
        void Start()
        {
                zeroRot = cannon.rotation;
        }
       
        void LateUpdate()
        {
                mainCameraCurrentRot = (int)mainCamera.transform.eulerAngles.y;
                cannon.rotation = Quaternion.Slerp(cannon.rotation, zeroRot*Quaternion.AngleAxis(mainCameraCurrentRot, Vector3.forward), speed * Time.deltaTime);    
cannon.transform.localEulerAngles = new Vector3(cannon.transform.localEulerAngles.x, Mathf.Clamp(cannon.transform.localEulerAngles.y, -270, 90),cannon.transform.localEulerAngles.z);          
        }

 
 


пробовал так, тоже не выходит правильно
allash
UNец
 
Сообщения: 46
Зарегистрирован: 15 ноя 2011, 22:38

Re: ограничить поворот

Сообщение pod4444 07 авг 2012, 17:05

Синтаксис:
Используется csharp
                if(temp.y > rightLimit && temp.x < 180)
                   temp.y = maxTilt;
                if (temp.y < 360 - leftLimit && temp.y > 180)
                    temp.y = minTilt;
 


кусок из моих скриптов, должен работать.
temp - это localRotation.eulerAngles, после всех изменение он присваивается пушке.
Аватара пользователя
pod4444
Старожил
 
Сообщения: 721
Зарегистрирован: 20 янв 2012, 22:02
Откуда: Воронеж
Skype: pod4444
  • Сайт


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

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

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