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

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

20.04.2015, 22:15. Просмотров 4556. Ответов 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
21.04.2015, 23:43 41
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
GlobalChildRotation=Child.Rotation*Parent.Rotation
здесь все три - кватернионы.

Добавлено через 2 минуты
Цитата Сообщение от Constantius24 Посмотреть сообщение
Т.е мне нужно сначала создать новый кварт у которого x,y,z будут globalPos, а w =0.
Затем я перемножаю получившийся кварт с квартом вращения и из результата беру x,y,z?
Да. и добавляешь эти x,y,z к x,y,z предка.

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

Добавлено через 1 минуту
потому кстати матрицами и делают, меньше запар. При том что матрица это тензерное произведение исходного кварта на повернутый.

Добавлено через 1 минуту
Цитата Сообщение от Constantius24 Посмотреть сообщение
в моих структурах такого нет
У тебя структуры самодельные? Я в свои классы под это дело тоже кватернионы не делал.
1
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
21.04.2015, 23:45  [ТС] 42
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
У тебя структуры самодельные?
Нет, .NET. (System.Windows.Media.Media3D)
Вот что получилось:
0
Миниатюры
Как математически зная только вектор вычислить кватернион?  
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
21.04.2015, 23:55  [ТС] 43
щас исправлю, моя ошибка не доделал...

Добавлено через 3 минуты
Так что ли:
C#
1
2
3
4
5
6
7
Vector3D childPos = new Vector3D(0.00335693, 11.41830000, 0.08299210);
            Vector3D parentPos = new Vector3D(-534.7166, -1002.682, 7.257986);
            Quaternion parentRot = new Quaternion(0, 0, 0.7071068, 0.7071067);
 
            // child global pos
            Vector3D result = parentPos + childPos + (parentRot * new Quaternion(childPos, 0)).Axis;
            Console.WriteLine(result);
Добавлено через 2 минуты
Нет, все испортилось...

Добавлено через 2 минуты
кажется вот:
C#
1
Vector3D result = parentPos + Vector3D.CrossProduct(childPos, (parentRot * new Quaternion(childPos, 0)).Axis);
0
Fulcrum_013
1541 / 1187 / 138
Регистрация: 14.12.2014
Сообщений: 10,106
Завершенные тесты: 3
22.04.2015, 00:09 44
естественно надо так
C#
1
Vector3D result = parentPos + ((new Quaternion(childPos, 0))*parentRot) .Axis;
Добавлено через 4 минуты
Цитата Сообщение от Constantius24 Посмотреть сообщение
ector3D result = parentPos + Vector3D.CrossProduct(childPos, (parentRot * new Quaternion(childPos, 0)).Axis);
А может даже и так
1
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
22.04.2015, 00:26  [ТС] 45
Fulcrum_013, во общем обнаружил проблемы с размещением, действительно тупо складывать значения не вариант, но и до сих пор не получилось вычислить нормально правильный результат для ГСК...а еще эти квартенионы...
Есть вариант реализовать такую же иерархию, где будут и ГСК и ЛСК, и ничего не конвертировать, а оставить так. Посмотрим, что получиться. Спасибо Вам!
0
Fulcrum_013
1541 / 1187 / 138
Регистрация: 14.12.2014
Сообщений: 10,106
Завершенные тесты: 3
22.04.2015, 00:40 46
Для отрисовки любым рендером (даже самодельным) понадобятся именно ГСК каждого объекта.

Добавлено через 1 минуту
Да кстати, есть вариант что Origin это не Up а Right, то е у нас получается на каждом думми смещение поворота на 90 градусов

Добавлено через 3 минуты
в таком случае матрицу надо считать так:
C#
1
2
3
4
5
6
7
8
9
Matrix3D GetMatrix(Vector3D direction, Vector3D position, Vector3D origin)
        {
            Vector3D zAxis = direction;
            zAxis.Normalize();
 
            Vector3D yAxis = Vector3D.CrossProduct(origin, zAxis);
            xAxis.Normalize();
 
            Vector3D xAxis = Vector3D.CrossProduct(zAxis, yAxis);
1
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
22.04.2015, 08:24  [ТС] 47
Есть, с расположением разобрался.
Действительно нельзя было тупо складывать позиции родителя и его объектов(были ошибки). Реализовал иерархию, значения никак не изменял, все само вычиталось и встало туда, куда нужно. Сейчас разберусь с вращением, думаю теперь будет проще. Еще раз спасибо.
0
Fulcrum_013
1541 / 1187 / 138
Регистрация: 14.12.2014
Сообщений: 10,106
Завершенные тесты: 3
22.04.2015, 09:12 48
Цитата Сообщение от Constantius24 Посмотреть сообщение
все само вычиталось и встало туда, куда нужно. Сейчас разберусь с вращением
Если все стало по позиции куда надо то с вращением уже все ОК. т.к. для того чтобы правильно высчитались позиции должен правильно считаться поворот во всей иерархии.
1
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
22.04.2015, 09:50  [ТС] 49
Удалось добиться адекватного результата для Rotation, но еще требуется доработка.
Вот как должно получиться:
Как математически зная только вектор вычислить кватернион?

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

Код вычисления на данный момент выглядит так:
Матрица:
Кликните здесь для просмотра всего текста
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
        public Matrix3D GetMatrix(Vector3D target, Vector3D eye, Vector3D up)
        {
            Vector3D zAxis = target - eye;
            zAxis.Normalize();
            
            Vector3D xAxis = Vector3D.CrossProduct(up, zAxis);
            xAxis.Normalize();
            
            Vector3D yAxis = Vector3D.CrossProduct(zAxis, xAxis);
 
            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, eye);
            matrix.OffsetY -= Vector3D.DotProduct(yAxis, eye);
            matrix.OffsetZ -= Vector3D.DotProduct(zAxis, eye);
            matrix.M44 = 1;
            
            return matrix;
        }

Кватернион:
C#
1
2
3
4
5
6
7
8
9
10
11
12
        public Quaternion GetRotation()
        {
            Matrix3D matrix = GetMatrix(Position + Direction, Position, Origin);
 
            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
Fulcrum_013
1541 / 1187 / 138
Регистрация: 14.12.2014
Сообщений: 10,106
Завершенные тесты: 3
22.04.2015, 09:55 50
Есть вариант что Origin это не Up а Right, то е у нас получается на каждом думми смещение поворота на 90 градусов
1
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
22.04.2015, 10:08  [ТС] 51
Да действительно, сейчас проектор направлен по оси X, её видно красным на скриншоте.
Чтобы все встало как надо, нужно, чтобы проектор смотрел по оси Z, правда еще вращение кватерниона, т.е. W не совсем ровный, хотя может так и есть на самом деле, ибо в максе проектор это конус и там не важно, а у меня это пирамида...
Кароче вопрос в том, это мы, чего-то не до вычислили или это особенность редактора и достаточно повернуть на 90 градусов?
0
Fulcrum_013
1541 / 1187 / 138
Регистрация: 14.12.2014
Сообщений: 10,106
Завершенные тесты: 3
22.04.2015, 10:09 52
А вообще по рисунку однозначно перепутаны оси. В одних редакторах они как в графике (Z в глубину), в других как в математике (Z вверх) похоже здесь именно этот случай.

Добавлено через 1 минуту
т.е. имеем два варианта, в обоих поворот на 90 градусов
1
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
22.04.2015, 10:10  [ТС] 53
Т.е. мы все вычислил верно и это уже особенность редактора?
0
Fulcrum_013
1541 / 1187 / 138
Регистрация: 14.12.2014
Сообщений: 10,106
Завершенные тесты: 3
22.04.2015, 10:12 54
Если смотрит по x то оси перепутаны одназначно. Смотреть он должен по Z, если бы перепутали Origin поменялся бы крен

Добавлено через 1 минуту
Особенности сопряжения СК разных редакторов. Достаточно в выводе поменять оси чтобы все стало на место
1
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
22.04.2015, 10:18  [ТС] 55
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Достаточно в выводе поменять оси
Так, что на, что мы меняем?
0
Fulcrum_013
1541 / 1187 / 138
Регистрация: 14.12.2014
Сообщений: 10,106
Завершенные тесты: 3
22.04.2015, 10:20 56
Вобщем пробуем менять оси методом научного тыка поменяй на выходе X и Z
0
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
22.04.2015, 10:25  [ТС] 57
Поменял X и Z, получилась каша(
0
Fulcrum_013
1541 / 1187 / 138
Регистрация: 14.12.2014
Сообщений: 10,106
Завершенные тесты: 3
22.04.2015, 10:28 58
Так, а в максе можешь оси показать? Матрица для камеры. Камера смотрит (direction) по Z. Но не факт что в максе и т.д. другие объекты смотрят по Z
0
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
22.04.2015, 10:34  [ТС] 59
В максе все оси одинаковы:
Как математически зная только вектор вычислить кватернион?
0
Fulcrum_013
1541 / 1187 / 138
Регистрация: 14.12.2014
Сообщений: 10,106
Завершенные тесты: 3
22.04.2015, 10:52 60
Это в максе ГСК оси ЛСК можешь показать?
0
22.04.2015, 10:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.04.2015, 10:52

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

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

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


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

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

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