Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Глобальный поворот

44K
02 июня 2010 года
Jnis
12 / / 08.01.2009
Вот у нас есть функции поворота, например в OpenGL glrotatef(w,x,y,z) или x3d rotate="x y z w". Интересует именно работа с параметрами функции x,y,z,w - как изменить их, что бы повернуть объект глобально(вокруг глобальных осей). То есть что это за параметры, почему именно они взяты в качестве хранителя поворота(типа спин), а так же формулы, с помощью которых например можно повернуть повернутый имеющийся объект, зная данные параметры, относительно глобальных осей например на 90 градусов.
Если есть ссылки где об этом можно дайте плиз.
Еще не плохо формулу, как вручную точку A(x,y,z) с помощью данных параметров повернуть и получить A'(x',y',z')
307
03 июня 2010 года
Artem_3A
863 / / 11.04.2008
http://www.firststeps.ru/mfc/opengl/r.php?11
http://www.opengl.org/sdk/docs/man/xhtml/glRotate.xml
http://fly.cc.fer.hr/~unreal/theredbook/appendixg.html

ответ на ваш вопрос содержится уже первой ссылкой. все формулы доходчиво приведены в второй и особеноо последней ссылки.

ЗЫ: гугл рулит!!!=)))
44K
03 июня 2010 года
Jnis
12 / / 08.01.2009
в первой ссылке в общем-то показана сама проблема, что глротейт поворачивает текущую матрицу на угол, тобиш локально.
третья ссылка не работает.
Вторая ссылка - что-то близко, нашел русский аналог ее и части того что интересует тут http://opengl.gamedev.ru/doc/?func=glRotate .
то есть мне как бы нужны именно операции в формулах работы с данным вектором(xyzw) и похоже "текущей матрицей".(описание матрицы,умножение матрицы на вектор,получение из матрицы обобщенного вектора xyzw)
зы: Пишу 3d редактор объектов, переводящий потом в файл x3d(аналог vrml). Тоесть мне нужно как бы сложить работу множество rotate векторов, но глобальных.
307
03 июня 2010 года
Artem_3A
863 / / 11.04.2008
вы вообще чего хотите то? что вы понимаете под повернуть глобально\локально? существуют базовые операции: вращение вокруг осей, перенос, масштабирование, проекция. все остальное их комбинации.
44K
03 июня 2010 года
Jnis
12 / / 08.01.2009
под локально: поворот объекта относительно собственных осей (типа как самолет поворачивает)
под глобально: поворот объекта относительно глобальных осей (например, тот же самолет и он както повернулся. но нам хочется его взять и повернуть относительно того как мы его видим, а не относительно его осей. К примеру в blender есть global/local поворот, именно так же я и хочу сделать.)

причем мне эти повороты нужно не в какойнить опенгл или директе реализовать, а собственным средствами.
307
03 июня 2010 года
Artem_3A
863 / / 11.04.2008
ладно, тогда давайте так, дабы не путаться в терминах: Есть одна единственная ось координат, реальная. Для локального поворота, то есть, к примеру, объект крутиться вокруг своей оси(я правильно понял?), делаем следующие: перемещаем объект в центр координат, производим поворот, перемещаем объект обратно. Глобальный поворот, объект вращается относительно некоторой удаленной от него точки: производим поворот.
Действия все эти производятся по средствам матриц преобразований, любое действие может быть описано произведением матриц базовых преобразований: перемещение, поворот, масштабирование. Тогда дабы выполнить это преобразование над некоторой точкой необходимо перемножить данную точку в виде вектора на матрицу преобразования.
О базовых преобразованиях читаем тут или в книжке Виктора Порева "Компьютерная графика. Учебное пособие".
5
03 июня 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: Artem_3A
вы вообще чего хотите то? что вы понимаете под повернуть глобально\локально?

Глобально - это видимо камеру повернуть. Локально - сам объект.

44K
03 июня 2010 года
Jnis
12 / / 08.01.2009
Локальный поворот: http://file.qip.ru/file/130977267/b455f302/Local.html
Глобальный поворот: http://file.qip.ru/file/130977221/395a9333/Global.html
========
Немного кода *.x3d, для того чтоб объяснить что мне нужно сделать:
 
Код:
<Transform rotation="-1  0  0  1.57">  //аналог glrotate(1.57,-1,0,0)
   <Shape> /*тут типа сама модель фигуры*/ </Shape>
</Transform>

Вот у меня в редакторе должны фигуры создаваться как модель. Затем идет размещение на сцене, пользователь может поворачивать объект только вокруг глобальных осей. вот задача вычислить эти параметры, которые пихнуть в rotation.
зы: реализую на С++, сделал 2d интерфейс с переключением обзора с различных сторон. Когда идет размещение объекта, за место объекта должен отображается вектор направления, тобишь поворачивать только 1 точку.
44K
03 июня 2010 года
Jnis
12 / / 08.01.2009
Ммм, кажется я допер что нужно сделать:
1-Будем вращать обычную точку A(1,0,0), с помощью "простых" поворотов вокруг осей ( РЕШЕНИЕ: матрицы тут )
2-затем необходимо найти перпендикуляр к плоскости A'(x,y,z) O(0,0,0) X(1,0,0) , это и будут координаты x y z для rotate (РЕШЕНИЕ: ниже или тут)
3-затем находим угол между векторами XO^OA' , это и будет параметр w (РЕШЕНИЕ: тут )
тока возможны проблемы с поворотом не в ту сторону...
44K
03 июня 2010 года
Jnis
12 / / 08.01.2009
Или план номер 2:
1-поворачиваем сразу 2 точки A(1,0,0) и B(0,1,0) ,таким образом мы всегда будем иметь перпендикуляр
2-находим угол между векторами XO^OA' , это будет w

один минус-исключение ручного изменения вектора A, мб кто знает как найти перпендикуляр к плоскости??
--------------
Придумал пока такой, годящийся только для данной задачи:
-поворачиваем A' вокруг оси Ox (получаем что A'OX перпендикулярна A''OX)
-а так так у нас одна сторона треугольников лежит на оси Ох, то мы можем координату x'' у A'' , x''=0 , и ОA'' получится нашим перпендикуляром
единственные исключительные ситуации, это когда А' будет лежать на оси Ох:
A'(1,0,0) , в этом случае можно A''(1,0,0) w=0
A'(-1,0,0) , в этом случае можно A''(1,0,0) w=3.14 (180градусов)

наверно последний вопрос: Никто не знает как найти перпендикуляр(нормаль) к плоскости? нашел, наверно
44K
07 июня 2010 года
Jnis
12 / / 08.01.2009
ВОПРОС:
вот у нас 2 вектора поворота V1(x1,y1,z1) и V2(x2,y2,z2). точка вращается сначала вокруг первого на угол Alfa, а потом вокруг второго на угол Beta.
Как преобразовать эти два поворота в один поворот вокруг V3(x3,y3,z3) на угол Gama??
307
07 июня 2010 года
Artem_3A
863 / / 11.04.2008
эх... не знаю я какой теорией вы пользуетесь выписывая все это... но в теории(и практике) которую освоил я, повороты задавались матрицами преобразований, и что бы совместить два поворота в одно преобразование достаточно было перемножить данные матрицы, результатом являлась бы матрица описывающая требуемый поворот... ну раз уж у вас повороты описываются векторами, то читайте ка ту документацию, где вы это вычитали, бо не знаю, как другие форумчане, но я вас не понимаю, а следовательно ни чем помочь не могу, имхо!
44K
07 июня 2010 года
Jnis
12 / / 08.01.2009
ну я пользуюсь вот этой матрицей, с википедии. На входе вектор V длиной=1, и угол O.
Просто я в функцию подаю вращаемый вектор Т, вектор V и угол O. Она точку Т поворачивает вокруг V на угол О, умножая T на матрицу.
44K
08 июня 2010 года
Jnis
12 / / 08.01.2009
Вот наглядное представление этого дела:
1 вариант: Вращение вокруг оси V1(0,1,0) на угол 45°, а затем вокруг V2(0.7,0.7,0) на 90°.
2 вариант: Вращение вокруг V3(x,y,z), на угол Alfa

Помогите эти x,y,z и Alfa найти :)
44K
08 июня 2010 года
Jnis
12 / / 08.01.2009
Вощем нашел как это сделать через Кватернионы, тут снизу:
Цитата:
Как же хранят вращение в кватернионе? Практически также как и в "Axis Angle" представлении, первые три компонента представляют вектор, лежащий на оси вращения, причем длина вектора зависит от угла поворота. Четвертый компонент зависит только от величины угла поворота. Зависимость довольно простая — если взять единичный вектор V за ось вращения и угол alpha за вращение вокруг этой оси, тогда кватернион представляющий это вращение
можно записать как:

q = [ V*sin(alpha/2), cos(alpha/2) ]


Тобишь получил вот такой код:

Код:
struct vector{
  double x,y,z; // Вектор
};

void MulQuaternions(vector &V1, double &Alfa1, vector &V2, double &Alfa2){  //умножает два кватерниона, находя сумму двух поворотов
    double A, B, C, D, E, F, G, H;
    A=(Alfa1+ V1.x) * (Alfa2+ V2.x);
    B=(V1.z - V1.y) * (V2.y - V2.z);
    C=(V1.x - Alfa1)* (V2.y + V2.z);
    D=(V1.y + V1.z) * (V2.x - Alfa2);
    E=(V1.x + V1.z) * (V2.x + V2.y);
    F=(V1.x - V1.z) * (V2.x - V2.y);
    G=(Alfa1+ V1.y) * (Alfa2- V2.z);
    H=(Alfa1- V1.y) * (Alfa2+ V2.z);
    Alfa1=B+(-E-F+G+H)*0.5;
    V1.x= A-(E+F+G+H)*0.5;
    V1.y=-C+(E-F+G-H)*0.5;
    V1.z=-D+(E-F-G+H)*0.5;
}

void ToQuaternion(vector &V, double &Alfa){  //переводит AxisAngle(УглыОси) представление в кватернион
    V.x*=sin(Alfa/2.);
    V.y*=sin(Alfa/2.);
    V.z*=sin(Alfa/2.);
    Alfa=cos(Alfa/2.);
}

void OutQuaternion(vector &V, double &Alfa){  //переводит из кватерниона в AxisAngle(УглыОси) представление
    Alfa=acos(Alfa)*2.;
    V.x/=sin(Alfa/2.);
    V.y/=sin(Alfa/2.);
    V.z/=sin(Alfa/2.);
}

...
    //пример нахождения сдвига как в анимации
    vector A1={0 ,1 ,0 },A2={0, 0,1};
    double a1=0.785,a2=1.57 ;
    ToQuaternion(A1,a1);
    ToQuaternion(A2,a2);
    MulQuaternions(A1,a1,A2,a2);
    OutQuaternion(A1,a1); //Результат


Если ктото найдет как найти сложение поворотов в AxisAngle(УглыОси) представлении, напишите плиз
5
08 июня 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: Jnis
Если ктото найдет как найти сложение поворотов в AxisAngle(УглыОси) представлении, напишите плиз


Кватернионы удбнее чем Углы-Оси, так как при использование последних можно получить проблемы с ориентацией объекта, именно поэтому кватернионы используют в геймдеве. ;)

44K
08 июня 2010 года
Jnis
12 / / 08.01.2009
Проблемы там не в ориентации, а в руках. Все rotate(glrotate) используют углы оси, думаете просто так?
Кватернионы слишком специализированы, ты ими даже вращение часовой стрелки не запрограммируешь, тк их диапазон 180 градусов(вобщем-то с матрицами вроде таже проблема). Их вроде как для вращения камеры или плавной анимации в играх применяют, ибо они хорошо интерполируются и можно получить плавное вращение камеры. Так что в каждой системе есть свои + и -.
зы: эт судя по тому что я начитал

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог