2009-12-31 2 views
3

Я использую gluUnProject, чтобы нарисовать луч в сцену и добавить туда примитив. То, что я пытаюсь сделать, теперь точно выбрать существующие примитивы, поэтому, если у меня есть 3 сферы, я мог бы нажать на один, чтобы удалить его.Объект объекта OpenGL gluUnProject

Я думаю, что решение каким-то образом проверит, пересекается ли луч с объектом и проверяет, находится ли он ближе всего к происхождению каста. Мое решение до сих пор примитивно и окружает все объекты с ограничивающим кубом, есть в любом случае, чтобы просто сделать это точно для скажем сферы использования:

does the ray intersect with (object) 

или

returnRayIntersections(ray); 

Последней вещь, я используя OpenGL с GLUT.

Спасибо всем, Laurence

ответ

1

Еще один хороший способ реализовать сбор в OpenGL, как это:

Нарисуйте вашу сцену в задний буфер, используя уникальный цвет для каждого примитива, который вы хотите выбрать. Если вы используете 24-битный режим, цвета могут быть просто # 000001, # 000002 и т. Д. Отключите подсветку, туман и т. Д., Чтобы цвета, которые вы указали, были точными цветами, которые будут иметь пиксели.

Не закрывайте обратный буфер на экране (не используйте glSwapBuffers). Вместо этого используйте glReadPixels для чтения back-buffer GL в буфер памяти. После этого у вас есть растровое изображение памяти, в котором вы можете прочитать значение пикселя, соответствующее местоположению мыши на экране. Значение цвета, которое вы читаете из этого, может быть легко сопоставлено с примитивом (так как это будет # 000001, # 000002 и т. Д.).

Вот more информация об этом стиле выбора. Это то, что мне нравится использовать, поскольку оно имеет одно преимущество над режимом GL_SELECTION. Если 3D-сцена неизменна и мышь перемещается по ней, я могу получить одну копию заднего буфера, а затем быстро оценить, какой объект находится под мышью, просто ссылаясь на соответствующий пиксель в моем растровом изображении. Мне не нужно вообще использовать вызовы GL до тех пор, пока сцена не изменится. Поскольку у моего приложения много мыши, зависающих над 3D-сценой, и мне нужно быстро узнать, с какой сущностью движется мышь, я нашел этот метод очень быстрым.

+0

Ага, этот метод отлично выглядит, нашел отличный учебник здесь: http://www.lighthouse3d.com/opengl/picking/index.php3?color1 – Ljdawson

+0

Маленькое продолжение, это отлично работает! – Ljdawson

3

Использование OpenGL режим выбора это лучший способ сделать это, так как он может работать сколь угодно сложную визуализацию, а не только сферы. Вы можете увидеть много учебников для этого, но примерно: задаваемой GL в режиме выбора:

glRenderMode (GL_SELECT); 

Затем вы рисуете сцену, после создания буферавыбора, который фиксирует имена фрагментов, вы рендеринг. Этот article поможет вам начать работу.

Nehe's tutorial длинный, но очень хороший тоже.

Смежные вопросы