На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела "Программирование графики"
1) Данный раздел предназначен для обсуждения проблем, возникающих при программировании задач, связанных с чтением, сохранением, обработкой, созданием, отрисовкой графической информации (в том числе - 3D [OpenGL, Direct3D] и анимации [в т.ч. VFW, DirectShow, OpenDML]).
Флэш обсуждают здесь!.

2) Если вы хотите получить совет для конкретной платформы/языка программирования, обязательно укажите их в вопросе.

3) Уважаемые новички! Мы приветствуем Ваше желание научить всех посетителей раздела правильному программированию. Но огромная просьба, перед тем, как писать поучения в старых (последний ответ - "старее" месяца, а особенно, если вопрошавший не появляется на форуме уже не первый месяц, в чем можно убедиться в его профиле) темах, хорошо подумать, будет ли кому-нибудь, кроме Вас cамих, это интересно.



Ваше мнение о модераторах: user posted imageBarazuk, user posted imageOpenGL, user posted imageMikle
Модераторы: OpenGL, Mikle
Страницы: (4) « Первая ... 2 3 [4]  все  ( Перейти к последнему сообщению )  
> Реализация координатной сетки OpenGL
    Цитата 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 записей :D. Ну и дальше аналогично инфа о втором попадании. По-идее это может происходить если ты рисуешь что-либо в момент когда еще не загружено ни одно имя - попадания в этом случае тоже регистрируются как обычно.
      Ну вот хоть убейте…
      Не могу догнать… :(
      Всякий раз при нажатии левой кнопки мышки вызывается этот метод (FindObject(int x, int y)) который в свою очередь вызывает отрисовку сцены в буфер:

      ExpandedWrap disabled
        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 объекта?

      ExpandedWrap disabled
        //...
        if (objectsFound > 0) // objectsFound Всегда равно 2!
        {
           //...
        }


      Т.е. даже если объект не попал в это окошко (нажали в произвольном месте, а не на куб с именем 101) то в буфере он все же присутствует! (значения [3]-[6]) меняются лишь его значения в плях [4][5].

      Тогда в моем случае надо пропускать первые ([0][1][2]) значения? И работать со стальными? И именно по значению глубины делать выбор (находить имя объекта) тогда я не понимаю с чем сравнивать? Если у меня один объект с именем 101 с чем сравнивать его значения глубины? Или всетаки их сравнивать со значениями [1][2]?

      Если значения ([0][1][2]) пропускать (как информацию о предидущем попадании) тогда вообще – засада, куда ни щелкать – принимаеся решение, что щелкнули по кубу! Но ведь это не так! Если у других все работает – значит где-то ошибаюсь я, или просто не догоняю как работать с этим буфером… :)

      И еще такой вопрос, как правильнее производить выбор тех же самых вершин:

      Вариант 1:
      Переводить координаты мыши, а дальше проход по всем вершинам объектов и сравнивать их и принимать решение о выбранной, короче говоря – считать все математикой.

      Вариант 2:
      Вершинам каждого объекта присваивать имена (glLoadName())и производить выбор при помощи OpenGL – буфера выбора. (Но тогда, наверное, прийдется в каждой вершине рисовоть OpenGL точку.)

      Короче говоря, поставил перед собой задачу: необходимо реализовать выбор объетов, выбор грани объета, выбор ребер объекта, выбор вершин объекта.
      И хотелось бы какого то универсального способа применимого ко всему. Возможно ли такое? Или выбор объектов осуществлять, к примеру, буфером выбора, а вершины – по первому варианту (математикой)?
        Цитата Sergey Bogoyavlenskiy @
        т.е. если понимать дословно то количество имен в стеке = 0

        Именно так. Можешь кстати трассировать по шагам само рисование, наблюдая при этом за буфером, чтобы узнать, когда в него записываются эти данные.
        Цитата Sergey Bogoyavlenskiy @
        Тогда в моем случае надо пропускать первые ([0][1][2]) значения?

        Зачем? Я ведь сказал что они означают. Поэтому пока не кончились записи берешь количество объектов, пропускаешь z, идешь по объектам. Просто и универсально.
        Цитата Sergey Bogoyavlenskiy @
        Если значения ([0][1][2]) пропускать (как информацию о предидущем попадании) тогда вообще – засада, куда ни щелкать – принимаеся решение, что щелкнули по кубу!

        Странно. В части кода из твоего прошлого сообщения вроде все верно, должно работать.
        Цитата Sergey Bogoyavlenskiy @
        И еще такой вопрос, как правильнее производить выбор тех же самых вершин:

        Если нужен выбор вершин, то первый способ, т.к. количество имен ограничено.
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0313 ]   [ 15 queries used ]   [ Generated: 26.04.24, 10:50 GMT ]