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

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

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

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

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

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

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

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

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

154
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
23.04.2015, 11:28  [ТС] 101
C#
1
Quaternion rotation = new Quaternion(Direction.Z, Direction.Y, -Direction.X, 0);
Как математически зная только вектор вычислить кватернион?

Как математически зная только вектор вычислить кватернион?
0
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
23.04.2015, 11:35  [ТС] 102
C#
1
new Quaternion(-Direction.Z, Direction.Y, Direction.X, 0);
Как математически зная только вектор вычислить кватернион?

Как математически зная только вектор вычислить кватернион?
0
Fulcrum_013
1547 / 1194 / 139
Регистрация: 14.12.2014
Сообщений: 10,234
Завершенные тесты: 3
23.04.2015, 11:41 103
Нихрена не понял. мы сейчас этому потолочному лампососу x и z поменяли, а реально x там где был там и остался. такое впечатление что у него толи таргет в той стороне толи еще что в таком духе - т.е. после подгрузки приводят к такому направлению. давай вообще их попробуем все в низ направить:
Quaternion rotation = new Quaternion(0, 0, -1, 0);
1
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
23.04.2015, 11:45  [ТС] 104
C#
1
new Quaternion(0, 0, -1, 0);
Как математически зная только вектор вычислить кватернион?

Как математически зная только вектор вычислить кватернион?
0
Fulcrum_013
1547 / 1194 / 139
Регистрация: 14.12.2014
Сообщений: 10,234
Завершенные тесты: 3
23.04.2015, 11:47 105
а тепреь так Quaternion rotation = new Quaternion(-1, 0, 0, 0);
1
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
23.04.2015, 11:50  [ТС] 106
C#
1
new Quaternion(-1, 0, 0, 0);
Как математически зная только вектор вычислить кватернион?

Как математически зная только вектор вычислить кватернион?
0
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
23.04.2015, 11:52  [ТС] 107
Я вручную повернул потолочный лампосос по оси Y на 90, т.е. вниз направил как и задумано, получил такие значения кватерниона:
0.5,0.5,-0.5,0.5
0
Fulcrum_013
1547 / 1194 / 139
Регистрация: 14.12.2014
Сообщений: 10,234
Завершенные тесты: 3
23.04.2015, 12:02 108
так поворот в радианах потому что на 90 градусов. и его нам надо как то получать из матрицы. ану поставь ту матрицу по которой у нас 70% процентов становилось и посмотри что у этого потолочного за кватернион получился.
0
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
23.04.2015, 12:08  [ТС] 109
Вот это поворот:
Rotate="0,NaN,NaN,NaN"
Добавлено через 24 секунды
Это в формате WXYZ
0
Fulcrum_013
1547 / 1194 / 139
Регистрация: 14.12.2014
Сообщений: 10,234
Завершенные тесты: 3
23.04.2015, 12:14 110
А что ты им в качестве Up задаешь? Где то вектора совпали Up и Direction

Добавлено через 3 минуты
В максе его показать можешь? что там в исходе?
0
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
23.04.2015, 12:15  [ТС] 111
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
        public Quaternion GetRotation()
        {
            Vector3D xAxis = Direction;
            xAxis.Normalize();
 
            Vector3D zAxis = Vector3D.CrossProduct(Origin, xAxis);
            zAxis.Normalize();
 
            Vector3D yAxis = Vector3D.CrossProduct(zAxis, xAxis);
            yAxis.Normalize();
 
            Matrix3D matrix = Matrix3D.Identity;
 
            matrix.M11 = xAxis.X;
            matrix.M12 = yAxis.X;
            matrix.M13 = zAxis.X;
 
            matrix.M21 = xAxis.Y;
            matrix.M22 = yAxis.Y;
            matrix.M23 = zAxis.Y;
 
            matrix.M31 = xAxis.Z;
            matrix.M32 = yAxis.Z;
            matrix.M33 = zAxis.Z;
 
            matrix.OffsetX -= Vector3D.DotProduct(xAxis, Position);
            matrix.OffsetY -= Vector3D.DotProduct(yAxis, Position);
            matrix.OffsetZ -= Vector3D.DotProduct(zAxis, Position);
            matrix.M44 = 1;
 
            Quaternion rotation = new Quaternion();
            rotation.W = Math.Sqrt(1 + matrix.M11 + matrix.M22 + matrix.M33) / 2;
            double wScale = rotation.W * 4;
            rotation.X = (matrix.M32 - matrix.M23) / wScale;
            rotation.Y = (matrix.M13 - matrix.M31) / wScale;
            rotation.Z = (matrix.M21 - matrix.M12) / wScale;
 
            return rotation;
        }
0
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
23.04.2015, 12:18  [ТС] 112
Как математически зная только вектор вычислить кватернион?
0
Fulcrum_013
1547 / 1194 / 139
Регистрация: 14.12.2014
Сообщений: 10,234
Завершенные тесты: 3
23.04.2015, 12:22 113
А origin у него какой?
0
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
23.04.2015, 12:37  [ТС] 114
В маске нет такого свойства(
Импорт вычисляется основываясь на pos и -dir

Добавлено через 10 минут
Можно схитрить и не вычислять кватернион у тех, у кого direction и origin дает кватернион без вращения, вместо этого подсовывать 0.5,0.5,-0.5,0.5

Добавлено через 45 секунд
правда не самое лаконичное решение получается...
0
Fulcrum_013
1547 / 1194 / 139
Регистрация: 14.12.2014
Сообщений: 10,234
Завершенные тесты: 3
23.04.2015, 12:43 115
Так ладно попробуем обойти сначала костылем. Хотя это и не костыль вроде такие положения осей абсолютно возможны.
если wScale=0 ставь ему тот кварт который нужен 0.5,0.5,-0.5,0.5

Добавлено через 3 минуты
Да если поворот в циклах, то там надо так делать
C#
1
if (!rotation.W) rotation.W=1;
Добавлено через 1 минуту
И кварт тогда нужный получится.
0
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
23.04.2015, 12:50  [ТС] 116
C#
1
2
3
4
5
6
7
8
9
10
11
12
Quaternion rotation = new Quaternion();
            rotation.W = Math.Sqrt(1 + matrix.M11 + matrix.M22 + matrix.M33) / 2;
            double wScale = rotation.W * 4;
 
            if (wScale == 0) return new Quaternion(0.5, 0.5, -0.5, 0.5);
 
            rotation.X = (matrix.M32 - matrix.M23) / wScale;
            rotation.Y = (matrix.M13 - matrix.M31) / wScale;
            rotation.Z = (matrix.M21 - matrix.M12) / wScale;
 
            return rotation;
        }
Значит в одном месте все встало как надо:
Как математически зная только вектор вычислить кватернион?

А вот тут оказывает фигня:
Как математически зная только вектор вычислить кватернион?

Ну и там где в круг все норм.
Сейчас пойду посмотрю на значения лампы у второго скриншота.
0
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
23.04.2015, 12:56  [ТС] 117
Собственно вот:
Как математически зная только вектор вычислить кватернион?

последний проблемный момент
0
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
23.04.2015, 12:58  [ТС] 118
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Да если поворот в циклах, то там надо так делать
if (!rotation.W) rotation.W=1;
Что ты имел ввиду под !rotation.W ?
В C# нет применения оператора ! над числовыми значеняими
0
Fulcrum_013
1547 / 1194 / 139
Регистрация: 14.12.2014
Сообщений: 10,234
Завершенные тесты: 3
23.04.2015, 13:02 119
rotation.W==0
0
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
23.04.2015, 13:07  [ТС] 120
c++...
Вот так будет проводиться проверка, в случае если W равно нулю построиться кват с w=1 иначе с 0.5
C#
1
if (wScale == 0) return new Quaternion(0.5, 0.5, -0.5, rotation.W == 0 ? 1 : 0.5);
0
23.04.2015, 13:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.04.2015, 13:07

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

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

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


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

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

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