Ограничение вращения двухмерного объекта (решено)
|
|
CUbeB | Дата: Пятница, 20 Мая 2022, 19:13 | Сообщение # 1 |
частый гость
Сейчас нет на сайте
| Привет! Пытаюсь решить следующую задачу - У меня есть объект игрока, а у игрока есть голова, которая вращается в сторону мыши. Мне нужно как-то ограничить вращение головы, чтобы она могла вращаться только в диапазоне от -30 градусов до 30. Я попытался ограничить вращение с помощью следующего кода:
Код float headLook = Mathf.Rad2Deg * Mathf.Atan2(mousePosition.y - head.transform.position.y, mousePosition.x - head.transform.position.x); head.transform.eulerAngles = new Vector3(0, 0, Mathf.Clamp(headLook, -30, 30));
В принципе это работает, но только до тех пор, пока голова смотрит вправо. Если повернуть ее влево, то есть завести мышку за спину игроку, то все ломается и голова по непонятной причине застревает, то на -30, то на 30 градусах.
Помогите, буду очень признателен
Да да, на аватарке моя старая игра...
Сообщение отредактировал CUbeB - Суббота, 21 Мая 2022, 14:00 |
|
| |
drcrack | Дата: Пятница, 20 Мая 2022, 20:17 | Сообщение # 2 |
старожил
Сейчас нет на сайте
| Попробуй вместо Clamp сделать так: Mathf.MoveTowardsAngle(0, headLook, 30)
|
|
| |
CUbeB | Дата: Пятница, 20 Мая 2022, 21:39 | Сообщение # 3 |
частый гость
Сейчас нет на сайте
| Результат точно такой же(
Да да, на аватарке моя старая игра...
|
|
| |
Spring | Дата: Суббота, 21 Мая 2022, 02:06 | Сообщение # 4 |
частый гость
Сейчас нет на сайте
| Может так?
Код if (mousePosition.x - head.transform.position.x > 0) float headLook = Mathf.Rad2Deg * Mathf.Atan2(mousePosition.y - head.transform.position.y, mousePosition.x - head.transform.position.x); else float headLook = Mathf.Rad2Deg * Mathf.Atan2(head.transform.position.y - mousePosition.y, head.transform.position.x - mousePosition.x); head.transform.eulerAngles = new Vector3(0, 0, Mathf.Clamp(headLook, -30, 30));
Сообщение отредактировал Spring - Суббота, 21 Мая 2022, 02:06 |
|
| |
IlyaKos | Дата: Суббота, 21 Мая 2022, 08:06 | Сообщение # 5 |
участник
Сейчас нет на сайте
| Приводи к локальному ротейшну.
|
|
| |
CUbeB | Дата: Суббота, 21 Мая 2022, 13:59 | Сообщение # 6 |
частый гость
Сейчас нет на сайте
| В результате я пришел к тому, что нужно ограничивать не угол вращения головы, а вектор, в сторону которого она смотрит. Все на костылях, но суть ясна:
Код lookDirection = new Vector3(mousePosition.x - head.transform.position.x, mousePosition.y - head.transform.position.y, 0).normalized; lookDirectionClamped = new Vector3(lookDirection.x, Mathf.Clamp(lookDirection.y, -clampValue, clampValue), 0);
if (mousePosition.x - head.transform.position.x < 0) { head.transform.eulerAngles = new Vector3(0, 0, -lookDirectionClamped.y * 40); }else { head.transform.eulerAngles = new Vector3(0, 0, lookDirectionClamped.y * 40); }
Да да, на аватарке моя старая игра...
Сообщение отредактировал CUbeB - Суббота, 21 Мая 2022, 14:00 |
|
| |