Форум программистов, компьютерный форум, киберфорум
Delphi: Графика, звук, видео
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/16: Рейтинг темы: голосов - 16, средняя оценка - 4.94
 Аватар для Zaxelf
85 / 85 / 59
Регистрация: 14.05.2010
Сообщений: 223

Вычисление координат фигуры в OpenGL

15.05.2011, 12:26. Показов 3271. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне нужна функция, при помощи которой я мог бы определять текущие координаты выбранного объекта. Например, я повернул систему на известный угол по каждой из осей, затем переместил систему на известное мне расстояние по каждой из осей.
Delphi
1
2
3
4
5
6
7
glpushmatrix;
glrotatef(A,rotX,0,0);
glrotatef(A,0,rotY,0);
glrotatef(A,0,0,rotZ);
gltranslate(X,Y,Z);
glusphere(Q,0.1,10,10);
glpushmatrix;
Порядок именно такой. Но нужна функция, с помощью которой я мог бы не выполнять поворот, а сразу выполнить перенос, но именно туда, куда перемещается фигура в вышеописанном случае.
Написал процедуру для этого.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
procedure newcoord(  oX,oY,oZ, AX, AY, AZ: glfloat; var X1,Y1,Z1: glfloat ); 
//// oX,oY,oZ: координаты до поворота
//// AX, AY, AZ:углы по всем осям
// X1,Y1,Z1:  конечные координаты 
var tX,tY,tZ, tX1,ty1,tz1, tx2,ty2,tz2  :glfloat;
begin
// поворот относительно X
TZ:=OZ*cos(AX/180*pi)-oy*sin(AX/180*pi);
ty:=oZ*sin(AX/180*pi)+oy*cos(AX/180*pi);
tx:=ox;
// поворот относительно Y
TX1:=TX*cos(AY/180*pi)-tz*sin(AY/180*pi);
tZ1:= tX*sin(AY/180*pi)+tz*cos(AY/180*pi);
tY1:=ty;
// поворот относительно Z
Tx2:=tx1*cos(AZ/180*pi)-ty1*sin(AZ/180*pi);
ty2:=tx1*sin(AZ/180*pi)+ty1*cos(AZ/180*pi);
tz2:=tz1;
z1:=tz2;
X1:=tx2;
Y1:=ty2;
end;
В результате фигура, оказывается рядом с той, которую я переместил, но это не совсем то.
Может быть кто-нибудь умеет выполнять эти операции при помощи матриц. Я умею перемножать матрицы, но не совсем понимаю, точнее совсем не понимаю, где искать координаты.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.05.2011, 12:26
Ответы с готовыми решениями:

Вычисление координат. OpenGL. C
Помогите пожалуйста. В чем проблема и как быть. Задание такое. Найти экстримальные (максимальное и минимальное) расстояния между...

Вычисление координат искомой точки, наиболее удаленной от начала координат
Составить программу решения следующей задачи. На плоскости (x,y) заданы точки {M1(X1, Y1),...,Mn(Xn, Yn)} и круга радиуса R с центром в...

Ввод координат фигуры
Подскажите,как можно ввести вот в такую структуру координат,мне нужно для прямоугольников и дальше я с ними буду работать.Просто идей 0,а в...

5
 Аватар для snake32
3502 / 1685 / 236
Регистрация: 26.02.2009
Сообщений: 8,398
Записей в блоге: 6
15.05.2011, 13:01
Zaxelf,
1. Не совсем понятно как вы используете glRotatef. Судя по док-тации http://www.opengl.org/sdk/docs... Rotate.xml последние 3 параметра ф-ии определяют вектор вокруг которого будет вращение и этот вектор должен быть нормализованным, у вас же он изменяется, в смысле длина его(или нет?), но в любом случае ГЛ будет нормализовать этот вектор.
2. Посмотрите как строятся матрицы. Они все описаны в документации. Только смотрите через FireFox это единственный браузер который корректно отображает формулы на этом сайте. По крайней мере у меня из 4х браузеров. Далее перемножайте матрицы в нужной вам последовательности и конечную матрицу умножайте на вершину(вектор) вида (x,y,z,1). В результате получите вершину(вектор) в уже перемещённом виде.
0
 Аватар для Zaxelf
85 / 85 / 59
Регистрация: 14.05.2010
Сообщений: 223
15.05.2011, 13:12  [ТС]
Вот у меня формула для умножения. Вектора на матрицу
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure VEC_MultMatrix(source:t3D; mat:tMatrix; var Dest:t3D);
begin
    Dest.x:=Source.x*mat[1][1]+
            Source.y*mat[2][1]+
            Source.z*mat[3][1]+
                     mat[4][1];
    Dest.y:=Source.x*mat[1][2]+
            Source.y*mat[2][2]+
            Source.z*mat[3][2]+
                     mat[4][2];
    Dest.z:=Source.x*mat[1][3]+
            Source.y*mat[2][3]+
            Source.z*mat[3][3]+
                     mat[4][3];
end;
Вот вопрос "mat[2][3]" 2- это строка или столбец?
И вот ещё glrotatef - выполняет умножение вектора, координаты которого передаются как аргументы на матрицу поворота или она как-то по-другому работает?
Я Вашу ссылку не смог открыть.
0
 Аватар для snake32
3502 / 1685 / 236
Регистрация: 26.02.2009
Сообщений: 8,398
Записей в блоге: 6
15.05.2011, 14:05
Цитата Сообщение от Zaxelf Посмотреть сообщение
Я Вашу ссылку не смог открыть.
странно, у меня работает. Mozilla FireFox 4.0 cкачайте. Может получится так http://www.opengl.org/sdk/docs/man/

Цитата Сообщение от Zaxelf Посмотреть сообщение
И вот ещё glrotatef - выполняет умножение вектора, координаты которого передаются как аргументы на матрицу поворота или она как-то по-другому работает?
glrotatef - генерирует матрицу поворота, которую домножает на текущую, то есть на ту которая сейчас активна в OpenGL. Обычно это GL_MODELVIEW.

Цитата Сообщение от Zaxelf Посмотреть сообщение
Вот вопрос "mat[2][3]" 2- это строка или столбец?
хороший вопрос. Попроуйте сами проверьте:

например, на матрице переноса формула по доке такая
Delphi
1
2
3
4
| 1 0 0 x |
| 0 1 0 y |
| 0 0 1 z |
| 0 0 0 1 |
Далее пишете следующий код
Delphi
1
2
3
4
5
6
7
8
9
10
var mat:TMatrix;
...
glMatrixMode(GL_MODELVIEW);
// текущая матрица - MODELVIEW
glLoadIdentity;
// установили текущую матрицу единичной
glTranslatef( x, y, z );// x,y,z - конкретные цифры которые занесутся в матрицу
// мы знаем что умнолжение любой матрицы(A) на единичную даст нам A
glGetFloatv( GL_MODELVIEW_MATRIX, @mat );
// после этой команды смотрим что занеслось в какую ячейку mat
После этого точно можно определить что считать столбцом, а что строкой
0
 Аватар для Zaxelf
85 / 85 / 59
Регистрация: 14.05.2010
Сообщений: 223
15.05.2011, 15:08  [ТС]
Вот я выполнил поворот по оси X, и у меня изменились числа во втором и третьем столбце матрицы. Теперь если я умножу точку, координаты которой мне были известны на эту матрицу, то будут ли это те самые координаты которые мне нужны?
0
 Аватар для snake32
3502 / 1685 / 236
Регистрация: 26.02.2009
Сообщений: 8,398
Записей в блоге: 6
15.05.2011, 15:27
Если всё сделали правильно, то - будут.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.05.2011, 15:27
Помогаю со студенческими работами здесь

Поиск координат фигуры
Здравсвуйте, подскажите пожалуйста, может кто знает, в геометри полный ноль, но появилась задача и нужно срочно ее решить, а я уже 4 день...

Qt + OpenGL не выводятся фигуры
Пытаюсь нарисовать простейшие примитивы, но не выходит. Фон устанавливается, буфер очищается, а фигуры не выводятся. Отладчиком...

Рисование фигуры в OpenGL
Здравствуйте, дан файл в котором имеется массив точек, нужно по нему построить точечное изображение фигуры. Вот мой код: #include...

Qt + OpenGL не выводятся фигуры
Пытаюсь нарисовать простейшие примитивы, но не выходит. Фон устанавливается, буфер очищается, а фигуры не выводятся. Отладчиком...

Система координат в opengl
Задание такое: нужно с помощью opengl отобразить трехмерную систему координат, в которой угол между осями равен 120 градусов, т.е. показать...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru