<Transform rotation="-1 0 0 1.57"> //аналог glrotate(1.57,-1,0,0)
<Shape> /*тут типа сама модель фигуры*/ </Shape>
</Transform>
Глобальный поворот
Если есть ссылки где об этом можно дайте плиз.
Еще не плохо формулу, как вручную точку A(x,y,z) с помощью данных параметров повернуть и получить A'(x',y',z')
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
ответ на ваш вопрос содержится уже первой ссылкой. все формулы доходчиво приведены в второй и особеноо последней ссылки.
ЗЫ: гугл рулит!!!=)))
http://www.opengl.org/sdk/docs/man/xhtml/glRotate.xml
http://fly.cc.fer.hr/~unreal/theredbook/appendixg.html
ответ на ваш вопрос содержится уже первой ссылкой. все формулы доходчиво приведены в второй и особеноо последней ссылки.
ЗЫ: гугл рулит!!!=)))
третья ссылка не работает.
Вторая ссылка - что-то близко, нашел русский аналог ее и части того что интересует тут http://opengl.gamedev.ru/doc/?func=glRotate .
то есть мне как бы нужны именно операции в формулах работы с данным вектором(xyzw) и похоже "текущей матрицей".(описание матрицы,умножение матрицы на вектор,получение из матрицы обобщенного вектора xyzw)
зы: Пишу 3d редактор объектов, переводящий потом в файл x3d(аналог vrml). Тоесть мне нужно как бы сложить работу множество rotate векторов, но глобальных.
вы вообще чего хотите то? что вы понимаете под повернуть глобально\локально? существуют базовые операции: вращение вокруг осей, перенос, масштабирование, проекция. все остальное их комбинации.
под глобально: поворот объекта относительно глобальных осей (например, тот же самолет и он както повернулся. но нам хочется его взять и повернуть относительно того как мы его видим, а не относительно его осей. К примеру в blender есть global/local поворот, именно так же я и хочу сделать.)
причем мне эти повороты нужно не в какойнить опенгл или директе реализовать, а собственным средствами.
Действия все эти производятся по средствам матриц преобразований, любое действие может быть описано произведением матриц базовых преобразований: перемещение, поворот, масштабирование. Тогда дабы выполнить это преобразование над некоторой точкой необходимо перемножить данную точку в виде вектора на матрицу преобразования.
О базовых преобразованиях читаем тут или в книжке Виктора Порева "Компьютерная графика. Учебное пособие".
Цитата: Artem_3A
вы вообще чего хотите то? что вы понимаете под повернуть глобально\локально?
Глобально - это видимо камеру повернуть. Локально - сам объект.
http://file.qip.ru/file/130977267/b455f302/Local.html
Глобальный поворот: http://file.qip.ru/file/130977221/395a9333/Global.html
========
Немного кода *.x3d, для того чтоб объяснить что мне нужно сделать:
Вот у меня в редакторе должны фигуры создаваться как модель. Затем идет размещение на сцене, пользователь может поворачивать объект только вокруг глобальных осей. вот задача вычислить эти параметры, которые пихнуть в rotation.
зы: реализую на С++, сделал 2d интерфейс с переключением обзора с различных сторон. Когда идет размещение объекта, за место объекта должен отображается вектор направления, тобишь поворачивать только 1 точку.
Локальный поворот:
Глобальный поворот: http://file.qip.ru/file/130977221/395a9333/Global.html
========
Немного кода *.x3d, для того чтоб объяснить что мне нужно сделать:
Код:
Вот у меня в редакторе должны фигуры создаваться как модель. Затем идет размещение на сцене, пользователь может поворачивать объект только вокруг глобальных осей. вот задача вычислить эти параметры, которые пихнуть в rotation.
зы: реализую на С++, сделал 2d интерфейс с переключением обзора с различных сторон. Когда идет размещение объекта, за место объекта должен отображается вектор направления, тобишь поворачивать только 1 точку.
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 (РЕШЕНИЕ: тут )
тока возможны проблемы с поворотом не в ту сторону...
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градусов)
наверно последний вопрос: Никто не знает как найти перпендикуляр(нормаль) к плоскости? нашел, наверно
вот у нас 2 вектора поворота V1(x1,y1,z1) и V2(x2,y2,z2). точка вращается сначала вокруг первого на угол Alfa, а потом вокруг второго на угол Beta.
Как преобразовать эти два поворота в один поворот вокруг V3(x3,y3,z3) на угол Gama??
эх... не знаю я какой теорией вы пользуетесь выписывая все это... но в теории(и практике) которую освоил я, повороты задавались матрицами преобразований, и что бы совместить два поворота в одно преобразование достаточно было перемножить данные матрицы, результатом являлась бы матрица описывающая требуемый поворот... ну раз уж у вас повороты описываются векторами, то читайте ка ту документацию, где вы это вычитали, бо не знаю, как другие форумчане, но я вас не понимаю, а следовательно ни чем помочь не могу, имхо!
этой матрицей, с википедии. На входе вектор V длиной=1, и угол O.
Просто я в функцию подаю вращаемый вектор Т, вектор V и угол O. Она точку Т поворачивает вокруг V на угол О, умножая T на матрицу.
ну я пользуюсь вот
Просто я в функцию подаю вращаемый вектор Т, вектор V и угол O. Она точку Т поворачивает вокруг V на угол О, умножая T на матрицу.
тут снизу:
Если ктото найдет как найти сложение поворотов в AxisAngle(УглыОси) представлении, напишите плиз
Вощем нашел как это сделать через Кватернионы,
Цитата:
Как же хранят вращение в кватернионе? Практически также как и в "Axis Angle" представлении, первые три компонента представляют вектор, лежащий на оси вращения, причем длина вектора зависит от угла поворота. Четвертый компонент зависит только от величины угла поворота. Зависимость довольно простая — если взять единичный вектор V за ось вращения и угол alpha за вращение вокруг этой оси, тогда кватернион представляющий это вращение
можно записать как:
q = [ V*sin(alpha/2), cos(alpha/2) ]
можно записать как:
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); //Результат
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(УглыОси) представлении, напишите плиз
Цитата: Jnis
Если ктото найдет как найти сложение поворотов в AxisAngle(УглыОси) представлении, напишите плиз
Кватернионы удбнее чем Углы-Оси, так как при использование последних можно получить проблемы с ориентацией объекта, именно поэтому кватернионы используют в геймдеве. ;)
Кватернионы слишком специализированы, ты ими даже вращение часовой стрелки не запрограммируешь, тк их диапазон 180 градусов(вобщем-то с матрицами вроде таже проблема). Их вроде как для вращения камеры или плавной анимации в играх применяют, ибо они хорошо интерполируются и можно получить плавное вращение камеры. Так что в каждой системе есть свои + и -.
зы: эт судя по тому что я начитал