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

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

20.04.2015, 22:15. Просмотров 4554. Ответов 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
Fulcrum_013
1541 / 1187 / 138
Регистрация: 14.12.2014
Сообщений: 10,106
Завершенные тесты: 3
23.04.2015, 13:09 121
C#
1
2
3
4
5
6
            rotation.W = Math.Sqrt(1 + matrix.M11 + matrix.M22 + matrix.M33) / 2;
            if (rotation.W==0)rotation.W=0.5;
            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;
1
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
23.04.2015, 13:10  [ТС] 122
Щас проверю
0
Fulcrum_013
1541 / 1187 / 138
Регистрация: 14.12.2014
Сообщений: 10,106
Завершенные тесты: 3
23.04.2015, 13:11 123
а остальные 0.5 там из матрицы получатся;
0
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
23.04.2015, 13:11  [ТС] 124
C#
1
2
3
4
5
6
7
8
9
10
            Quaternion rotation = new Quaternion();
            rotation.W = Math.Sqrt(1 + matrix.M11 + matrix.M22 + matrix.M33) / 2;
            if (rotation.W == 0) rotation.W = 1;
            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;
Назовем это вар1:
Как математически зная только вектор вычислить кватернион?

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

вар3:
Как математически зная только вектор вычислить кватернион?
0
Fulcrum_013
1541 / 1187 / 138
Регистрация: 14.12.2014
Сообщений: 10,106
Завершенные тесты: 3
23.04.2015, 13:21 125
if (rotation.W == 0) rotation.W = 0.5; отак попробуй
0
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
23.04.2015, 13:23  [ТС] 126
Точно, блин ошибся
---
Как математически зная только вектор вычислить кватернион?

Как математически зная только вектор вычислить кватернион?
0
Fulcrum_013
1541 / 1187 / 138
Регистрация: 14.12.2014
Сообщений: 10,106
Завершенные тесты: 3
23.04.2015, 13:35 127
как стояли так и стоят. ану покажи числовые данные включая исходные матрицу и полученный кватр когда w==0
0
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
23.04.2015, 13:47  [ТС] 128
вар2:
Position -0.05218890 0.03518440 3.55801000
Direction 0.00000000 0.00000000 -1.00000000
Origin 0.00000000 1.00000000 0.00000000
получившийся кват: 0.5,0,0,0 WXYZ
вар3:
Position -0.01128010 -0.00353065 -0.28028700
Direction -0.00000003 0.00000000 -1.00000000
Origin 0.00000000 1.00000000 0.00000000
получившийся кват: NaN,NaN,NaN,NaN
0
Fulcrum_013
1541 / 1187 / 138
Регистрация: 14.12.2014
Сообщений: 10,106
Завершенные тесты: 3
23.04.2015, 14:01 129
Ну а из конвертера?
C#
1
2
3
4
5
6
7
8
9
10
11
 if (rotation.W == 0) { fail=true;
           rotation.W = 0.5;
  }
            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;
          if (fail){
             //вот тут распечатай плиз Origin Direction matrix и rotation
          }
Добавлено через 7 минут
вместо rotation.W == 0 надо сделать rotation.W <1.0e-6, а то один пропускает. вот тебе и расчет в float.
0
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
23.04.2015, 14:02  [ТС] 130
Как математически зная только вектор вычислить кватернион?
0
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
23.04.2015, 14:07  [ТС] 131
C#
1
2
3
4
5
6
7
8
            Quaternion rotation = new Quaternion();
            rotation.W = Math.Sqrt(1 + matrix.M11 + matrix.M22 + matrix.M33) / 2;
            if (rotation.W < 1.0e-6) rotation.W = 0.5;
            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;
Правильного результата не дало, вар2 и 3 не смотрят вниз.
Последний результат был когда if (wScale == 0) return new Quaternion(0.5, 0.5, -0.5, 0.5), но при этом вар3 не смотрел вниз.
0
Fulcrum_013
1541 / 1187 / 138
Регистрация: 14.12.2014
Сообщений: 10,106
Завершенные тесты: 3
23.04.2015, 14:13 132
if (wScale <1e-6) return new Quaternion(0.5, 0.5, -0.5, 0.5)
Но эт похоже реально костыль.
0
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
23.04.2015, 14:18  [ТС] 133
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
вот тебе и расчет в float.
расчет в double
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
if (wScale <1e-6) return new Quaternion(0.5, 0.5, -0.5, 0.5)
щас проверю

Добавлено через 2 минуты
вар1 естественно ок, вар2 тоже, вар3 не смотрит вниз(
значения NanNanNanNAn
0
Fulcrum_013
1541 / 1187 / 138
Регистрация: 14.12.2014
Сообщений: 10,106
Завершенные тесты: 3
23.04.2015, 14:19 134
Это у тебя в double в проге. но не факт что у них. я по поводу 0.3e-8 которая из макса вместо 0 выскакивает. Да и все эти vector/matrix функции везде где видел включая GL и DX во float.
0
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
23.04.2015, 14:20  [ТС] 135
Вот так все работает:
C#
1
if (wScale < 1.0e-6 || double.IsNaN(wScale)) return new Quaternion(0.5, 0.5, -0.5, 0.5);
0
Fulcrum_013
1541 / 1187 / 138
Регистрация: 14.12.2014
Сообщений: 10,106
Завершенные тесты: 3
23.04.2015, 14:20 136
if (wScale <1e-3) return new Quaternion(0.5, 0.5, -0.5, 0.5)
Ну давай тады их ужо круто пилить попробуем
0
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
23.04.2015, 14:24  [ТС] 137
еще бы костыль не работал, на то он и костыль...

Добавлено через 2 минуты
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
if (wScale <1e-3)
такой вариант не прокатит, NaN появляется еще раньше походу в Math.Sqrt(1 + matrix.M11 + matrix.M22 + matrix.M33) / 2;
Следовательно любые проверки на больше меньше или равно тут не пройдут.
0
Fulcrum_013
1541 / 1187 / 138
Регистрация: 14.12.2014
Сообщений: 10,106
Завершенные тесты: 3
23.04.2015, 14:27 138
Math.Sqrt(1 + matrix.M11 + matrix.M22 + matrix.M33) / 2; а формула точно правильная? значения осей -1 -1 -1 валидны, а сумма будет -1
0
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
23.04.2015, 14:39  [ТС] 139
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
а формула точно правильная?
а какой она еще может быть, переписывал с того кода который ты мне дал на c++.

Добавлено через 3 минуты
На данный момент рабочий вариант таков:
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
        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;
            if (wScale < 1.0e-6 || double.IsNaN(wScale)) 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
Fulcrum_013
1541 / 1187 / 138
Регистрация: 14.12.2014
Сообщений: 10,106
Завершенные тесты: 3
23.04.2015, 14:40 140
Я имею в виду формула вычисления кварта которая с корнем. ну ладно будем не гадать а проверять по другому
C#
1
2
3
4
5
double s=(1 + matrix.M11 + matrix.M22 + matrix.M33)
if (s<0){ return new Quatarion /// какой там надо
}
 rotation.W = Math.Sqrt(s)/2;
и дальше по тексту.
0
23.04.2015, 14:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.04.2015, 14:40

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

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

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


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

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

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