Как ограничить поворот?
|
|
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 |
почетный гость
Сейчас нет на сайте
| И правда хороший
|
|
| |