Форум программистов, компьютерный форум, киберфорум
Наши страницы
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
Yarun
0 / 0 / 0
Регистрация: 08.01.2018
Сообщений: 23
1

Ограничение вращения камеры при использовании функции Transform.RotateAround

16.06.2018, 14:01. Просмотров 2163. Ответов 14
Метки нет (Все метки)

Здравствуйте! Я не могу разобраться как ограничить вращения камеры при использовании функции Transform.RotateAround. Я пытался использовать метод Mathf.Clamp, но у меня не вышло. Вот мой код:

C#
1
2
3
4
float turnSpeed = 25f;
float xCameraRot = Input.GetAxis("Mouse Y") * turnSpeed;
xCameraRot = Mathf.Clamp(xCameraRot, 0f, 70f);
camera.transform.RotateAround(player.transform.position, new Vector2(xCameraRot, 0), xCameraRot * Time.deltaTime);
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.06.2018, 14:01
Ответы с готовыми решениями:

При использовании transform: rotate() появляется отступ
Добрый вечер. При использовании transform: rotate(-90deg), появляется отступ, как его убрать? ...

Существует ли ограничение при использовании new?
Здравствуйте. Ситуация: Я создала класс, описание которого ниже, и хочу выделить память под массив...

Ограничение трафика при использовании мобильного Интернет
Доброго всем форумчанам времени суток! Проблема: Последнее время интересует вопрос ограничения...

Ограничение скорости передачи данных при использовании сокетов.
Требуется передавать большие объемы данных от сервера клиенту (коих одновременно может быть...

Настройка камеры USB PC Camera (SN9C120), драйвер установился, но при использовании возникает темный экран.
Мне тоже помогите с настройкой камеры , драйвер установился но при использовании возникает темный...

14
Cr0c
709 / 566 / 192
Регистрация: 06.08.2015
Сообщений: 2,379
Завершенные тесты: 2
16.06.2018, 14:05 2
Конечно не выйдет, ограничиваешь же ввод, а не поворот. Надо через кватернионы делать.

Добавлено через 33 секунды
Или угол к Vector3.up считать и разрешать наклон
0
Yarun
0 / 0 / 0
Регистрация: 08.01.2018
Сообщений: 23
16.06.2018, 15:45  [ТС] 3
А какой функционал использовать из кватернионов?
0
Cr0c
709 / 566 / 192
Регистрация: 06.08.2015
Сообщений: 2,379
Завершенные тесты: 2
16.06.2018, 17:37 4
Yarun, зависит от задачи
0
16.06.2018, 17:37
Yarun
0 / 0 / 0
Регистрация: 08.01.2018
Сообщений: 23
16.06.2018, 17:48  [ТС] 5
Мне нужно крутить камеру вокруг объекта по оси X, но только если camera.transform.rotation.x не больше чем 70 и не меньше чем 0 градусов.
0
Cr0c
709 / 566 / 192
Регистрация: 06.08.2015
Сообщений: 2,379
Завершенные тесты: 2
16.06.2018, 20:23 6
Это можно и без кватерниона, в принципе. Локальные камеры, повернуть вектор от ввода, выставить на XZ плоскость и посчитать угол к forward. Если больше (180-угол) - поворачивать. Или локальные камеры сравнивать с forward через Vector3.Project и смотреть на результат (диапазон [-1; -0.35], вроде).
0
Yarun
0 / 0 / 0
Регистрация: 08.01.2018
Сообщений: 23
17.06.2018, 01:24  [ТС] 7
Цитата Сообщение от Cr0c Посмотреть сообщение
Локальные камеры, повернуть вектор от ввода, выставить на XZ плоскость и посчитать угол к forward
Извини за мое непонимание, но я, собственно, немного не понял, что вы имели ввиду
0
Cr0c
709 / 566 / 192
Регистрация: 06.08.2015
Сообщений: 2,379
Завершенные тесты: 2
17.06.2018, 09:59 8
Типа этого
P.S.: фото не загрузилось ((

Добавлено через 13 минут
Что-то вроде этого:
C#
1
2
3
4
5
6
Vector3 v1 = obj.transform.forward;
Vector3 v2 = obj.transform.position - camera.transform.position;
v2 = Quaternion.Euler(0f, -Input.GetAxis("Mouse X"), 0f) * v2;
float angle = 180f - Vector3.Angle(v1, v2);
if (angle < 70f)
 RotateCamera(Input.GetAxis("Mouse X"));
0
Yarun
0 / 0 / 0
Регистрация: 08.01.2018
Сообщений: 23
17.06.2018, 16:25  [ТС] 9
Я дико извиняюсь, так как я ошибся. Я не правильно трактовал свою проблему. Мне надо ограничивать перемещение камеры вокруг игрока, используя Input.GetAxis("Mouse Y"), а не Input.GetAxis("Mouse X"). Наверное моя главная ошибка было в том, что я пытался просто ограничивать camera.transfrom.ROTATION.x, но мне надо так же ограничивать и camera.transform.POSITION.y + camera.transform.POSITION.z, так как метод RotateAround - не просто вращает объект, как метод Rotate, он еще и перемещает объект, а это гораздо осложняет дело

Цитата Сообщение от Yarun Посмотреть сообщение
Мне нужно крутить камеру вокруг объекта по оси X, но только если camera.transform.rotation.x не больше чем 70 и не меньше чем 0 градусов.
Надеюсь вы меня поняли..

Добавлено через 4 минуты
C#
1
2
3
4
5
6
7
8
9
10
float yCameraRot = Input.GetAxis("Mouse X");
float turnSpeed = 25f;
        if (yCameraRot > 0)
        {
            camera.transform.RotateAround(transform.position, new Vector2(0f, yCameraRot), turnSpeed * yCameraRot * Time.deltaTime);
        }
        else
        {
            camera.transform.RotateAround(transform.position, new Vector2(0f, -yCameraRot), turnSpeed * yCameraRot * Time.deltaTime);
        }
Вот этот мой корявый код работает. Но в данном случае - я просто вращаю вокруг игрока камеру и ничего не ограничиваю.

P.S. Не судите строго мой код =)
0
Cr0c
709 / 566 / 192
Регистрация: 06.08.2015
Сообщений: 2,379
Завершенные тесты: 2
17.06.2018, 16:36 10
Лучший ответ Сообщение было отмечено Yarun как решение

Решение

Я ставил пустышку, в неё камеру, сдвигал камеру назад по Z и крутил пустышку. Так удобнее и проще.

Добавлено через 1 минуту
yCameraRot и так со знаком - зачем проверять на ">0"? )))

Добавлено через 3 минуты
Можно сделать просто
C#
1
2
3
4
float angle = Vector3.Angle(obj.transform.up, cam.transform.forward);
float my = Input.GetAxis("Mouse Y") * sensitivity;
if (angle > 20f && my > 0f) || (angle < 160f && my < 0f)
 RotateCamera(my);
1
Yarun
0 / 0 / 0
Регистрация: 08.01.2018
Сообщений: 23
17.06.2018, 19:39  [ТС] 11
Цитата Сообщение от Cr0c Посмотреть сообщение
yCameraRot и так со знаком - зачем проверять на ">0"? )))
Ну так разве метод Input.GetAxis не возвращает значение [-1;1]?

Цитата Сообщение от Cr0c Посмотреть сообщение
obj
Это объект во круг которого мы крутим камеру?

Цитата Сообщение от Cr0c Посмотреть сообщение
RotateCamera(my);
Я так понимаю, этот метод просто пример? Вместо него можно использовать процедуру RotateAround?

Добавлено через 1 час 46 минут
Цитата Сообщение от Yarun Посмотреть сообщение
yCameraRot и так со знаком - зачем проверять на ">0"? )))
Ну так разве метод Input.GetAxis не возвращает значение [-1;1]?
Ошибку понял)
0
Cr0c
709 / 566 / 192
Регистрация: 06.08.2015
Сообщений: 2,379
Завершенные тесты: 2
18.06.2018, 00:56 12
Цитата Сообщение от Yarun Посмотреть сообщение
Это объект во круг которого мы крутим камеру?
Да
Цитата Сообщение от Yarun Посмотреть сообщение
Я так понимаю, этот метод просто пример? Вместо него можно использовать процедуру RotateAround?
Да
0
Yarun
0 / 0 / 0
Регистрация: 08.01.2018
Сообщений: 23
18.06.2018, 22:25  [ТС] 13
Хорошо. А можно сказать, что метод Vector3.Angle возвращает угол между осями "from" и "to"?
0
Cr0c
709 / 566 / 192
Регистрация: 06.08.2015
Сообщений: 2,379
Завершенные тесты: 2
18.06.2018, 22:53 14
Yarun, https://docs.unity3d.com/ScriptReference/Vector3.Angle.html

Добавлено через 18 секунд
Уже в справку лень посмотреть?
0
Yarun
0 / 0 / 0
Регистрация: 08.01.2018
Сообщений: 23
19.06.2018, 01:36  [ТС] 15
В общем спасибо, помогли.
0
19.06.2018, 01:36
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.06.2018, 01:36

Ошибка при вызове функции transform с функцией, в качестве аргумента
Здравствуйте! Хочу перевести строку в нижний\верхний регистр, используя готовые алгоритмы. ...

Блокировка вращения камеры
Хочу создать игру с невесомостью. Хочу реализовать вращение на 360 градусов по Y(Чтобы можно было...

Ограничение вращения колеса мыши
Доброе время суток! Как бы в продолжение вчерашней темы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru