Форум программистов, компьютерный форум, киберфорум
Наши страницы
3D моделирование
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 5.00/24: Рейтинг темы: голосов - 24, средняя оценка - 5.00
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
1

Как математически зная только вектор вычислить кватернион?

20.04.2015, 22:15. Просмотров 4562. Ответов 154
Метки нет (Все метки)

Создаю направленный источник света в максе.
Свойством dir в MAXSctipt судя по справке, я получаю нормализованный вектор направления.
Также есть свойство rotation которое возвращает углы вращения в кватернионах.
По сути эти два свойства определяют одно и тоже - куда будет смотреть проектор. Изменяя одно из них, видны изменения и в другом.
Вопрос в том, как математически зная только вектор вычислить кватернион?
У меня есть записи свойств объектов на подобии SpotLight из которых известны только позиция и вектор направления. Эту информацию нужно конвертировать в другой редактор, который работает только с позицией и кватернионом.
Кароче, как из трех чисел получить четыре?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.04.2015, 22:15
Ответы с готовыми решениями:

Как отправить файл на сервер через FTP не зная имени а зная только расширение файла?
Доброго времени суток! Очень нужна ваша помощь форумчане.. Пытаюсь отправить...

Найти вектор x,зная что вектор x перпендикулярен вектору a
3)Найти вектор x,зная что вектор x перпендикулярен вектору a,a=(1;0;1),вектор x...

вычислить площадь и периметр равнобедренного треугольника зная только его катеты
задача очень лёгкая но у меня не получается))) я начинающий тока........

Как найти вектор направления тела, зная угол поворота?
Как найти вектор направления\смещения по осям тела, зная угол его поворота.

Вычислить и отнормировать вектор, полученный как произведение матрицы A на вектор B
Вычислить вектор , равный произведению матрицы А(15,15) и вектора B(b1,..b15)...

154
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
23.04.2015, 14:54  [ТС] 141
неа, не работает - вар3 не смотрит вниз
0
Fulcrum_013
1541 / 1187 / 138
Регистрация: 14.12.2014
Сообщений: 10,106
Завершенные тесты: 3
23.04.2015, 15:31 142
Лучший ответ Сообщение было отмечено Constantius24 как решение

Решение

и че там у него за значения получаются?

Добавлено через 5 минут
Обалдеть. Вот нарыл полный код преобразования матрицы в кватернион:
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
38
39
40
41
42
void MatrixToQuaternion(Quaternion * quat, float m[4][4])
{
  float  tr, s, q[4];
  int    i, j, k;
 
  int nxt[3] = {1, 2, 0};
 
  tr = m[0][0] + m[1][1] + m[2][2];
 
  if (tr > 0.0)
  {
    s = sqrt (tr + 1.0);
    quat->w = s / 2.0;
    s = 0.5 / s;
    quat->x = (m[1][2] - m[2][1]) * s;
    quat->y = (m[2][0] - m[0][2]) * s;
    quat->z = (m[0][1] - m[1][0]) * s;
  }
  else
  {
    i = 0;
    if (m[1][1] > m[0][0]) i = 1;
    if (m[2][2] > m[i][i]) i = 2;
    j = nxt[i];
    k = nxt[j];
 
    s = sqrt ((m[i][i] - (m[j][j] + m[k][k])) + 1.0);
 
    q[i] = s * 0.5;
 
    if (s != 0.0) s = 0.5 / s;
 
    q[3] = (m[j][k] - m[k][j]) * s;
    q[j] = (m[i][j] + m[j][i]) * s;
    q[k] = (m[i][k] + m[k][i]) * s;
 
    quat->x = q[0];
    quat->y = q[1];
    quat->z = q[2];
    quat->w = q[3];
  }
}
Добавлено через 1 минуту
там куча частных случаев как оказывается.
1
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
23.04.2015, 19:17  [ТС] 143
Вот это да, сейчас попробую.

Добавлено через 28 минут
Вот, что получилось, пришлось отказаться от вкусного Matrix3D в пользу двумерного массива.
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
            Vector3D xAxis = Direction;
            xAxis.Normalize();
 
            Vector3D zAxis = Vector3D.CrossProduct(Origin, xAxis);
            zAxis.Normalize();
 
            Vector3D yAxis = Vector3D.CrossProduct(zAxis, xAxis);
            yAxis.Normalize();
 
            double[,] m = new double[4,4];
 
            m[0, 0] = xAxis.X;
            m[0, 1] = yAxis.X;
            m[0, 2] = zAxis.X;
 
            m[1, 0] = xAxis.Y;
            m[1, 1] = yAxis.Y;
            m[1, 2] = zAxis.Y;
 
            m[2, 0] = xAxis.Z;
            m[2, 1] = yAxis.Z;
            m[2, 2] = zAxis.Z;
 
            m[3, 0] -= Vector3D.DotProduct(xAxis, Position);
            m[3, 1] -= Vector3D.DotProduct(yAxis, Position);
            m[3, 2] -= Vector3D.DotProduct(zAxis, Position);
            m[3, 3] = 1;
 
            Quaternion quat = new Quaternion();
 
            double tr, s;
            double[] q = new double[4];
            int i, j, k;
 
            int[] nxt = { 1, 2, 0 };
 
            tr = m[0, 0] + m[1, 1] + m[2, 2];
 
            if (tr > 0)
            {
                s = Math.Sqrt(tr + 1);
                quat.W = s / 2;
                s = 0.5 / s;
                quat.X = (m[1, 2] - m[2, 1]) * s;
                quat.Y = (m[2, 0] - m[0, 2]) * s;
                quat.Z = (m[0, 1] - m[1, 0]) * s;
            }
            else
            {
                i = 0;
                if (m[1, 1] > m[0, 0]) i = 1;
                if (m[2, 2] > m[i, i]) i = 2;
                j = nxt[i];
                k = nxt[j];
 
                s = Math.Sqrt((m[i, i] - (m[j, j] + m[k, k])) + 1);
 
                q[i] = s * 0.5;
 
                if (s != 0) s = 0.5 / s;
 
                q[3] = (m[j, k] - m[k, j]) * s;
                q[j] = (m[i, j] + m[j, i]) * s;
                q[k] = (m[i, k] + m[k, i]) * s;
 
                quat.X = q[0];
                quat.Y = q[1];
                quat.Z = q[2];
                quat.W = q[3];
            }
0
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
23.04.2015, 19:23  [ТС] 144
Значит так, получились интересные результаты:
1 - все сломалось
Как математически зная только вектор вычислить кватернион?

2 - все четко:
Как математически зная только вектор вычислить кватернион?

3 - четче некуда:
Как математически зная только вектор вычислить кватернион?
0
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
23.04.2015, 19:28  [ТС] 145
СТОП!
Как математически зная только вектор вычислить кватернион?
0
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
23.04.2015, 19:33  [ТС] 146
Я дебил.
Как же я забыл сразу сказать.
Дело вот в чем, при расположении исходных данных в моем редакторе у меня сразу возникли проблемы с расположением, а именно с вращением. Я впервые тогда столкнулся с кватернионами, и методом тыка пришел к тому, что для того, чтобы все вставало на свои места, необходимо значение W умножить на -1, т.е. -W. У меня даже в коде был написан такой метод:
C#
1
2
3
4
        static Quaternion Fix(this Quaternion quat)
        {
            return new Quaternion(quat.Axis, -quat.Angle);
        }
Вот и сейчас я его применил и все встало на свои места.
0
Fulcrum_013
1541 / 1187 / 138
Регистрация: 14.12.2014
Сообщений: 10,106
Завершенные тесты: 3
23.04.2015, 19:37 147
-1 когда появилось? Если после того как оси меняли в матрице там могла тройка поменяться а тогда все вращения в обратную сторону.

Добавлено через 1 минуту
Кстати, на какую тематику игруху делаешь?
1
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
23.04.2015, 19:53  [ТС] 148
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
-1 когда появилось? Если после того как оси меняли в матрице там могла тройка поменяться а тогда все вращения в обратную сторону.
Сразу после вычисления кватерниона меняю значение W: .GetRotation().Fix();
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Кстати, на какую тематику игруху делаешь?
Пока ни на какую, задача стоит перенести ресурсы игры в редактор. GTAIV->CRYENGINE. Потом уже можно начать, что-нибудь свое придумывать.

Добавлено через 4 минуты
Боюсь даже представить какие там частные случаи учитываются в приведенном выше коде...

Добавлено через 1 минуту
А с чем может быть связано, что приходится применять -W ?
Особенности исходных данных, точнее движка в котором они используются?
0
Fulcrum_013
1541 / 1187 / 138
Регистрация: 14.12.2014
Сообщений: 10,106
Завершенные тесты: 3
23.04.2015, 20:10 149
Другая тройка векторов. Правила буравчика помнишь? Есть левый и правый. точно так же есть левая СК и правая СК (по тому же правилу определяется). Отличия левой от правой - направление вращения в обратную сторону
1
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
23.04.2015, 20:15  [ТС] 150
Знак определяется через ориентацию базиса, и соответственно в одной среде отрицательная ориентация этого базиса, а в другой положительная. Я правильно понял?
0
Fulcrum_013
1541 / 1187 / 138
Регистрация: 14.12.2014
Сообщений: 10,106
Завершенные тесты: 3
23.04.2015, 20:20 151
Я так подозреваю проще в CAD с нуля рисовать чем модифицировать чъе, то непонятно как структурированное, и т.д.

Добавлено через 4 минуты
Цитата Сообщение от Constantius24 Посмотреть сообщение
Знак определяется через ориентацию базиса, и соответственно в одной среде отрицательная ориентация этого базиса, а в другой положительная. Я правильно понял?
Да правильно.
1
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
23.04.2015, 20:25  [ТС] 152
Fulcrum_013, и еще раз огромное спасибо! Боюсь даже представить, сколько времени у меня бы ушло на изучение всей необходимой математической тематики, для реализации подобного.
А возможно после, я бы забил на все и вооружившись Directx SDK ушел свой движок писать
0
Fulcrum_013
1541 / 1187 / 138
Регистрация: 14.12.2014
Сообщений: 10,106
Завершенные тесты: 3
23.04.2015, 20:38 153
Цитата Сообщение от Constantius24 Посмотреть сообщение
А возможно после, я бы забил на все и вооружившись Directx SDK ушел свой движок писать
Я уже уходил несколько раз (движек писать), "пробы пера" были когда DirectX и в помине не было. Самая большая тупость - говорил мне друг на втором курсе - бросаем нафиг универ делаем движок (тогда рендеры ручками делались, Direct3D еще не родился) ну и дальше на его основе все что угодно - протупил, совдеповская прошивка на маршрут универ-завод типа. После универа уже там че то от нефиг делать и под DX шкрябал, типа машзала АСУ-ТП с рабочими экранами всех терминалов (я как раз на них эмуляторы разрабатывал по работе). Ландшафт по карте высот где то лежит. Без особого обтекстуривания (то еще был Celeron-333 c видюхой 16мб). Корочче тогда вьехал в тему CAD под такие движки надо свой делать. И если не полностью, к примеру модели рисовать в максе, а в своем редакторе только иерархии фрэймов собирать это как минимум. Потом въехал что в CAD имено CAD а не программах 3D дизайна технику и здания моделить гораздо быстрее.
1
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
23.04.2015, 21:38  [ТС] 154
Интересно какие решения у серьезных компаний-разработчиков игровых движков и игр под них. Тот же макс, там походу далеко особняком стоит.

Добавлено через 33 минуты
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Другая тройка векторов. Правила буравчика помнишь? Есть левый и правый. точно так же есть левая СК и правая СК (по тому же правилу определяется). Отличия левой от правой - направление вращения в обратную сторону
Цитата Сообщение от Constantius24 Посмотреть сообщение
Знак определяется через ориентацию базиса, и соответственно в одной среде отрицательная ориентация этого базиса, а в другой положительная. Я правильно понял?
Метод:
C#
1
2
3
4
        static Quaternion Fix(this Quaternion quat)
        {
            return new Quaternion(quat.Axis, -quat.Angle);
        }
Использование:
C#
1
cryLight.Rotate = gtaLight.GetRotation().Fix();
Как бы ты назвал этот метод? Fix тут не отражает сути вещей...

Добавлено через 3 минуты
Может быть InvertBasis()...
0
Fulcrum_013
1541 / 1187 / 138
Регистрация: 14.12.2014
Сообщений: 10,106
Завершенные тесты: 3
23.04.2015, 21:55 155
Да скорее всего так. Да кстати еще и возможность определить базис. в одном базисе crossproduct(x,y) дают z в другом -z
1
23.04.2015, 21:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.04.2015, 21:55

Как получить id элемента, зная только его класс?
Приветствую товарищи! Пожалуйста, помогите мне с решением одной задачи. У...

Как удалить таблицу зная только половину её названия?
Как удалить таблицу зная только половину её названия в mysql?

Как удалить TImage* зная только его Hint?
Всем Привет!:senor: Появилась задачка. есть динамически созданные объекты...


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

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

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