Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/60: Рейтинг темы: голосов - 60, средняя оценка - 4.93
13 / 13 / 4
Регистрация: 24.02.2011
Сообщений: 64

(OpenGL)Преобразование координат с помошью gluUnProject()

09.05.2011, 22:22. Показов 11235. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уважаемые форумчане, делаю проект определение изоморфичности двух графов на OpenGL с помошью билиотеки BGL. Но столкнулся с такой проблемой, мне нужно добавлять вершины графа кликом мышы, накопал код преобразования оконных координат в сценовые (вроде правильный), но почему то он не возрашает результат думаю ошибка в вызове gluUnProject().
Вот сам код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Pointxy GetOGLPos(int x, int y){
                GLint viewport[4];
                GLdouble modelview[16];
                GLdouble projection[16];
                GLfloat winX, winY, winZ;
                GLdouble posX=0, posY=0, posZ=0;
 
                glGetDoublev( GL_MODELVIEW_MATRIX, modelview );
                glGetDoublev( GL_PROJECTION_MATRIX, projection );
                glGetIntegerv( GL_VIEWPORT, viewport );
 
                winX = (float)x;
                winY = (float)viewport[3] - (float)y;
                glReadPixels( x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );
 
                gluUnProject( winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);
                
                Pointxy ret;
                ret.x=posX;
                ret.y=posY;
                ret.z=posZ;
                return ret;
            }
вызываю так
C++
1
2
3
4
5
POINT CursorPos;
            GetCursorPos(&CursorPos);
            std::cout<<CursorPos.x<<" "<<CursorPos.y<<std::endl;
            Pointxy qwe=GetOGLPos((int)CursorPos.x,(int)CursorPos.y);
            std::cout<<qwe.x<<" "<<qwe.y<<" "<<qwe.z<<std::endl;
выводит соответствено координаты "x y" и "0 0 0"
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.05.2011, 22:22
Ответы с готовыми решениями:

Некорректная работа gluUnProject OpenGL
Здравствуйте, у меня возник следующий вопрос. Совсем запутанная ситуация. Необходимо найти координаты OpenGL. Я делаю это след образом....

gluUnProject, gluProject - как без них в OpenGL 3.3
Здравствуйте программисты! Вот пишу проэкт в Qt c использованием OpenGL. Может не все знают, но в альфа версии Qt 5.1.0 уже встраиваются...

Как с помощью gluUnProject получить OpenGL координаты в перспективном режиме?
Как с помощью gluUnProject получить OpenGL координаты (X и Y) в перспективном режиме? gluPerspective ( 43.5F,...

7
 Аватар для snake32
3502 / 1685 / 236
Регистрация: 26.02.2009
Сообщений: 8,377
Записей в блоге: 6
12.05.2011, 17:32
adico,
C++
1
glReadPixels( x, int(winY), 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ );
Находит z ближайшего объекта под курсором. Если под курсором ничего нет, то, по идеи, возвращается 1.0 - а это соответствует точки пересечения луча под мышой с дальней отсекающей плоскостью. Если вообще zBuffer включен. Сомниваюсь что у вас граф всегда рисуется на границе отсечения. Граф плоский?
0
13 / 13 / 4
Регистрация: 24.02.2011
Сообщений: 64
12.05.2011, 20:57  [ТС]
Пока плоский, мне бы хотябы для плоского разобратся.
0
 Аватар для snake32
3502 / 1685 / 236
Регистрация: 26.02.2009
Сообщений: 8,377
Записей в блоге: 6
12.05.2011, 22:18
Тогда ищите точку пересечения с плоскостью. Например, граф в плоскости xOy, то есть z координаты всех его вершин = 0, тогда:
C++
1
2
3
4
5
6
7
8
  // точка на ближайшей отсекающей плоскости
  gluUnProject( winX, winY, 0.0, modelview, projection, viewport, &posnear.x, &posnear.y, &posnear.z);
  // точка на дальней отсекающей плоскости
  gluUnProject( winX, winY, 1.0, modelview, projection, viewport, &posfar.x, &posfar.y, &posfar.z);
  vec3 mouseRay = posfar - posnear; // вектор под мышой
  vec3 n = vec3( 0.0, 0.0, 1.0 );//нормаль к плоскости x=0;y=0;z=1;
  float t = (n & ( -mouseRay ))/(n & mouseRay);
  vec3 pos = posnear + t*mouseRay; // собственно точка пересечения
Как наверно вы заметили я сильно упростил благодаря классу vec3, который на самом деле несёт в себе только 3 значения x,y,z. Благодаря этому и перегрузки операторов можно добиться очень короткого и понятного кода. Единственное что надо запомнить что выражение типа float t = a & b - это скалярное произведение векторов a и b. Все остальные операторы фактически делают поэлементные операции знакомые всем, например:
C++
1
2
3
4
5
6
7
8
9
10
11
vec3 mouseRay = posfar - posnear;
//можно представить как
mouseRay.x = posfar.x - posnear.x;
mouseRay.y = posfar.y - posnear.y;
mouseRay.z = posfar.z - posnear.z;
// или вот:
vec3 pos = posnear + t*mouseRay;
// на самом деле это:
pos.x = posnear.x + t*mouseRay.x;
pos.y = posnear.y + t*mouseRay.y;
pos.z = posnear.z + t*mouseRay.z;
Видите сколько лишнего прячется?
0
13 / 13 / 4
Регистрация: 24.02.2011
Сообщений: 64
12.05.2011, 22:33  [ТС]
Уважаемый snake32, я понимаю ход дальнейших преобразований, но после вот этого кода
C++
1
2
3
4
5
CVector posnear,posfar;\\ мой класс
 // точка на ближайшей отсекающей плоскости
  gluUnProject( winX, winY, 0.0, modelview, projection, viewport, &posnear.x, &posnear.y, &posnear.z);
  // точка на дальней отсекающей плоскости
  gluUnProject( winX, winY, 1.0, modelview, projection, viewport, &posfar.x, &posfar.y, &posfar.z);
в posfar.x, posfar.y, posfar.z и в posnear.x, posnear.y, posnear.z значения равны 0(там конструктор дефолтит нулями), как я понимаю пока эти функции не будут возращать хоть какиенибуть значения смысла от дальнейших преобразований я не вижу.=(
0
 Аватар для snake32
3502 / 1685 / 236
Регистрация: 26.02.2009
Сообщений: 8,377
Записей в блоге: 6
12.05.2011, 22:52
Входные параметры все адекватные?

Добавлено через 2 минуты
Контекст OpenGL включен?

Добавлено через 3 минуты
Что modelview, projection, viewport?
Может как-нить выложить их
0
13 / 13 / 4
Регистрация: 24.02.2011
Сообщений: 64
12.05.2011, 23:27  [ТС]
Например для тыка
C++
1
2
3
4
vx=543 xy=223; 
GLint    viewport[4]={0,0,640,480};   
GLdouble projection[16]={8.77, 0, 0, 0, 0, 8.77, 0, 0, 0, 1, -1, 0, 0, 0, 0};
GLdouble modelview[16]={1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, -360, 1};
как то так.
0
 Аватар для snake32
3502 / 1685 / 236
Регистрация: 26.02.2009
Сообщений: 8,377
Записей в блоге: 6
12.05.2011, 23:38
C++
1
gluPerspective (13, 1, 50, 0);
http://www.opengl.org/sdk/docs... ective.xml
Порадовала строчка:
1 угол обзора в градусах( обычно я ставлю от 30 до 60 )
2 коэф. viewport.width/viewport.height
3 ближняя отсекающая плоскость (расстояние от камеры) советуют ставить в 1 и нулём точно не может быть
4 дальняя отсекающая плоскость (расстояние от камеры). У вас получается она ближе ближней плоскости ) Выставляется в зависимости от задачи. Стараются как можно меньше для большей точности zBuffer'a. Но для начала с запасом поставте 1000. Из-за этого не могло работать. Странно что вообще отображало.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.05.2011, 23:38
Помогаю со студенческими работами здесь

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

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

Система координат и ее вращение. OpenGl и C++ Builder
пишу диплом на C++ с использованием openGL. Программа должна строить графики, поверхности первого и второго порядка в 3d-пространстве. ...

Преобразование координат
Здравствуйте. Помогите преобразовать координаты с помощью gluUnProject (или альтернатив) в перспективной проекции. В орто преобразует...

Преобразование оконных координат в левые
Вот я хочу написать морской бой,и нужно что бы при нажатии мышки проверялось поле.Но при использовании glutMouseFunc() координаты курсора...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
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