С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/14: Рейтинг темы: голосов - 14, средняя оценка - 4.79
 Аватар для Jnis
13 / 13 / 2
Регистрация: 06.01.2009
Сообщений: 70

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

02.06.2010, 19:54. Показов 2652. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот у нас есть функции поворота, например в OpenGL glrotatef(w,x,y,z) или x3d rotate="x y z w". Интересует именно работа с параметрами функции x,y,z,w - как изменить их, что бы повернуть объект глобально(вокруг глобальных осей). То есть что это за параметры, почему именно они взяты в качестве хранителя поворота(типа спин), а так же формулы, с помощью которых например можно повернуть повернутый имеющийся объект, зная данные параметры, относительно глобальных осей например на 90 градусов.
Если есть ссылки где об этом можно дайте плиз.

Добавлено через 34 минуты
Еще не плохо формулу, как вручную точку A(x,y,z) с помощью данных параметров повернуть и получить A'(x',y',z')
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.06.2010, 19:54
Ответы с готовыми решениями:

Глобальный перехват
Доброго времени суток! Может кто-нибудь подскажет как организовать глобальный перехват клавиш без dll которая должна устанавливать хуки?

Глобальный динамический массив
в общем делаю одно задание в котором нужно создать некий динамический массив классов ну и далее работать с ними, при этом нужно...

Глобальный перехват клавиши
Мне нужно глобально перехватит клавишу чтобы при нажатии на Shift + num1 (цыфра 1) закрывало програму.

2
 Аватар для Jnis
13 / 13 / 2
Регистрация: 06.01.2009
Сообщений: 70
04.06.2010, 21:03  [ТС]
Локальный поворот: http://file.qip.ru/file/130977... Local.html
Глобальный поворот: http://file.qip.ru/file/130977... lobal.html
========
Пишу 3d редактор объектов, переводящий потом в файл x3d(аналог vrml).Немного кода *.x3d, для того чтоб объяснить что мне нужно сделать:
HTML5
1
2
3
<Transform rotation="-1  0  0  1.57">  //аналог glrotate(1.57,-1,0,0)
   <Shape> /*тут типа сама модель фигуры*/ </Shape>
</Transform>
Вот у меня в редакторе должны фигуры создаваться как модель. Затем идет размещение на сцене, пользователь может поворачивать объект ТОЛЬКО ВОКРУГ ГЛОБАЛЬНЫХ осей. вот задача вычислить эти параметры, которые пихнуть в rotation.
зы: реализую на С++, сделал 2d интерфейс с переключением обзора с различных сторон. Когда идет размещение объекта, за место объекта должен отображается вектор направления, тобишь поворачивать только 1 точку.

Добавлено через 3 часа 7 минут
Ммм, кажется я допер что нужно сделать:
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 (РЕШЕНИЕ: ниже или тут)


--------------
Придумал пока такой, годящийся только для данной задачи:
-поворачиваем 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градусов)

-------------- угол между векторами 3D
Формула высчитывается из скалярного произведения векторов:
<A,B>=|A|*|B|*cos(alfa)
alfa=acos( <A,B>/(|A|*|B|) )
<A,B>=A.x*B.x + A.y*B.y + A.z*B.z //скалярное произведение векторов (матричное так сказать: <A,B>=A*T(B))
|A|=sqrt(A.x*A.x + A.y*A.y + A.z*A.z) //и |B| длины векторов
Сами A и B - вектора. К примеру(вдруг кто незнает), нам нужно найти угол XO^OK , где X(x1,y1,z1) , O(x2,y2,z2) и K(x3,y3,z3), то
A(x2-x1, y2-y1, z2-z1)
B(x3-x2, y3-y2, z3-z2) //как бы координаты конца минус координаты начала
1
 Аватар для Jnis
13 / 13 / 2
Регистрация: 06.01.2009
Сообщений: 70
08.06.2010, 03:48  [ТС]
ВОПРОС:
вот у нас 2 вектора поворота V1(x1,y1,z1) и V2(x2,y2,z2). точка вращается сначала вокруг первого на угол Alfa, а потом вокруг второго на угол Beta.
Как преобразовать эти два поворота в один поворот вокруг V3(x3,y3,z3) на угол Gama??

Добавлено через 7 часов 11 минут
Вот наглядное представление этого дела:
1 вариант: Вращение вокруг оси V1(0,1,0) на угол 45°, а затем вокруг V2(0.7,0.7,0) на 90°.
2 вариант: Вращение вокруг V3(x,y,z), на угол Alfa

Помогите эти x,y,z и Alfa найти

Добавлено через 1 час 42 минуты
Вощем нашел как это сделать через Кватернионы, тут снизу:
Как же хранят вращение в кватернионе? Практически также как и в "Axis Angle" представлении, первые три компонента представляют вектор, лежащий на оси вращения, причем длина вектора зависит от угла поворота. Четвертый компонент зависит только от величины угла поворота. Зависимость довольно простая — если взять единичный вектор V за ось вращения и угол alpha за вращение вокруг этой оси, тогда кватернион представляющий это вращение
можно записать как:

q = [ V*sin(alpha/2), cos(alpha/2) ]
Тобишь получил вот такой код:
Code
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
33
34
35
36
37
38
39
40
41
42
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(УглыОси) представлении, напишите плиз
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.06.2010, 03:48
Помогаю со студенческими работами здесь

Глобальный вопрос по Builder c++
Очень часто наблюдаю такую неприятную штуку с Билдером. Очень часто меняю системное время для проверки работы своих программ, и после этого...

Глобальный хук. Довести до ума
Здравствуйте, решил изучить механизмы хуков, почитал статьи. Появились вопросы. Вот собственно если делать глобальный хук, то функцию...

Глобальный перехват нажатой клавиши
Здравствуйте Ув. Программисты :) У меня такой вопрос; Как можно глобально перехватить нажатую клавишу ? Напишите с комментариями ...

Глобальный отлов кликов мыши в системе
Как можно определить нажатие мыши, независимо в окне или нет? То есть приложение может быть свернуто и т.п. Кроме использования хуков.

Глобальный TFormatSettings в последних версиях билдера
В 2010-м билдере было очень удобно объявлять TFormatSettings целиком для всей формы. То есть внутри формы уже был объект класса...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru