
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.231.217.107] |
![]() |
|
Страницы: (4) « Первая ... 2 3 [4] все ( Перейти к последнему сообщению ) |
![]() |
Сообщ.
#46
,
|
|
Цитата Sergey Bogoyavlenskiy @ Все вроде как работает, но везде написанно, что: Первое поле - количество объектов под курсором на момент нажатия. Второе поле - минимальная Z глубина объекта (экранная Z координата). Третье поле - максимальная Z глубина объекта (экранная Z координата). Четвертое поле - идентификатор объекта. Не совсем так. Цитата www.opengl.org The hit record consists of the number of names in the name stack at the time of the event, followed by the minimum and maximum depth values of all vertices that hit since the previous event, followed by the name stack contents, bottom name first. То есть первое значение содержит количество имен в стеке на момент регистрации попадания, дальше z-depth а затем сам стек. Получается, в приведенном тобой примере все верно - сначала идет инфо о том, что 0 имен, затем z, а затем стек в количестве 0 записей ![]() |
Сообщ.
#47
,
|
|
|
Ну вот хоть убейте…
Не могу догнать… ![]() Всякий раз при нажатии левой кнопки мышки вызывается этот метод (FindObject(int x, int y)) который в свою очередь вызывает отрисовку сцены в буфер: ![]() ![]() void CObjectContainer::Draw() { glInitNames(); // уничтожаем все OpenGL имена (ID) glPushName(0); _it _First = m_Objs.begin(); _it _Last = m_Objs.end(); for(; _First != _Last; ++_First) { glLoadName((*_First)->GetID()); (*_First)->Draw(); } } И в котром производится очистка имен. И добавляется сначала нулевой, затем с именем 101 (в моем примере). Тогда как понять <количество имен в стеке на момент регистрации попадания>? Т.е. это первое значение = 0… т.е. если понимать дословно то количество имен в стеке = 0… ну не понимаю я… Это первый вопрос, а второй – не зависимо от того куда я щелкаю мышкой (или в мой куб с именем 101 или в пустоту) значения в этом стеке одни и те же кроме значений глубин. Зачем тогда устанавливать: gluPickMatrix(x, viewportCoords[3] - y, 2, 2, viewportCoords); Если щелкая в разные места сцены получаем 2 объекта? ![]() ![]() //... if (objectsFound > 0) // objectsFound Всегда равно 2! { //... } Т.е. даже если объект не попал в это окошко (нажали в произвольном месте, а не на куб с именем 101) то в буфере он все же присутствует! (значения [3]-[6]) меняются лишь его значения в плях [4][5]. Тогда в моем случае надо пропускать первые ([0][1][2]) значения? И работать со стальными? И именно по значению глубины делать выбор (находить имя объекта) тогда я не понимаю с чем сравнивать? Если у меня один объект с именем 101 с чем сравнивать его значения глубины? Или всетаки их сравнивать со значениями [1][2]? Если значения ([0][1][2]) пропускать (как информацию о предидущем попадании) тогда вообще – засада, куда ни щелкать – принимаеся решение, что щелкнули по кубу! Но ведь это не так! Если у других все работает – значит где-то ошибаюсь я, или просто не догоняю как работать с этим буфером… ![]() И еще такой вопрос, как правильнее производить выбор тех же самых вершин: Вариант 1: Переводить координаты мыши, а дальше проход по всем вершинам объектов и сравнивать их и принимать решение о выбранной, короче говоря – считать все математикой. Вариант 2: Вершинам каждого объекта присваивать имена (glLoadName())и производить выбор при помощи OpenGL – буфера выбора. (Но тогда, наверное, прийдется в каждой вершине рисовоть OpenGL точку.) Короче говоря, поставил перед собой задачу: необходимо реализовать выбор объетов, выбор грани объета, выбор ребер объекта, выбор вершин объекта. И хотелось бы какого то универсального способа применимого ко всему. Возможно ли такое? Или выбор объектов осуществлять, к примеру, буфером выбора, а вершины – по первому варианту (математикой)? |
![]() |
Сообщ.
#48
,
|
|
Цитата Sergey Bogoyavlenskiy @ т.е. если понимать дословно то количество имен в стеке = 0 Именно так. Можешь кстати трассировать по шагам само рисование, наблюдая при этом за буфером, чтобы узнать, когда в него записываются эти данные. Цитата Sergey Bogoyavlenskiy @ Тогда в моем случае надо пропускать первые ([0][1][2]) значения? Зачем? Я ведь сказал что они означают. Поэтому пока не кончились записи берешь количество объектов, пропускаешь z, идешь по объектам. Просто и универсально. Цитата Sergey Bogoyavlenskiy @ Если значения ([0][1][2]) пропускать (как информацию о предидущем попадании) тогда вообще – засада, куда ни щелкать – принимаеся решение, что щелкнули по кубу! Странно. В части кода из твоего прошлого сообщения вроде все верно, должно работать. Цитата Sergey Bogoyavlenskiy @ И еще такой вопрос, как правильнее производить выбор тех же самых вершин: Если нужен выбор вершин, то первый способ, т.к. количество имен ограничено. |