Значения параметров Quaternion

Общие вопросы о Unity3D

Значения параметров Quaternion

Сообщение BlackMamba 04 мар 2011, 03:52

Поиском ничего не нашел, прошу не пинать ногами.
Хочу получить значение угла между двумя векторами, использую Quaternion.Angle(), оно работает, значение угла считает. Но transform.rotation изменяется в 3-мерном пространстве, а мне нужно получить значение между векторами, как если бы rotation менялись в одной плоскости, в частности только в rotation.x.
Я пишу такой код:

Quaternion.Angle(Quaternion(transform.rotation.x,0,0,1), Quaternion(0,0,0,1))

Один вектор неподвижен, другой меняется в одной плоскости (по идеи).
Возвращается всегда 0, даже если написать Quaternion(transform.rotation.x,transform.rotation.y,transform.rotation.z,1). Вот у меня и встал вопрос, как через x, y, z, w построить один неподвижный вектор, а второй динамически менять в 1 плоскости (и, соответственно, измерить угол в этой плоскости).
Что значат эти x, y, z, w? Особенно w :-\ .
mail: _gdeMoiGusi@gmail.com
skype: Ellseworth
Аватара пользователя
BlackMamba
UNITрон
 
Сообщения: 305
Зарегистрирован: 06 янв 2011, 16:16
Откуда: Москва

Re: Значения параметров Quaternion

Сообщение seaman 04 мар 2011, 08:25

Квартерион - это не вектор, это ротатор.
Если тебе нужен угол между векторами, то:
Скалярным произведением двух векторов называется число, равное произведению модулей этих векторов на косинус угла между ними.

Соответственно, если ты нормализуешь вектора, умножишь их скалярно, а затем возьмешь аркосинус - получишь угол:
Синтаксис:
Используется csharp
        var a = new Vector3(0, 0, 0);
        var b = new Vector3(Time.deltaTime, 0, 0);
        var angle = Mathf.Acos(Vector3.Dot(a.normalized, b.normalized));


PS: Да, вот что значит малое время изучения АПИ :( . Ниже гораздо лучше способ...
Последний раз редактировалось seaman 04 мар 2011, 10:29, всего редактировалось 1 раз.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Значения параметров Quaternion

Сообщение DAlex 04 мар 2011, 10:14

Возвращает угол между двумя векторами (0-180).

Синтаксис:
Используется csharp
float angle = Vector3.Angle(vectorFrom, vectorTo);
Аватара пользователя
DAlex
UNец
 
Сообщения: 20
Зарегистрирован: 10 фев 2011, 00:05
  • ICQ

Re: Значения параметров Quaternion

Сообщение BlackMamba 04 мар 2011, 11:03

я, все-таки, не правильно написал, да,между двумя ротаторами.
Вектора не подходят, так как два объекта, являясь дочерними, имеют одинаковые position.
mail: _gdeMoiGusi@gmail.com
skype: Ellseworth
Аватара пользователя
BlackMamba
UNITрон
 
Сообщения: 305
Зарегистрирован: 06 янв 2011, 16:16
Откуда: Москва

Re: Значения параметров Quaternion

Сообщение seaman 04 мар 2011, 11:32

Ну я так понимаю, что x, y, z - это углы поворотов вокруг соответствующей оси.
Может проще задать напрямую угол, и уже из него делать Quaternion:
Синтаксис:
Используется javascript
// Create a rotation
var rotation = Quaternion.identity;
// Assign a rotation 30 degrees around the y axis
rotation.eulerAngles = Vector3(0, 30, 0);
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Значения параметров Quaternion

Сообщение BlackMamba 04 мар 2011, 11:40

нашел, что это за параметры:
q.x = axis.x * sin(theta/2)
q.y = axis.y * sin(theta/2)
q.z = axis.z * sin(theta/2)
q.w = cos(theta/2)
mail: _gdeMoiGusi@gmail.com
skype: Ellseworth
Аватара пользователя
BlackMamba
UNITрон
 
Сообщения: 305
Зарегистрирован: 06 янв 2011, 16:16
Откуда: Москва

Re: Значения параметров Quaternion

Сообщение seaman 04 мар 2011, 11:50

Axis - это ось вокруг которой вращаем. Theta - угол поворота вокруг этой оси.
Т.е. тебе нужно вычислить нормаль к той плоскости в которой ты собираешься вращать, задать угол поворота на который собираешься повернуть. Затем сконструировать из этого кватернион. Затем рассчитать угол, который ты уже и так задал выше...
Гораздо проще наоборот, как я написал. Хотя, если нужны повороты не вокруг одной оси координат, а вокруг произвольной оси, тогда лучше не через Эйлеровы углы, а напрямую конструировать кватернион. Но и тут ты задаешь угол поворота, а не вычисляешь его...

Скорее всего до сих пор (хотя мы уже разобрались, что не векторы нужны) задача поставлена неточно...
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Значения параметров Quaternion

Сообщение BlackMamba 04 мар 2011, 11:59

посмотрел через баг.лог, как меняется rotation - неееее, в ручную задавать quaternion - не вариант=).
mail: _gdeMoiGusi@gmail.com
skype: Ellseworth
Аватара пользователя
BlackMamba
UNITрон
 
Сообщения: 305
Зарегистрирован: 06 янв 2011, 16:16
Откуда: Москва

Re: Значения параметров Quaternion

Сообщение BlackMamba 04 мар 2011, 12:06

seaman писал(а):Скорее всего до сих пор (хотя мы уже разобрались, что не векторы нужны) задача поставлена неточно...

Ну в общем и целом ковыряю скрипты вращения камеры мышкой, чтобы лучше их понять, в данный момент хочу ограничить поворот камеры по вертикали на определенную величину, такие темы на форуме уже видел, но не разобрался, как в них код работает, вот и пробую написать по своему методу, более понятному мне, но, видимо, путь не верный, придется дальше ковырять те темы, эту можно закрывать.
mail: _gdeMoiGusi@gmail.com
skype: Ellseworth
Аватара пользователя
BlackMamba
UNITрон
 
Сообщения: 305
Зарегистрирован: 06 янв 2011, 16:16
Откуда: Москва

Re: Значения параметров Quaternion

Сообщение seaman 04 мар 2011, 12:25

Так это же просто. Ограничивай не сам поворот, а значение, которое берешь у мышки. В BootcampDemo:
Синтаксис:
Используется javascript
        function GetInput()
        {
                var a : Vector2 = soldierController.aim ? aimSpeed : speed;
                x += Mathf.Clamp(Input.GetAxis("Mouse X") * a.x, -maxSpeed.x, maxSpeed.x) * deltaTime;
                y -= Mathf.Clamp(Input.GetAxis("Mouse Y") * a.y, -maxSpeed.y, maxSpeed.y) * deltaTime;
                y = ClampAngle(y, yMinLimit, yMaxLimit);
        }
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Значения параметров Quaternion

Сообщение BlackMamba 04 мар 2011, 13:16

ну просто-то - оно просто, но писать, не понимая или не зная, как оно работает я не могу...
Mathf.Clamp - понял, что это, теперь действительно легче=)
mail: _gdeMoiGusi@gmail.com
skype: Ellseworth
Аватара пользователя
BlackMamba
UNITрон
 
Сообщения: 305
Зарегистрирован: 06 янв 2011, 16:16
Откуда: Москва


Вернуться в Общие вопросы

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10