Управление камерой. Кватернионы.

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Управление камерой. Кватернионы.

Сообщение Furgon 08 окт 2012, 13:11

Добрый день.
Мне необходимо камерой следить за объектом, который вращается вокруг сферы. Центр сферы это начало глобальных координат.
Позицию камеры я по Update выставляю так, что камера располагается в том же направление, что и объект относительно начала координат, но дальше от центра сферы.
Далее мне каждый кадр необходимо выставлять угол поворота камеры, чтобы она смотрела на объект.
Сначала я использовал для этого функцию LookAt(), но возникла проблема с установкой угла поворота камеры вокруг оси камеры z.
Я решил разобраться в использовании кватернионов, для более гибкого управления камерой.
В конструкторе Quaternion необходимо указать 4 параметра. Я решил, что первые 3 параметра задают трехмерный вектор, 4 параметр задает угол поворота вокруг оси этого вектора. Таким образом, чтобы камера смотрела в центр глобальный координат задаю следующее значение:
Синтаксис:
Используется csharp
Camera.main.transform.rotation = new Quaternion(Camera.main.transform.position.x, -Camera.main.transform.position.y, -Camera.main.transform.position.z, 0);

Не получаю ожидаемого результата. Сразу возник вопрос, совпадает ли ось куда смотрит камера с вектором который я задаю в конструкторе кватерниона? Если нет, как вести необходимую поправку?
Никогда раньше не работал с 3d, поэтому если где-то жестоко ошибаюсь, прошу проявить терпение и поправить.
Furgon
UNец
 
Сообщения: 13
Зарегистрирован: 27 авг 2012, 18:44

Re: Управление камерой. Кватернионы.

Сообщение Angel 07 08 окт 2012, 17:47

Неправильно, так делать нельзя. Надо ответить на вопрос: что такое кватернион и что значат у него четыре компоненты. После этого стараться работать с кватернионами не на прямую, редактируя их компоненты, а через специальные функции.
_ttp://shekn.deviantart.com/
Аватара пользователя
Angel 07
UNIверсал
 
Сообщения: 367
Зарегистрирован: 02 окт 2010, 18:58

Re: Управление камерой. Кватернионы.

Сообщение Furgon 08 окт 2012, 18:42

Кватернион - система гиперкомплексных чисел)) Используется как удобное математическое представления положения и вращения объектов.
Прочитав про них, решил, что первые три аргумента конструктора представляет вектор в пространстве, четвертый аргумент представляет собой величину поворота объекта по этому вектору. Таким образом мы с помощью кватерниона мы можем однозначно задать положение объекта в пространстве. Если я ошибаюсь, пожалуйста меня поправьте.
Не понимаю как направить камеру в нужное мне направление и использованием кватернионов. Функция FromToRotation также не дела желаемого результата. Вот так использовал
Синтаксис:
Используется csharp
Camera.main.transform.rotation = Quaternion.FromToRotation(Camera.main.transform.position, Vector3.zero);

Вижу, что где то кардинально ошибаюсь в использование сего инструмента.
Furgon
UNец
 
Сообщения: 13
Зарегистрирован: 27 авг 2012, 18:44

Re: Управление камерой. Кватернионы.

Сообщение bomberest 08 окт 2012, 19:03

transform.LookAt();
Основы Unity3D Свой 2D-движок Фильм для разработчиков Кастомизация едитора
Лекции игрового программирования
Skype: Andrewf56 | Steam: bomberest (-AnF-) | Vk: _https://vk.com/andrewshut
Аватара пользователя
bomberest
Старожил
 
Сообщения: 538
Зарегистрирован: 22 июн 2011, 14:38
Откуда: Минск
  • ICQ

Re: Управление камерой. Кватернионы.

Сообщение Angel 07 08 окт 2012, 20:35

Посмотри еще, как кватернион a+b*i+c*j+d*k задает положение объекта в пространстве. Без всяких домыслов, а точно.
_ttp://shekn.deviantart.com/
Аватара пользователя
Angel 07
UNIверсал
 
Сообщения: 367
Зарегистрирован: 02 окт 2010, 18:58

Re: Управление камерой. Кватернионы.

Сообщение Furgon 09 окт 2012, 19:24

bomberest, я изначально написал, что LookAt не подходит.
Angel 07, цитата из документации unity3D:
Description
Constructs new Quaternion with given x,y,z,w components.

Получилось развернуть камеру на объект таким образом (gameObject - объект на который хочу повернуть камеру):
Синтаксис:
Используется csharp
Vector3 relativePos = gameObject.transform.position - Camera.main.transform.position;
Camera.main.transform.rotation = Quaternion.LookRotation(relativePos);

Непонятно осталось для чего второй аргумент функции Quaternion.LookRotation. Его изменения вращали камеру вокруг оси однонаправленной с тем куда "смотрит" камера. Почему тогда второй аргумент также Vector3?

Объясните еще, пожалуйста, почему при прохождение камеры через позицию, когда z = 0, камера смотря в туже точку делает оборот вокруг локальной оси z на 180 градусов? Как избавиться от этого эффекта?
Furgon
UNец
 
Сообщения: 13
Зарегистрирован: 27 авг 2012, 18:44

Re: Управление камерой. Кватернионы.

Сообщение seaman 09 окт 2012, 19:50

Непонятно осталось для чего второй аргумент функции Quaternion.LookRotation

А мануал почитать слабо?
with the the head upwards along upwards

Второй аргумент - это вектор "Вверх".
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Управление камерой. Кватернионы.

Сообщение Furgon 10 окт 2012, 12:01

seaman писал(а):А мануал почитать слабо?

Прошу с подобными сообщениями лучше не писать в тему,лучше промолчать, раз нет желания подсказать.
Если спрашиваю, значит прочитав мануал мне осталось непонятно как положение камеры "верх" задается вектором.
Furgon
UNец
 
Сообщения: 13
Зарегистрирован: 27 авг 2012, 18:44

Re: Управление камерой. Кватернионы.

Сообщение Kann 10 окт 2012, 13:23

Furgon писал(а):Если спрашиваю, значит прочитав мануал мне осталось непонятно как положение камеры "верх" задается вектором.

изучаем, просвещаемся...
http://habrahabr.ru/post/131931/
Kann
Старожил
 
Сообщения: 553
Зарегистрирован: 05 ноя 2009, 14:06

Re: Управление камерой. Кватернионы.

Сообщение Angel 07 10 окт 2012, 13:48

Ссылка на хабр вообще смешная. Там автор такой, как дошел до кватернионов, говорит: "Я их не понимаю, посему извиняйте."

На гейм-деве было несколько статей про кватернионы и про то, как они задают вращение. Если уж прозрачные намеки не понятны.
_ttp://shekn.deviantart.com/
Аватара пользователя
Angel 07
UNIверсал
 
Сообщения: 367
Зарегистрирован: 02 окт 2010, 18:58

Re: Управление камерой. Кватернионы.

Сообщение Kann 10 окт 2012, 15:28

Angel 07 писал(а):Ссылка на хабр вообще смешная. Там автор такой, как дошел до кватернионов, говорит: "Я их не понимаю, посему извиняйте."

а кватернионы тут не причем собственно, это матричные операции, и в ссылке вполне нормально они описаны, сама реализация Quaternion.LookRotation вытекает из функции D3DXMatrixLookAtRH
Синтаксис:
Используется csharp
D3DXMATRIX* D3DXMatrixLookAtRH(
        D3DXMATRIX* pOut,
        CONST D3DXVECTOR3* pEye,
        CONST D3DXVECTOR3* pAt,
        CONST D3DXVECTOR3* pUp
);

Синтаксис:
Используется csharp
public static Quaternion LookRotation(Vector3 Pos, Vector3 Target, Vector3 upDirection)
        {
            Matrix4 m = CreateLookAt(Pos, Target, upDirection);

            Vector3 forward = Pos; Vector3 up = upDirection;
            Orthonormalize(up, forward);

         
            Quaternion ret;
            ret.w = Sqrt(1.0f + m.m00 + m.m11 + m.m22) * 0.5f;
            float w4_recip = 1.0f / (4.0f * ret.w);
            ret.x = (m.m21 - m.m12) * w4_recip;
            ret.y = (m.m02 - m.m20) * w4_recip;
            ret.z = (m.m10 - m.m01) * w4_recip;



            return ret;
        }

где CreateLookAt и есть D3DXMatrixLookAtRH
Kann
Старожил
 
Сообщения: 553
Зарегистрирован: 05 ноя 2009, 14:06

Re: Управление камерой. Кватернионы.

Сообщение seaman 10 окт 2012, 15:58

мне осталось непонятно как положение камеры "верх" задается вектором

А Вам вообще понятно что такое вектор? Это - направление!. Ну и как задать направление "вверх" вектором? Просто определить вектор!
Если Вы не понимаете что такое вектор - Вам лучше почитать что-то по математике.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Управление камерой. Кватернионы.

Сообщение Furgon 12 окт 2012, 12:30

seaman, понимаю, что такое вектор.
Kann, спасибо за ссылку.
Осталась проблема с прохождением камеры через оси координат.
Так задаю направление камеры, т.е. у меня она всегда смотри в центр сферы (Земли), вокруг, которой вращается.
Синтаксис:
Используется csharp
Camera.main.transform.rotation = Quaternion.LookRotation(Physics.gravity) * rotator.transform.rotation;

rotator это gameObject по которому расчитываю угол поворота камеры вокруг оптической оси.
Проблема заключается в том, что при прохождение камеры в координатах где, Physics.gravity становится коллинеарным с вектором указывающим направление камеры "вверх" (второй аргумент LookRotation), происходит разворот камеры на 180 градусов.
Как выбрать вектор указывающий верх камеры, чтобы такой проблемы не было? Судя из теоремы о причесывании ежа http://ru.wikipedia.org/wiki/%D2%E5%EE% ... _%E5%E6%E0 , такого вектора нет))
Видимо сам подход решения задачи не верен. Подскажите решение, чтобы не было указанной мной проблемы.
Furgon
UNец
 
Сообщения: 13
Зарегистрирован: 27 авг 2012, 18:44

Re: Управление камерой. Кватернионы.

Сообщение Angel 07 12 окт 2012, 15:16

А ты что же, не хочешь, чтобы камера разворачивалась на 180 градусов? Наоборот это хорошо. Вот смотришь ты такой на землю сбоку и начинаешь перемещать камеру к северному полюсу, постепенно начиная смотреть сверху, а потом идешь дальше, и теперь у тебя земля показывается вверх ногами. А так при поаороте на 180 градусов при прохождении вертикальной точки все правильно - верх всегда верхом остается.
_ttp://shekn.deviantart.com/
Аватара пользователя
Angel 07
UNIверсал
 
Сообщения: 367
Зарегистрирован: 02 окт 2010, 18:58

Re: Управление камерой. Кватернионы.

Сообщение Furgon 16 окт 2012, 11:03

Angel 07, потому что мне нужно чтобы не разворачивалась камера.
Никак не решу задачу, хотя думаю, что все просто должно быть.
Еще раз попробую разъяснить проблему.
Необходимо камерой следить за объектом, вращающемся вокруг сферы. Значение угла камеры вокруг оси z камеры необходимо "считывать" с другого объекта. Проблема заключается в том, что в пересечение осей координат камера разворачивается на 180 градусов.
Пример 1:
Синтаксис:
Используется csharp
Camera.main.transform.rotation = Quaternion.LookRotation(Physics.gravity) * rotator.transform.rotation;

где rotator объект с которого необходимо считать угол камеры вокруг оси z камеры.
В таком случае при пересечении объектом оси z, камера разворачивается, особенно это заметно при пересечении оси z в координате, где x близко к 0, z соответственно близко к радиусу сферы, наблюдается на обоих "полюсах". В лог вывожу значение угла камеры, оно верное.
Пример 2:
Синтаксис:
Используется csharp
Camera.main.transform.rotation = Quaternion.FromToRotation(Vector3.forward, Physics.gravity) * rotator.transform.rotation

аналогичная ситуация, но уже при пересечении оси x в координатах близких y = 0, z = радиусу сферы, причем на противоположном полюсе, когда z = -радиус сферы данного разворота нет.
Так как избавится от этих вращений?
У вас нет доступа для просмотра вложений в этом сообщении.
Furgon
UNец
 
Сообщения: 13
Зарегистрирован: 27 авг 2012, 18:44

След.

Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 28