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

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

20.04.2015, 22:15. Просмотров 4560. Ответов 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, 21:59 21
Цитата Сообщение от Constantius24 Посмотреть сообщение
Куда девать Origin?
А Origin это похоже вектор Up. Он кстати по данным числам перпендикулярен Direction

Добавлено через 7 минут
в твоем случае Target это Position+Direction (ну или zaxis=Direction) , Eye это Position, а Up это Origin
1
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
21.04.2015, 22:19  [ТС] 22
Я переписал метод который ты мне дал:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        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);
 
            return new Matrix3D(
                xAxis.X, yAxis.X, zAxis.X, 0,
                xAxis.Y, yAxis.Y, zAxis.Y, 0,
                xAxis.Z, yAxis.Z, zAxis.Z, 0,
                -Vector3D.DotProduct(xAxis, eye), -Vector3D.DotProduct(yAxis, eye), -Vector3D.DotProduct(zAxis, eye), 1);
        }
Дальнейший расчет выглядит вот так:
C#
1
2
3
4
5
6
7
8
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;
Все так?

Добавлено через 7 минут
У меня сомнения вызывает вот эти операторы:
C++
1
2
3
R.D[3][0]=-(xaxis%Eye);
       R.D[3][1]=-(yaxis%Eye);
       R.D[3][2]=-(zaxis%Eye);
имеется ввиду " = -значение" или " результат = результат - значение " ?
0
Fulcrum_013
1541 / 1187 / 138
Регистрация: 14.12.2014
Сообщений: 10,106
Завершенные тесты: 3
21.04.2015, 22:34 23
дословно перевел правильно.
Только в твоем случае удобнее так:
C#
1
2
3
4
5
6
7
8
//метод:
Matrix3D GetMatrix(Vector3D Direction, Vector3D eye, Vector3D up)
        {
            Vector3D zAxis = Diection;
           //и дальше по тексту
         }
//вызов:
Matrix3D matrix = GetMatrix(Direction, Position, Origin);
Добавлено через 2 минуты

Не по теме:

Цитата Сообщение от Constantius24 Посмотреть сообщение
имеется ввиду " = -значение" или " результат = результат - значение " ?
результат = результат - значение - это -=. У ва же в шарпе набор операторов такой же

1
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
21.04.2015, 22:37  [ТС] 24
Сделал так:
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
Matrix3D GetMatrix(Vector3D direction, Vector3D position, Vector3D origin)
        {
            Vector3D zAxis = direction;
            zAxis.Normalize();
 
            Vector3D xAxis = Vector3D.CrossProduct(origin, 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 = yAxis.Y;
 
            matrix.M31 = xAxis.Z;
            matrix.M32 = xAxis.Y;
            matrix.M33 = xAxis.Z;
 
            matrix.OffsetX -= Vector3D.DotProduct(xAxis, position);
            matrix.OffsetY -= Vector3D.DotProduct(yAxis, position);
            matrix.OffsetZ -= Vector3D.DotProduct(zAxis, position);
 
            matrix.M44 = 1;
 
            return matrix;
        }
0
Fulcrum_013
1541 / 1187 / 138
Регистрация: 14.12.2014
Сообщений: 10,106
Завершенные тесты: 3
21.04.2015, 22:43 25
можно было "и дальше" и по твоему тексту.
или вообще так сделать (если передача параметра по значению а не по ссылке)
C#
1
2
3
4
Matrix3D GetMatrix(Vector3D zAxis, Vector3D position, Vector3D origin)
        {
            zAxis.Normalize();
            //и дальше по твоему тексту
1
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
21.04.2015, 22:52  [ТС] 26
Допустим этот код правильный и вычисляет правильную матрицу, а дальше я вычисляю правильный кватернион. Как теперь вычислить глобальные значения для вращения, зная значения вращения родительского объекта?
Т.е. из локальной в глобальную надо перейти систему. С позицией все просто, я тупо складывал Position.
0
Fulcrum_013
1541 / 1187 / 138
Регистрация: 14.12.2014
Сообщений: 10,106
Завершенные тесты: 3
21.04.2015, 22:56 27
Если у тебя Direction и Position в ГСК то и матрица и кватернион в ГСК. Если в ЛСК предка: Чем задана трансформация родительского объекта? Если матрицей то перед получением кватерниона умножь матрицу на матрицу трансформации предка
1
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
21.04.2015, 23:01  [ТС] 28
Direction, Position и Origin заданы в локальной системе координат. На основе их мы вычислили кватернион. Трансформация родительского объекта задана как Vector3D для Position и Quaternion для Rotation в глобальной системе координат. Значения Position я тупо складываю, что делать с Rotation?
0
Fulcrum_013
1541 / 1187 / 138
Регистрация: 14.12.2014
Сообщений: 10,106
Завершенные тесты: 3
21.04.2015, 23:04 29
Если кватернионом то умножь кватернион на кватернион предка.

Добавлено через 1 минуту
кстати тупо складывать не факт что правильно. складывать можно если все в одной СК. если в разных надо домножать на оси.
1
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
21.04.2015, 23:07  [ТС] 30
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
кстати тупо складывать не факт что правильно.
Домножить, надо то, что в ЛСК? На что?
0
Fulcrum_013
1541 / 1187 / 138
Регистрация: 14.12.2014
Сообщений: 10,106
Завершенные тесты: 3
21.04.2015, 23:11 31
на саму ЛСК - так переходишь к ГСК. т.е. домножить на ГСК предка. учитывая что у него тоже предок то получается перемножение ЛСК по цепочки до Top Frame(dummy)
1
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
21.04.2015, 23:15  [ТС] 32
Так, вот координаты дочернего объекта относительно предка:
Position 0.00335693 11.41830000 0.08299210
Вот координаты предка:
-610.8492, -956.1702, 3.826241
Так, что нужно перемножить?
0
Fulcrum_013
1541 / 1187 / 138
Регистрация: 14.12.2014
Сообщений: 10,106
Завершенные тесты: 3
21.04.2015, 23:21 33
C++
1
2
3
4
5
6
7
8
9
10
11
12
void __fastcall TFrame::TransformationChanged(){
    if (Owner)
       OwnerTransformation=Owner->Global;
    else
       D3DXMatrixIdentity(&OwnerTransformation);
 
    Global=Transformation*OwnerTransformation;
    for (int i=0;i<FChilds->Count;i++){
        if(FChilds->Items[i])((TFrame*)FChilds->Items[i])->TransformationChanged();
 
    };
};
Вот расчет ГСК (Global) с учетом иерархии предков, правда матрицами, они в иерархии удобней.

Добавлено через 2 минуты
если предок в ГСК то коры предка+ Position * на кватернион предка
1
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
21.04.2015, 23:25  [ТС] 34
Fulcrum_013, у меня нет иерархий, тупо пара координат - для parent в ГСК, и для child в ЛСК. Нужно узнать значения child в ГСК. Так что нужно перемножить из этой пары?
0
Fulcrum_013
1541 / 1187 / 138
Регистрация: 14.12.2014
Сообщений: 10,106
Завершенные тесты: 3
21.04.2015, 23:27 35
если у Parent нет вращения то просто сложить. Если есть то GlobalChildPosition=parent.Position+child.Position*Parent.Rotation.
1
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
21.04.2015, 23:27  [ТС] 36
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
если предок в ГСК то коры предка+ Position * на кватернион предка
Как я Vector3D умножу на Quatrenion?
Может быть ты имел виду x,y,z квартениона нужно взять для перемножения с суммой координат?
0
Fulcrum_013
1541 / 1187 / 138
Регистрация: 14.12.2014
Сообщений: 10,106
Завершенные тесты: 3
21.04.2015, 23:29 37
GlobalChildRotation=Child.Rotation*Parent.Rotation

Добавлено через 1 минуту
Цитата Сообщение от Constantius24 Посмотреть сообщение
Как я Vector3D умножу на Quatrenion?
По правилам умножения вектора на кватернион (поворот вектора). Ставишь четвертой корой 0, умножаешь, из результата забираешь три коры вектор.
1
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
21.04.2015, 23:32  [ТС] 38
---
0
Fulcrum_013
1541 / 1187 / 138
Регистрация: 14.12.2014
Сообщений: 10,106
Завершенные тесты: 3
21.04.2015, 23:35 39
Если у вектора есть метод QuaternionRotate он именно это и делает.
1
Constantius24
67 / 67 / 42
Регистрация: 30.03.2015
Сообщений: 371
21.04.2015, 23:38  [ТС] 40
Т.е мне нужно сначала создать новый кварт у которого x,y,z будут globalPos, а w =0.
Затем я перемножаю получившийся кварт с квартом вращения и из результата беру x,y,z?
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
QuaternionRotate
в моих структурах такого нет.
0
21.04.2015, 23:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2015, 23:38

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

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

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


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

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

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