С Новым годом! Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/40: Рейтинг темы: голосов - 40, средняя оценка - 4.65
0 / 0 / 1
Регистрация: 24.09.2015
Сообщений: 33

Выбор объектов сцены мышью

18.12.2015, 22:33. Показов 7493. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть сцена с шарами. Нужно реализовать возможность выбора шара мышью.
Находил примеры, но они используют библиотеку glut. Как сделать без нее?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.12.2015, 22:33
Ответы с готовыми решениями:

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

Вращение сцены мышью
Всем доброго времени суток. Сижу, тренирусь в OpenGL. Сделал 3D фигуру, написал перемещение по сцене стрелками ("вращение...

Выделение объектов сцены центром экрана посредством камеры
Ку-ку, кодеры! Использую OpenGL 3.3+ c GLFW + GLSL. Пишу это все на C++ в QT Creator. Пишу свою игрушку, практикуя там то, что я...

14
 Аватар для snake32
3504 / 1687 / 236
Регистрация: 26.02.2009
Сообщений: 8,404
Записей в блоге: 6
19.12.2015, 02:10
Найдите расстояние от точки(центра шара) до прямой(луч мыши). Если оно меньше радиуса значит юзер попал в шар
0
0 / 0 / 1
Регистрация: 24.09.2015
Сообщений: 33
21.12.2015, 11:34  [ТС]
snake32,
А если шаров 1000?
0
 Аватар для snake32
3504 / 1687 / 236
Регистрация: 26.02.2009
Сообщений: 8,404
Записей в блоге: 6
21.12.2015, 12:00
SkyEX, ну во-первых 1000 не так уж и много =)
во-вторых есть методы оптимизации quadtree, octotree
в-третьих есть ещё один способ: рисовать сцену второй раз в отдельный буфер где цвет объекта - это ID этого объекта. Потом считывая пиксель с этого буфера мы прямо сразу узнаём ID или если там 0 то значит не попали.
0
0 / 0 / 1
Регистрация: 24.09.2015
Сообщений: 33
21.12.2015, 13:59  [ТС]
snake32,
3 способ не получится, если включено освещение?
0
 Аватар для snake32
3504 / 1687 / 236
Регистрация: 26.02.2009
Сообщений: 8,404
Записей в блоге: 6
21.12.2015, 14:09
Цитата Сообщение от SkyEX Посмотреть сообщение
3 способ не получится, если включено освещение?
Да, верно. Там всё должно быть выключено, кроме простого цвета и буфера глубины.
Недостатком является то что выбрать объект под объектом уже не получится. Потребуется ещё проход без верхних объектов.
0
184 / 24 / 4
Регистрация: 18.01.2011
Сообщений: 359
23.12.2015, 10:31
зачем так сложно?
http://masandilov.ru/opengl/object-selection
- вот пример урока по которму я лично делал выбор объектов мышью. оч удобно и понятно.
Суть сводится к следующему: Каждый шар есть объект. Его идентифицируем и отрисовываем в фонкции из урока. При выборе мыши выдается идентификатор шара.
1
0 / 0 / 1
Регистрация: 24.09.2015
Сообщений: 33
27.04.2016, 14:05  [ТС]
Андрей2011, сделал, спасибо
0
0 / 0 / 1
Регистрация: 24.09.2015
Сообщений: 33
29.04.2016, 23:52  [ТС]
Возникла небольшая проблемка. Выбор объектов работает правильно только когда ширина окна меньше высоты. Когда наоборот, то по нажатию на место ниже объекта, происходит его выбор. И чем больше ширина, по отношению к высоте, тем на большее расстояние вниз от объекта нужно нажимать
Делал по уроку (http://masandilov.ru/opengl/object-selection), но немного изменил код под свои нужды.

C++ (Qt)
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
int GLMdiChild::getObjectID(int x, int y)
{
    int objectsFound = 0;           
    int viewportCoords[4] = {0};    
    unsigned int selectBuffer[32] = {0};
 
    glSelectBuffer(32, selectBuffer);    
    glGetIntegerv(GL_VIEWPORT, viewportCoords);   
 
    glMatrixMode(GL_PROJECTION);    
    glPushMatrix();             
 
    glRenderMode(GL_SELECT);      
    glLoadIdentity();         
 
    setPickMatrix(x, viewportCoords[3] - y, 2, 2, viewportCoords);
 
    glOrtho(-5, 5, -5, 5, -100, 100);
    glMatrixMode(GL_MODELVIEW);    
 
    startVis();        
 
    objectsFound = glRenderMode(GL_RENDER);    
    glMatrixMode(GL_PROJECTION);              
    glPopMatrix();                 
    glMatrixMode(GL_MODELVIEW);    
 
    if (objectsFound > 0)
    {
        unsigned int lowestDepth = selectBuffer[1];
        int selectedObject = selectBuffer[3];
 
        for(int i = 1; i < objectsFound; i++)
        {
            if(selectBuffer[(i * 4) + 1] < lowestDepth)
            {
                lowestDepth = selectBuffer[(i * 4) + 1];   
                selectedObject = selectBuffer[(i * 4) + 3];
            }
        }
        return selectedObject; 
    }
    return 0;  
}
 
void GLMdiChild::setPickMatrix(GLdouble x, GLdouble y, GLdouble delta_x, GLdouble delta_y, GLint viewport[4])
{
   if (delta_x <= 0 || delta_y <= 0)
       return;
 
   glTranslatef((viewport[2] - 2 * (x - viewport[0])) / delta_x, (viewport[3] - 2 * (y - viewport[1])) / delta_y, 0);
   glScalef(viewport[2] / delta_x, viewport[3] / delta_y, 1.0);
}
 
void GLMdiChild::resizeGL(int width, int height)
{
    int side = qMax(width, height);
    glViewport((width - side) / 2, (height - side) / 2, side, side);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-5, 5, -5, 5, -100, 100);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}
0
0 / 0 / 1
Регистрация: 24.09.2015
Сообщений: 33
03.05.2016, 12:15  [ТС]
Если назначать вьюпорт по минимальной величине размера окна, то все выбирается нормально:
C++ (Qt)
1
2
int side = qMin(width, height);
glViewport((width - side) / 2, (height - side) / 2, side, side);
Но тогда по бокам добавляются пустые полосы.
0
54 / 24 / 5
Регистрация: 21.02.2016
Сообщений: 234
03.05.2016, 22:12
SkyEX, а знаешь как сделать ,чтобы за пределы стены не выходил?
или за пределы поля? самый простой принцип одной строкой
3д квартиру не делал? с обоями,диванами

Добавлено через 6 минут
Цитата Сообщение от SkyEX Посмотреть сообщение
snake32,
А если шаров 1000?
луч мыши это глупость,нету луча,есть координаты мыши X,Y

например ты прописал клик по обьекту при неподвижной сцене ,по осям X,Y

но если сцену повернуть то надо клик высчитывать по осям Y,Z

И вообще,это как если писать гонки,машину надо разворачивать по 3м осям,и двигать её в сцене тоже по трем осям,исходя из текущего glRotate() ,там уже идет сложная математика,вычесть поворот камеры,повернуть машину,и потом двигать машину исходя из градуса угла

Добавлено через 7 минут
луч мыши может быть по 3м осям,в трехмерной виндовс,а у нас 2х мерная виндовс

Я писал в правительство на счет создания 3х мерной российской ОС ,в 2006 году

Там например будет 3д комната в виндовс,и окна будут открываться не только по оси X,Y ,но и по оси Z вглубь экрана...

и можно будет лететь в глубь экрана,пришел тогда в 2006 году ответ из правительства,что моя идея принята к вниманию,будет изучаться
0
0 / 0 / 1
Регистрация: 24.09.2015
Сообщений: 33
03.05.2016, 23:09  [ТС]
Detektor, ммм, ок
0
04.05.2016, 12:14

Не по теме:

Цитата Сообщение от Detektor Посмотреть сообщение
луч мыши это глупость,нету луча,есть координаты мыши X,Y
Глупость то что ты написал ниже. О 2d луче никто и не говорил. И мы уже это с тобой проходили. Но до тебя по-прежнему не доходит и поэтому бомбит.
Это печально. Я бы на твоём месте уже чисто из принципа бы разобрался в этой теме. К тому же, если тебе нравится 3D так же как и мне, то ты просто обязан это сделать.

0
54 / 24 / 5
Регистрация: 21.02.2016
Сообщений: 234
04.05.2016, 16:54
Цитата Сообщение от SkyEX Посмотреть сообщение
Detektor, ммм, ок
Так знаешь как сделать чтобы сквозь стену не проходил?
3д комнату делал с диваном?

я тут шахматы написал на php ,и на opengl писал шашки,опыта много

Добавлено через 10 минут
надо шарить в геометрии и черчении,чтобы вычислить клик по шару

я покурил подумал,и решил пока в теории:

x_mysh=GetPosCursor(x) // примерно
y_mysh=GetPosCursor(y) // примерно


if(x>90 & x<91) {
(if(y>60 & y<61) {
if(z>20 & z<21) { рисуем для теста кликнутый шар,координата попала }

ну короче теоретически придумал,надо 40 раз уточнить и отладить...
с первого раза идеально никогда не получится

Добавлено через 10 минут
такую штуку я делал ,типа клик на меню... кривой метод,глупо вычислять 2д курсор в 3д измерении,

лучше просто спрограммировать "стрелки",и нажимать стрелку например ВНИЗ,и сразу переключать выделенные обьекты,

или от перемещения курсора сразу переключать выделенные обьекты,

я так в шашках сделал перемещение по клеткам

C++
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
Добавлена игра мышкой
 
POINT p; 
GetCursorPos(&p); 
 
if(p.x<px) {
 
    pausa=pausa+1;
                        if(pausa>12) {
                            focus[focus_u]=0;
                            focus_u=focus_u-1;
                            if(focus_u<1) { focus_u=1; }
                            focus[focus_u]=1;
                        pausa=0;}
 
    px=p.x;
}
 
if(p.x>px) {
 
pausa=pausa+1;
                        if(pausa>12) {
                            focus[focus_u]=0;
                            focus_u=focus_u+1;
                            if(focus_u>144) { focus_u=144; }
                            focus[focus_u]=1;
                        pausa=0;}
 
    px=p.x;
}
 
if(p.y<py) {
 
pausa=pausa+1;
                        if(pausa>12) {
                            if(focus_u>12) { 
                            focus[focus_u]=0;
                            focus_u=focus_u-12; }
                            focus[focus_u]=1;
                        pausa=0;}
 
    py=p.y;
}
 
if(p.y>py) {
 
pausa=pausa+1;
                        if(pausa>12) {
                            if(focus_u<132) { 
                            focus[focus_u]=0;
                            focus_u=focus_u+12; }
                            focus[focus_u]=1;
                        pausa=0;}
    py=p.y;
}
 
 
 
        case WM_LBUTTONDOWN:
            {
              pausa=pausa+1;
                        if(pausa>4) {
                              if(enter==0) { enter=1; } else if(enter==1) { enter=2; } else if(enter==2) { enter=1; } else if(enter==3) { enter=1; }
                            pausa=0;}
                return 0;
            }
Добавлено через 2 минуты
вот как узнать позицию курсора:

C++
1
2
3
4
5
POINT p; 
GetCursorPos(&p); 
 
p.x // координата курсора X
p.y // координата курсора Y
0
9 / 9 / 0
Регистрация: 19.04.2012
Сообщений: 114
04.05.2016, 18:49
Может помочь Это тоже может
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.05.2016, 18:49
Помогаю со студенческими работами здесь

Выбор объектов возвращает слишком много объектов
Делаю выбор объекта. Рисую объекты: ... GL.InitNames() ... Dim temp As Integer temp = 1 For i As Integer = 1 To NM

Выбор объектов через шейдер
Привет всем! Кто давно дружит с OpenGL - помогите пожалуйста советом. Можно ли средствами OpenGL как-то определять индекс объекта,...

движение сцены QGraphicsScene мышью
Движение сцены мышью происходит неравномерно, а какими-то рывками (мышь двигаешь равномерно, а сцена просто берет и укатывается вбок, пока...

Удаление объектов со сцены
Привет! Есть сцена, на ней клонируются объекты. Нужно: при нажатию левой кнопки по объекту, удалить этот объект. Пробовал вот таким...

Фиксация объектов сцены
Как зафиксировать объекты сцены (У меня например TextField и Password field ,ну и кнопки) по середине. а то у меня они при расширении...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
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. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru