Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
3 / 3 / 4
Регистрация: 21.07.2015
Сообщений: 51
1

Движение камеры вокруг точки

22.03.2016, 11:23. Показов 3617. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток!

Перемещаю камеру вокруг точки, которую вычисляю через RayCasting. Если между точкой и камерой появляется обьект - перемещаю камеру в точку пересечения другого луча, который выходит из точки в сторону камеры.

Проблема: Если первая точка лежит на поверхности сферы(Point), то скрипт выполняется корректно, однако если обе точки лежат на терраине то второй вектор не вычисляет пересечение с террайном.

Помогите поправить!

Иерархия:
Terrain
GameObject
-Camera
Point

Скрипт вешаю на камеру.

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
    private Vector3 point;
    private Camera _camera;
    private GameObject _nullObject;
 
    void Start () {
        _camera = GetComponent<Camera>();
        
        _nullObject = transform.parent.gameObject;
        //point = GameObject.Find ("Point").transform.position;
    }
    
    void Update () {
        
        if (Input.GetMouseButtonDown (1)) {
            Ray ray = _camera.ScreenPointToRay (Input.mousePosition);
            RaycastHit hit;
            if (Physics.Raycast (ray, out hit))
                point = hit.point;
        }
 
        if (Input.GetMouseButton (1)) {
            _nullObject.transform.RotateAround (point, Vector3.down, Input.GetAxis ("Mouse X"));
            _nullObject.transform.RotateAround (point, _nullObject.transform.right, -Input.GetAxis ("Mouse Y"));
 
            Ray ray = new Ray (point, _nullObject.transform.position - point);
 
            RaycastHit hit;
            if (Physics.Raycast (ray, out hit) && Vector3.Distance(point,hit.point)<Vector3.Distance(point,_nullObject.transform.position)) {
                transform.position = hit.point;
            } else
                transform.position = _nullObject.transform.position;
        }
    }


Добавлено через 18 часов 20 минут
Как оказалось, луч пересекает только ту область террайна, расстояние до которой меньше чем 1. Всё еще незнаю, как с этим бороться.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.03.2016, 11:23
Ответы с готовыми решениями:

Движение камеры вокруг объекта с используя стрелоки. Плавная остановка вращения
Нужно сделать движение камеры на стрелках вокруг объекта, например куба, разумеется, что фокус...

Движение камеры
Добрый вечер! Подскажите как лучше сделать... Я делаю инициализацию разных объектов в позиции...

Движение камеры
Есть сцена, есть пару кнопок и обьекты. Помогите написать код на движение вперед и назад! Вот...

Движение камеры мышкой
Хочу сделать управление камерой как в шутерах, но что то не так... У меня камера при движени мышкой...

10
753 / 600 / 204
Регистрация: 06.08.2015
Сообщений: 2,432
22.03.2016, 23:28 2
Если камера дочерняя к этому го, то смысл её перемещать? При сдвиге го камера автоматически сдвинется вместе с ним. Отвяжите камеру от го тогда и кодом задавайте положение камеры.
0
3 / 3 / 4
Регистрация: 21.07.2015
Сообщений: 51
22.03.2016, 23:33  [ТС] 3
Cr0c, Камера распологается на отрезке "точка вращения-го". С помощью го я задаю максимальное расстояние от точки вращения и поворот.
0
753 / 600 / 204
Регистрация: 06.08.2015
Сообщений: 2,432
22.03.2016, 23:43 4
Prizrak9, подозреваю, что надо добавить флаг нажатия кнопки и объединить всё под одним условием.
0
3 / 3 / 4
Регистрация: 21.07.2015
Сообщений: 51
22.03.2016, 23:47  [ТС] 5
Cr0c, в шапке есть код под спойлером. Вы его смотрели? Ведь и так объединил. Или нужно как то иначе?
0
753 / 600 / 204
Регистрация: 06.08.2015
Сообщений: 2,432
22.03.2016, 23:59 6
Prizrak9,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
    private Vector3 point;
    private Camera _camera;
    private GameObject _nullObject;
    private bool _isRMB = false;
 
    void Start () {
        _camera = GetComponent<Camera>();
        
        _nullObject = transform.parent.gameObject;
        //point = GameObject.Find ("Point").transform.position;
    }
    
    void Update () {
        
        if (!Input.GetMouseButton (1) && _isRMB) _isRMB = false;
 
        if (Input.GetMouseButton (1)) {
            if (!_isRMB) {
              _isRMB = true;
              Ray ray = _camera.ScreenPointToRay (Input.mousePosition);
              RaycastHit hit;
              if (Physics.Raycast (ray, out hit))
                 point = hit.point;
            } else {
            _nullObject.transform.RotateAround (point, Vector3.down, Input.GetAxis ("Mouse X"));
            _nullObject.transform.RotateAround (point, _nullObject.transform.right, -Input.GetAxis ("Mouse Y"));
 
            Ray ray = new Ray (point, _nullObject.transform.position - point);
 
            RaycastHit hit;
            if (Physics.Raycast (ray, out hit) && Vector3.Distance(point,hit.point)<Vector3.Distance(point,_nullObject.transform.position)) {
                transform.position = hit.point;
            } else
                transform.position = _nullObject.transform.position;
         }
      }
    }
0
3 / 3 / 4
Регистрация: 21.07.2015
Сообщений: 51
23.03.2016, 00:16  [ТС] 7
Cr0c, Результат тот же.
0
753 / 600 / 204
Регистрация: 06.08.2015
Сообщений: 2,432
23.03.2016, 00:34 8
Prizrak9, отрисуйте дебагом все рейкасты, код нормальный.
0
3 / 3 / 4
Регистрация: 21.07.2015
Сообщений: 51
23.03.2016, 00:51  [ТС] 9
Cr0c, Это как?

Добавлено через 15 минут
Я использовал RaycastAll и выводил в консоль координаты точек. Попадают только точки других объектов или та точка, вокруг которой я вращаюсь либо какие-то неадекватные точки.
0
753 / 600 / 204
Регистрация: 06.08.2015
Сообщений: 2,432
23.03.2016, 09:53 10
Лучший ответ Сообщение было отмечено Prizrak9 как решение

Решение

Prizrak9, Debug.DrawLine

Добавлено через 45 секунд
Точку вращения пробовали приподнимать чуть-чуть?
1
3 / 3 / 4
Регистрация: 21.07.2015
Сообщений: 51
23.03.2016, 11:05  [ТС] 11
Цитата Сообщение от Cr0c Посмотреть сообщение
Точку вращения пробовали приподнимать чуть-чуть?
Нет, не пробывал, но это сработало!
Мне нравится такое решение)
0
23.03.2016, 11:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.03.2016, 11:05
Помогаю со студенческими работами здесь

Движение относительно камеры
Есть код движения камеры с клавиатуры if (Input.GetKey(KeyCode.W)) this.transform.position +=...

Движение до края камеры
Добрый день! Такая проблема как проверить прикосновение к левому и правому краю камеры. Если объект...

Движение камеры с небольшим отставанием
и снова драсте :) моя камера двигается за моим ГГ вот так private void LateUpdate() { ...

Движение камеры вслед за объектом
Ребята привет. Есть скрипт движения камеры с помощью мышки по X Y Z + вращение, прям как в...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru