Понедельник, 25 Ноября 2024, 05:34

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Как ограничить поворот?
GreexonДата: Четверг, 16 Октября 2014, 17:16 | Сообщение # 1
почетный гость
Сейчас нет на сайте
Здравствуйте, столкнулся с проблемой установки ограничения на поворот.
Часть скрипта, поворачивающая объект:
transform.Rotate(Vector3.forward * Input.acceleration.x * 1);
Так при наклоне устройства объект будет поворачиваться вокруг оси бесконечно, а как ограничить радиус поворота к примеру 30 градусами?
ArtanielДата: Четверг, 16 Октября 2014, 17:41 | Сообщение # 2
частый гость
Сейчас нет на сайте
Наверное просто создать переменную, в которой хранишь максимум для угла поворота, если угол стал больше максимума, то не вращаем (а лучше ставим строго на максимум), иначе вращаем.
Код

public float MaxAngle = 30;

void....
{
   if (transform.rotation.eulerAngles.z > MaxAngle){
     transform.rotation= Quaternion.Euler(0, 0, MaxAngle);
   }else{
     transform.Rotate(Vector3.forward * Input.acceleration.x * 1);  
   }
}

Както так. Возможно стоит и минимум сразу ограничить. Еще бы надо учесть случай, когда transform.rotation.eulerAngles.z перейдет через 0 вниз и станет 360 минут немного, это тоже больше максимума.
Еще в принципе для этого есть Mathf.Clamp(), позволит избавится от ифа , но как его совместить с transform.Rotate я не вижу.
GreexonДата: Четверг, 16 Октября 2014, 19:30 | Сообщение # 3
почетный гость
Сейчас нет на сайте
Странно, как только добавляю что-либо с Quaternion объект поворачивается на 270 по x и на 180 по y, хотя везде указано 0.
ArtanielДата: Четверг, 16 Октября 2014, 20:33 | Сообщение # 4
частый гость
Сейчас нет на сайте
Может статься что я перепутал оси. Отсюда плохо видно в какой ориентации объект изначально. Я предположил что он стоит по эйлерам в (0,0,0) и вращается только относительно Vector3.forward, это по идее ось z.
Попробуйте для начального значения вывести эйлеры.
Код
void Start(){
Debug.Log(
transform.eulerAngles.x,","
transform.eulerAngles.y,","
transform.eulerAngles.z
);
}

если там не (0,0,0), то и в строку
transform.rotation= Quaternion.Euler(0, 0, MaxAngle);
должно попасть то что там выведется.
GreexonДата: Четверг, 16 Октября 2014, 20:39 | Сообщение # 5
почетный гость
Сейчас нет на сайте
Объект является child, наверно это влияет.
ArtanielДата: Четверг, 16 Октября 2014, 21:54 | Сообщение # 6
частый гость
Сейчас нет на сайте
Да, должно быть связано, если parent объект подвижный - точно.
Можно попробовать заменить
transform.rotation= Quaternion.Euler(0, 0, MaxAngle);
на
transform.localRotation = Quaternion.Euler(0, 0, MaxAngle);
Ну или что там вместо нулей уже.
MANMANAДата: Четверг, 16 Октября 2014, 22:25 | Сообщение # 7
почти ветеран
Сейчас нет на сайте
Код
rotateZ += transform.Rotate(Vector3.forward * Input.acceleration.x * 1); ;
rotateZ = Mathf.Clamp (rotateZ, -90, 90);
     
transform.localEulerAngles = new Vector3(transform.localEulerAngles.x, transform.localEulerAngles.y, -rotateZ);


или

Код
transform.rotation.eulerAngles = new Vector3(Mathf.Clamp(transform.rotation.eulerAngles.x, -90, 90), transform.rotation.eulerAngles.y, transform.rotation.eulerAngles.z);


http://www.3dbuffer.com/ Текстуры, Unity3D, Blender: Эффекты, скрипты, моделирование, текстурирование, скульптинг
VKонтакте 3Dbuffer

Последнее:

Новый раздел "Текстуры"

Как запатентовать, защитить техническое решение, игру, идею


Сообщение отредактировал MANMANA - Пятница, 17 Октября 2014, 00:38
LertmindДата: Пятница, 17 Октября 2014, 00:37 | Сообщение # 8
заслуженный участник
Сейчас нет на сайте
У MANMANA хороший код, только Time.deltaTime не забудь.
GreexonДата: Пятница, 17 Октября 2014, 11:31 | Сообщение # 9
почетный гость
Сейчас нет на сайте
И правда хороший
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг