Форум программистов, компьютерный форум, киберфорум
Наши страницы
OpenGL
Войти
Регистрация
Восстановить пароль
 
 
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
#1

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

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

Задача пересчитать вектор с учётом поворота. Есть шар, заменяющий геоид,
координаты камеры, нормаль в этой точке, она же вектор вверх и вектор напаравления на северную точку математического горизонта, нужны параметры glLokat, отвечающие за точку, на которую смотришь. Если смотришь на горизонт на север, то с этим всё просто. Но если задан ненулевой азимут направления взгляда, то как тогда? Насдо ведь повернуть северный вектор на азимутальный угол вокруг нормали. А как? И если вверх/вниз на север, то надо умножить нормаль на северный вектор и потом вокруг произведения повернуть северный вектор вместе с нормалью на нужный вертикальный угол. А как повернуть? Перемножить то я могу, а повернуть только вокруг оси. Если вверх/вниз по заданному азимуту, то сначала поворот северного вектора и нормали вокруг произведения на вертикальный угол, а потом уже поврёнутые северный вектор и нормаль на заданный азимутальный вектор вокруг исходнйо нормиали. И опять как повернуть? Может есть какая функция поворота вокруг вектора, пересчитывающая другой ветор, или функция вычисления матрицы поворота по вектору и углу?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.06.2012, 08:06
Я подобрал для вас темы с готовыми решениями и ответами на вопрос А есть ли здесь функция поворот вектора вокруг вектора? (OpenGL):

Поворот колеса вокруг центра
Привет Решил побаловаться с OpenGL и написать простенький просмотрщик .obj...

Поворот объекта вокруг оси
Здравствуйте. Знаю что подобная тема уже поднималась на форуме, но интересующий...

Загадочный поворот вокруг оси x в OpenGL
Доброго времени суток всем. Мучаюсь над одной проблемой, а именно: поворот...

Поворот вокруг своей оси (blender)
Глупый вопрос, но всёравно задаю его. Как повернуть объект вокруг своей оси?...

Поворот вокруг произвольной оси в пространстве
Готовлюсь к экзамену, говорят препод ловит на всяких двусмысленностях и...

Не удается реализовать поворот елки вокруг своей оси по x и по у
У меня такая проблема, в OpenGL я почти ничего не понимаю, но ёлку реализовать...

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

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

Добавлено через 1 минуту
Цитата Сообщение от Ingvar50 Посмотреть сообщение
там описана матрица перехода между двумя системами координат в общем виде.
Я тебе и без справочника её выведу. Но для этого нужны не базис и вектор, а два базиса по три вектора в каждом.
0
Ingvar50
8 / 8 / 1
Регистрация: 26.11.2008
Сообщений: 43
23.06.2012, 13:10 #4
Тебе надо сделать привязку поворачиваемого ветора к локальной системе координат вектора вокруг которого поворачиваешь и лишь потом поворачивашь на угол
0
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
23.06.2012, 13:42  [ТС] #5
Цитата Сообщение от Ingvar50 Посмотреть сообщение
к локальной системе координат вектора вокруг которого поворачиваешь
Бред не неси. Нет и не может быть системы координат одного отдельно взятого вектора, всякая система координат строится только на системе же базисных векторов, в этой системе координат являющихся ортами её координатных осей. Их минимум две, а вращать можно как минимум в пространстве, то есть с тремя осями: по которой крутишь + оси, определяющие перпендикулярную ей плоскость. Нельзя крутить что либо в двумерном пространстве, всякая матрица двумерного поворота неявно вводит третье измерение и только в трёхмерном пространстве можно повернуть плоскость этого пространства. Если не веришь, попробуй описать, как ты себе представляешь поворот всего трёхмерного пространства вокруг оси, ему не принадлежащей. Есть поворот в плоскости, но он происходит вокруг оси, перпендикулярной всей плоскости. По аналогии опиши вращение не в плоскости xy, а во всём пространстве. Вокруг какой оси оно будет происходить? Только вокруг оси четвертого измерения, так как только оно перпендикулярно всем пространству. При повороте в плоскости на 90 все оси меняются местами и одна меняет знак. Аналогично при повороте во всём пространстве все три оси меняются местами. Вокруг чего можно так повернуть? Если вокруг одной из трёх обычных осей, то она сама сохраняет аутентичность, на какой угол её не крути. А на одном векторе можно построить только ось одномерной координаты (именно в единственном числе и это не система). Или проще ось положения по длине. Нельзя построить матрицу однозначного и обратимого преобразования из трёхмерных координат в одномерные. Можно только спроецировать пространство на вектор, но два измерения при этом теряются и однозначного обратного преобразования уже не будет.
0
NoMasters
Псевдослучайный
1909 / 1120 / 90
Регистрация: 13.09.2011
Сообщений: 3,179
23.06.2012, 16:17 #6
Матрица поворота по двум перпендикулярным векторам(вперёд и вверх) считается элементарным образом. Автор, иди наконец книжку какую-нибудь прочитай, сколько можно задавать дурацкие вопросы?
1
snake32
1641 / 1095 / 191
Регистрация: 26.02.2009
Сообщений: 4,060
Записей в блоге: 5
23.06.2012, 16:21 #7
http://ru.wikipedia.org/wiki/%D0%9C%...BE%D1%82%D0%B0
В самый конец листай и увидишь матрицу поворота по углу и оси вращения
1
Ingvar50
8 / 8 / 1
Регистрация: 26.11.2008
Сообщений: 43
23.06.2012, 16:29 #8
Я не знаю, что ты подразумеваешь под словом "вектор", но лично я под словом "вектор" понимаю положение какого-то объекта в той системе координат которую определил в программе изначально. Так что если у меня в программе присутствуют 2 и более объектов имеющих свои координаты (x, y, z), то это и есть вектор положение конкретного объекта в определенном мной пространстве.
В одном из переводных уроков NeHe описывающих отбрасывание тени источник осывещения привязывается к системе координат объекта на который падает свет.
Так что если мне надо повернуть один вектор относительно другого, то это лишь означает что я дложен повернуть один объект относительно другого.
Для этого надо определять локальную систему координат объекта относительно которго будешь вращать второй объект. В связи с этим строишь матрицу перехода между системами координат и уже в новой системе координат вычисляешь положение вращаемого объекта. Это во-первых.
Во вторых, все это описано в специализированных учебниках по математике.
Могу порекомендовать почитать книги посвященные кватернионам которые непосредственно используются в задачах пространственной ориентации объектов, в том чесле друг относительно друга. Одна из таких книг: Применение кватарнионов в задачах ориентации твердого тела Бранец, Шмыглевский
И в-последних. В Интернете попадался пример, в котором один шар вращался относительно другого (по моемому был на delphi)
0
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
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
Ingvar50
8 / 8 / 1
Регистрация: 26.11.2008
Сообщений: 43
25.06.2012, 09:31 #10
У тебя изначально оба вектора описывают местоположение объектов в мировой системе координат.
И как я понимаю у тебя стоит задача повернуть один объект вокруг другого.
Поэтому поэтому я еще раз повторяю, что тебе надо сформировать локальную ситсему координат расположенной в точке с координатами описывающий объект вокруг которого поворачиваешь.
При этом ты должен сформировать матрицу перехода от мировой ситсемы координат к сформированной локальной системе координат, после чего пересчитываешь координаты поворачиваемого объекта в локальную ситему координат первого объекта и лишь потом осуществляешь поворот. Для того чтобы у тебя были координаты повернутого объекта в мироваой системе координат тебе надо пересчитать через матрицу обратного перехода от локальной к мировой системе координат. Задачи подобного рода относятся в большей степени к задачам небесной механики.
А вообще посмотри урок № 44 NeHe Эффект световых бликов с проверкой видимости. и дополнение к этому уроку Урок по OpenGL. Класс камеры на основе кватернионов.
раположенных на сайте http://pmg.org.ru/nehe/index.html
0
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
25.06.2012, 09:40  [ТС] #11
Ingvar50, локальную систему координат нельзя построить на одном векторе, но я уже выкрутился, найдя соответствия в новой системе для всех трёх осей: нормаль=z, направление на северную точку математического горизонта=y, направление на восточную точку математического горизонта=x. В точке пересечения экватора с нулевым меридианом эта система параллельна и изомсштабна мировой и отличается только сдвигом начала координат, что учитывается не матрицей вращения.
0
Ingvar50
8 / 8 / 1
Регистрация: 26.11.2008
Сообщений: 43
27.06.2012, 09:46 #12
Продолжение к предыдущему Посмотри Вот эту статью посвященную работе с кватернионами http://www.gamedev.ru/code/articles/?id=4215
0
XAHOK
265 / 258 / 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
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
27.06.2012, 10:43  [ТС] #14
Про кватернионы я читал. Но ни как не могу понять, зачем они вообще нужны. Пространство то трёхмерно.
0
XAHOK
265 / 258 / 20
Регистрация: 27.02.2009
Сообщений: 694
Записей в блоге: 7
27.06.2012, 11:11 #15
Цитата Сообщение от taras atavin Посмотреть сообщение
Про кватернионы я читал. Но ни как не могу понять, зачем они вообще нужны. Пространство то трёхмерно.
Они нужны для ускорения подготовки данных для рендера. Работа с матрицами более трудоемка по ресурсам, чем работа с векторами.

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

Добавлено через 35 секунд
А потом их ещё перемножать.
0
27.06.2012, 13:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2012, 13:54
Привет! Вот еще темы с решениями:

Модель вектора тяги
Уважаемые господа ... всем доброго времени суток ... помогите пожалуйста...

Стрелка для вектора, масштабирование
Привет. необходимо сделать следующее : рисуется ломанная в 3д (с перемещением...

Перемещение объект в сторону вектора камеры
Делал, чтобы обьект передвигался вперед таким способом:void...

Умножение вектора на матрицу, увеличить скорость работы
Доброго времени суток, пишу простые гоночки(OpenGL ES 2). В общем нужно...


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

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

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