Объединение визуализации OpenGL в одно представление - PullRequest
1 голос
/ 06 мая 2009

У меня есть простое приложение для моделирования твердого тела, в котором я хочу реализовать несколько «режимов навигации», которые позволяют пользователю перемещаться по камере через трехмерное пространство. Одним из них является повсеместное «перетаскивание / вращение», которое используется в SketchUp, Blender и т. Д .; Я также хочу реализовать что-то более подходящее для моего конкретного приложения. В частности, я хочу реализовать режим, в котором камера плавает на «кольце» над моделируемым объектом (зданием) и всегда смотрит в центр модели; таким образом, пользователь может легко «обвести» вокруг объекта, что является обычной операцией в моем приложении.

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

Похоже, что я должен сделать следующее: сделать «основной вид», то есть здание; затем визуализируем тор и сферу (с различными настройками перспективы и освещением) в заэкранный буфер и перетаскиваем его оттуда в мой основной вид.

Тогда я доберусь до проверки удара. Я хочу определить, нажимает ли пользователь на сферу или тор; Исходя из того, что я понимаю из выбора OpenGL (кажется, это сложный вопрос: /), все методы выбора применяются только для выбора в одной «сцене». Кроме того, я все еще хочу обнаружить «нормальные» операции комплектования в модели здания, очевидно.

Итак, мои вопросы:

  • Как выполнить рендеринг в буфер за пределами экрана и перейти в другой контекст OpenGL (с альфа-смешиванием и прозрачностью, как для центра тора)?
  • Как мне выполнить проверку попадания в описанном сценарии?

Ответы [ 3 ]

2 голосов
/ 06 мая 2009

Я не думаю, что для этого нужно делать внеэкранный рендеринг. Вы сможете просто переустановить камеру и область просмотра и визуализировать наложение после основной сцены. У вас могут быть проблемы с Z-упорядочением и / или буферизацией, но, возможно, «подсцена» достаточно проста, чтобы это не имело значения, или вы, конечно, можете просто очистить Z-буфер перед его рендерингом.

1 голос
/ 06 мая 2009

Что касается рисования тора / сферы, создайте для этого отдельный класс и реализуйте метод "рисования". Класс должен содержать местоположение сферы и тора, а draw () отображать эти объекты на экране.

Тогда просто вызовите myRing.draw () в вашем основном методе рисования, и вы получите сферу и тор!

Если вы хотите, чтобы круг / кольцо отображались в 2D (что может быть проще) в верхнем правом углу окна, то применилась бы та же идея, что и в вашем посте с хитбоксом (за исключением того, что это раздражало расчет проекции!)

Наконец, я хотел бы рассмотреть возможность использования функциональной клавиши в сочетании с перетаскиванием мышью для реализации нужной вам функции ... Например. пользователь удерживает клавишу «Shift», а затем щелкает мышью по экрану. Эти события мыши фиксируются, и x-delta используется для вычисления угла поворота. Положение камеры обновляется, когда это происходит, и вы получаете плавное скользящее движение:)

0 голосов
/ 06 мая 2009

Я согласен с @unwind; вам не нужен закадровый буфер. Если вы все равно хотите, найдите «render-to-texture».

Что касается тестирования попаданий, FAQ по OpenGL содержит запись. Он описывает несколько решений: использование режима визуализации GL_SELECTION, использование gluUnproject () для получения трехмерного луча столкновения и простое 2D-решение с использованием уникальных цветов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...