4203 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
1

А есть ли здесь функция поворот вектора вокруг вектора?

23.06.2012, 08:06. Показов 11351. Ответов 25
Метки нет (Все метки)

Задача пересчитать вектор с учётом поворота. Есть шар, заменяющий геоид,
координаты камеры, нормаль в этой точке, она же вектор вверх и вектор напаравления на северную точку математического горизонта, нужны параметры glLokat, отвечающие за точку, на которую смотришь. Если смотришь на горизонт на север, то с этим всё просто. Но если задан ненулевой азимут направления взгляда, то как тогда? Насдо ведь повернуть северный вектор на азимутальный угол вокруг нормали. А как? И если вверх/вниз на север, то надо умножить нормаль на северный вектор и потом вокруг произведения повернуть северный вектор вместе с нормалью на нужный вертикальный угол. А как повернуть? Перемножить то я могу, а повернуть только вокруг оси. Если вверх/вниз по заданному азимуту, то сначала поворот северного вектора и нормали вокруг произведения на вертикальный угол, а потом уже поврёнутые северный вектор и нормаль на заданный азимутальный вектор вокруг исходнйо нормиали. И опять как повернуть? Может есть какая функция поворота вокруг вектора, пересчитывающая другой ветор, или функция вычисления матрицы поворота по вектору и углу?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.06.2012, 08:06
Ответы с готовыми решениями:

STL. Функция, которая будет искать элементы большее среднего арифметического вектора и удалять их из вектора
у меня есть вектор, помогите пожалуйста дописать функцию, которая будет искать элементы большее...

Найти выражение для: вектора скорости; вектора ускорения; модуля радиус-вектора
Товарищи, помогите пожалуйста решить. Радиус-вектор материальной точки задается выражением:...

Функция: вернуть вектор, в котором есть все числа из исходного вектора v, кроме заданного x
есть вот такая задача ф-цию filter, которая принимает вектор чисел v и аргумент x. Она возвращает...

Поворот вектора
Всем доброго времени суток! Есть тело в пространстве с определенной нормалью (нормальный вектор),...

25
8 / 8 / 0
Регистрация: 26.11.2008
Сообщений: 44
23.06.2012, 09:23 2
Если я правильно понял суть проблемы, то тебе надо сформировать матрицу перехода из одной системы координат к другой. Для этого используются углы поворота вокруг конкретных осей (в матрице используются функции sin и cos угла).
Впринципе посмотри любой справочник по математике (хотя-бы Бронштейн, Семендяев) там описана матрица перехода между двумя системами координат в общем виде.
0
4203 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
23.06.2012, 12:59  [ТС] 3
Нет. Зачем мне переход из одних координат в другие? Даны два вектора и угол, надо один вектор повернуть вокруг другого. А цеплять на порядке глюки при развороте, приводящем один из векторов к координатной оси не надо. Нормаль есть ось z, повёрнутая вокруг обеих других осей, но вычислена она не путём поворота, а пересчётом сферических координат в декартовы, а один вектор к другому можно притянуть, повернув сначала вокруг оси x, а потом вокруг оси y, а можно наоборот, а как только я попытаюсь применить эти повороты к любому вектору, не колинеарному нормали, незнание правильного порядка сразу и проявится. Пока вектор один, можно для обоих порядков найти пары углов, дающие один и тот же результат, но любой не колинераный ему веткор в зависимости от порядка займёт два разных повёрнутых положения. А потом проблема ещё усугубится при обратном развороте.

Добавлено через 34 секунды
Цитата Сообщение от Ingvar50 Посмотреть сообщение
в матрице используются функции sin и cos угла
Когда вокруг оси, а не произвольного вектора.

Добавлено через 1 минуту
Цитата Сообщение от Ingvar50 Посмотреть сообщение
там описана матрица перехода между двумя системами координат в общем виде.
Я тебе и без справочника её выведу. Но для этого нужны не базис и вектор, а два базиса по три вектора в каждом.
0
8 / 8 / 0
Регистрация: 26.11.2008
Сообщений: 44
23.06.2012, 13:10 4
Тебе надо сделать привязку поворачиваемого ветора к локальной системе координат вектора вокруг которого поворачиваешь и лишь потом поворачивашь на угол
0
4203 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
23.06.2012, 13:42  [ТС] 5
Цитата Сообщение от Ingvar50 Посмотреть сообщение
к локальной системе координат вектора вокруг которого поворачиваешь
Бред не неси. Нет и не может быть системы координат одного отдельно взятого вектора, всякая система координат строится только на системе же базисных векторов, в этой системе координат являющихся ортами её координатных осей. Их минимум две, а вращать можно как минимум в пространстве, то есть с тремя осями: по которой крутишь + оси, определяющие перпендикулярную ей плоскость. Нельзя крутить что либо в двумерном пространстве, всякая матрица двумерного поворота неявно вводит третье измерение и только в трёхмерном пространстве можно повернуть плоскость этого пространства. Если не веришь, попробуй описать, как ты себе представляешь поворот всего трёхмерного пространства вокруг оси, ему не принадлежащей. Есть поворот в плоскости, но он происходит вокруг оси, перпендикулярной всей плоскости. По аналогии опиши вращение не в плоскости xy, а во всём пространстве. Вокруг какой оси оно будет происходить? Только вокруг оси четвертого измерения, так как только оно перпендикулярно всем пространству. При повороте в плоскости на 90 все оси меняются местами и одна меняет знак. Аналогично при повороте во всём пространстве все три оси меняются местами. Вокруг чего можно так повернуть? Если вокруг одной из трёх обычных осей, то она сама сохраняет аутентичность, на какой угол её не крути. А на одном векторе можно построить только ось одномерной координаты (именно в единственном числе и это не система). Или проще ось положения по длине. Нельзя построить матрицу однозначного и обратимого преобразования из трёхмерных координат в одномерные. Можно только спроецировать пространство на вектор, но два измерения при этом теряются и однозначного обратного преобразования уже не будет.
0
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
23.06.2012, 16:17 6
Матрица поворота по двум перпендикулярным векторам(вперёд и вверх) считается элементарным образом. Автор, иди наконец книжку какую-нибудь прочитай, сколько можно задавать дурацкие вопросы?
1
3230 / 1420 / 233
Регистрация: 26.02.2009
Сообщений: 7,378
Записей в блоге: 5
23.06.2012, 16:21 7
http://ru.wikipedia.org/wiki/%... 1%82%D0%B0
В самый конец листай и увидишь матрицу поворота по углу и оси вращения
1
8 / 8 / 0
Регистрация: 26.11.2008
Сообщений: 44
23.06.2012, 16:29 8
Я не знаю, что ты подразумеваешь под словом "вектор", но лично я под словом "вектор" понимаю положение какого-то объекта в той системе координат которую определил в программе изначально. Так что если у меня в программе присутствуют 2 и более объектов имеющих свои координаты (x, y, z), то это и есть вектор положение конкретного объекта в определенном мной пространстве.
В одном из переводных уроков NeHe описывающих отбрасывание тени источник осывещения привязывается к системе координат объекта на который падает свет.
Так что если мне надо повернуть один вектор относительно другого, то это лишь означает что я дложен повернуть один объект относительно другого.
Для этого надо определять локальную систему координат объекта относительно которго будешь вращать второй объект. В связи с этим строишь матрицу перехода между системами координат и уже в новой системе координат вычисляешь положение вращаемого объекта. Это во-первых.
Во вторых, все это описано в специализированных учебниках по математике.
Могу порекомендовать почитать книги посвященные кватернионам которые непосредственно используются в задачах пространственной ориентации объектов, в том чесле друг относительно друга. Одна из таких книг: Применение кватарнионов в задачах ориентации твердого тела Бранец, Шмыглевский
И в-последних. В Интернете попадался пример, в котором один шар вращался относительно другого (по моемому был на delphi)
0
4203 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
23.06.2012, 17:46  [ТС] 9
Цитата Сообщение от Ingvar50 Посмотреть сообщение
Так что если у меня в программе присутствуют 2 и более объектов имеющих свои координаты (x, y, z), т
Вектор задаёт положение одного объекта относительно всех осей одной системы. У меня есть мировая система координат, отдельно взятый произвольный вектор, вокруг которого надо выполнить поворот и вектора, который требуется повернуть. Сам преобразуемый вектор нельзя включать в систему, к которой приводишь, так как он задан и подлежит преобразованию, а не получается в результате преобразования. Получается: система векторов и отдельно взятый вектор. Их нельзя приводить. Однако, как я уже понял, задача всё таки сводима к вращению вокруг оси в преобразованной системе координат: если взять не один лишь вектор нормали, а дополнить его векторами в плоскости математического горизонта, направленными на восток и на север, то всего векторов будет три. Исходно северный вектор совпадает с осью y, восточный - с осью x, а нормаль с осью z. Соответственно матрица преобразования координат должна приводить ort x к ort east, ort y к ort north и ort z к ort normal. 3 к трём и определены порядки векторов в обеих тройках. Это уже можно решать.

Добавлено через 37 секунд
От темы пока не отписываюсь, но буду пытаться вывести нужную матрицу.
0
8 / 8 / 0
Регистрация: 26.11.2008
Сообщений: 44
25.06.2012, 09:31 10
У тебя изначально оба вектора описывают местоположение объектов в мировой системе координат.
И как я понимаю у тебя стоит задача повернуть один объект вокруг другого.
Поэтому поэтому я еще раз повторяю, что тебе надо сформировать локальную ситсему координат расположенной в точке с координатами описывающий объект вокруг которого поворачиваешь.
При этом ты должен сформировать матрицу перехода от мировой ситсемы координат к сформированной локальной системе координат, после чего пересчитываешь координаты поворачиваемого объекта в локальную ситему координат первого объекта и лишь потом осуществляешь поворот. Для того чтобы у тебя были координаты повернутого объекта в мироваой системе координат тебе надо пересчитать через матрицу обратного перехода от локальной к мировой системе координат. Задачи подобного рода относятся в большей степени к задачам небесной механики.
А вообще посмотри урок № 44 NeHe Эффект световых бликов с проверкой видимости. и дополнение к этому уроку Урок по OpenGL. Класс камеры на основе кватернионов.
раположенных на сайте http://pmg.org.ru/nehe/index.html
0
4203 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
25.06.2012, 09:40  [ТС] 11
Ingvar50, локальную систему координат нельзя построить на одном векторе, но я уже выкрутился, найдя соответствия в новой системе для всех трёх осей: нормаль=z, направление на северную точку математического горизонта=y, направление на восточную точку математического горизонта=x. В точке пересечения экватора с нулевым меридианом эта система параллельна и изомсштабна мировой и отличается только сдвигом начала координат, что учитывается не матрицей вращения.
0
8 / 8 / 0
Регистрация: 26.11.2008
Сообщений: 44
27.06.2012, 09:46 12
Продолжение к предыдущему Посмотри Вот эту статью посвященную работе с кватернионами http://www.gamedev.ru/code/articles/?id=4215
0
272 / 265 / 20
Регистрация: 27.02.2009
Сообщений: 694
Записей в блоге: 7
27.06.2012, 10:41 13
Цитата Сообщение от Ingvar50 Посмотреть сообщение
Продолжение к предыдущему Посмотри Вот эту статью посвященную работе с кватернионами http://www.gamedev.ru/code/articles/?id=4215
С того же сайта:
Автор Drun:

Xp, Yp, Zp - Точка, которую вращаем
Xv, Yv, Zv - Ось, вокруг которой вращаем (обязательно пронормированная!!!)
Angle - Угол поворота(в радианах)

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Procedure RotatePoint(Var Xp, Yp, Zp: Double; Xv, Yv, Zv, Angle: Double); 
Var Temp, Nx, Ny, Nz: Double; 
Begin 
  Temp:=1.0 - Cos(Angle);
 
  Nx:=Xp * (Xv * Temp * Xv + Cos(Angle)) + 
      Yp * (Yv * Temp * Xv - Sin(Angle) * Zv) + 
      Zp * (Zv * Temp * Xv + Sin(Angle) * Yv);
 
  Ny:=Xp * (Xv * Temp * Yv + Sin(Angle) * Zv) + 
      Yp * (Yv * Temp * Yv + Cos(Angle)) + 
      Zp * (Zv * Temp * Yv - Sin(Angle) * Xv);
 
  Nz:=Xp * (Xv * Temp * Zv - Sin(Angle) * Yv) + 
      Yp * (Yv * Temp * Zv + Sin(Angle) * Xv) + 
      Zp * (Zv * Temp * Zv + Cos(Angle));
 
  Xp:=Nx; 
  Yp:=Ny; 
  Zp:=Nz; 
End;

Не по теме:

Я конечно извиняюсь, но попробуйте воспользоваться сначала поисковиком. Требуемая информация была найдена в доп. ссылках к первому результату поиска за 5 минут

0
4203 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
27.06.2012, 10:43  [ТС] 14
Про кватернионы я читал. Но ни как не могу понять, зачем они вообще нужны. Пространство то трёхмерно.
0
272 / 265 / 20
Регистрация: 27.02.2009
Сообщений: 694
Записей в блоге: 7
27.06.2012, 11:11 15
Цитата Сообщение от taras atavin Посмотреть сообщение
Про кватернионы я читал. Но ни как не могу понять, зачем они вообще нужны. Пространство то трёхмерно.
Они нужны для ускорения подготовки данных для рендера. Работа с матрицами более трудоемка по ресурсам, чем работа с векторами.

Так же кватернионами удобно описывать положение одних объектов, относительно других, например, при описании положения костей.
0
4203 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
27.06.2012, 12:03  [ТС] 16
А при чём здесь кватернионы? Вектора ваще то трёхмерны.
0
272 / 265 / 20
Регистрация: 27.02.2009
Сообщений: 694
Записей в блоге: 7
27.06.2012, 12:43 17
Цитата Сообщение от taras atavin Посмотреть сообщение
А при чём здесь кватернионы? Вектора ваще то трёхмерны.
кватернион - это угол поворота и вектор вращения, по этому и 4 координаты.
0
4203 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
27.06.2012, 13:02  [ТС] 18
Но для поворота то всё равно нужна матрица, сначала заполнять кватернион, чтоб потом с него сгенерить матрицу - замедление, а не ускорение.
0
272 / 265 / 20
Регистрация: 27.02.2009
Сообщений: 694
Записей в блоге: 7
27.06.2012, 13:42 19
Цитата Сообщение от taras atavin Посмотреть сообщение
Но для поворота то всё равно нужна матрица, сначала заполнять кватернион, чтоб потом с него сгенерить матрицу - замедление, а не ускорение.
Это когда достаточно одной матрицы поворота. Кватернионы позволяют ускорить когда есть многоуровневая зависимость одного объекта от другого (простейший пример - скелет). В этом случае поворот каждого объекта складывается из вращений нескольких объектов. Второе применение кватернионов - это поворот одного объекта совместно с другим, т.е. перемножаем два кватерниона и генерируем матрицу поворота. Ну и третья причина их применения - сделать код более читаемым. Матричные преобразования воспринимаются очень тяжело на глаз.
0
4203 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
27.06.2012, 13:54  [ТС] 20
В смысле? Каким образом? Всё равно же каждый отдельно заполнять и по каждому генерить матрицу.

Добавлено через 35 секунд
А потом их ещё перемножать.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.06.2012, 13:54
Помогаю со студенческими работами здесь

Поворот вектора
Здравствуйте. Есть вектор A{x,y,z} и вектор А'=M*A, где М - матрица поворота вокруг оси ОХ на 30...

Поворот вектора
известны начальные и конечные координаты вектора...необходимо направить его в противоположную...

Поворот 3D вектора
Подскажите пожалуйста, как исправить можно? Входные данные: 1. 3D - координаты вектора....

Поворот вектора кватернионом
Добрый день, народ! Есть два вектора, например v1(0,0,1) и v2(-150,200,1). Я делаю кватернион...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru