Ogre3D Intermediate Tutorials / Промежуточные туториалы Ogre3D: Intermediate Tutorial 4: Volume Selection and Basic Manual Objects

← →
Английский оригинал Перевод на русский

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

ВВЕДЕНИЕ

proVIDec 16.07.11 в 14:09

0

В этом уроке мы рассмотрим, как сделать выделение некоторого объема сцены.

Mingun 01.10.11 в 06:26

0

Идея состоит в том, что когда вы нажимаете кнопку мыши и протягиваете ее через экран, область выделения будет отслежена белым прямоугольником.

Mingun 01.10.11 в 06:29

0

Когда вы отпустите кнопку мыши, все объекты в области выделения будут выделены.

Mingun 01.10.11 в 06:32

0

Когда вы отпустите кнопку мыши, все объекты, находящиеся в этой области, будут выделены.

proVIDec 01.10.11 в 08:35

1
+2

Для достижения этого мы изучим возможности использования двух объектов: ManualObject (для создания выделяющего прямоугольника) и PlaneBoundedVolumeListSceneQuery.

Mingun 01.10.11 в 06:41

0

Обратите внимание, что мы рассмотрим только некоторые базовые аспекты использования ManualObject, это только введение в него, а не урок, как создавать завершенные 3D объекты с его помощью.

Mingun 01.10.11 в 06:43

0

Мы рассмотрим только то, что мы будем использовать.

Mingun 01.10.11 в 06:43

0

ПРЕДВАРИТЕЛЬНЫЕ УСЛОВИЯ

Mingun 01.10.11 в 06:46

0

Убедитесь, что на данный момент вы имеете каркас базовых уроков (Basic Tutorial Framework).

Mingun 01.10.11 в 07:07

0

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

Mingun 01.10.11 в 07:10

0

Удостоверьтесь, что этот код компилируется, прежде чем продолжать.

Mingun 01.10.11 в 07:10

0

Когда вы запустите его, вы должны увидеть, что вы можете двигать курсором мыши, но кроме этого приложение на данный момент ничего не делает.

Mingun 01.10.11 в 07:12

0

Выйдите, нажав escape.

Mingun 01.10.11 в 07:13

0

Для выхода нажмите Esc.

proVIDec 02.10.11 в 15:25

0

ОБЪЕКТЫ КЛАССА MANUALOBJECT

Mingun 01.10.11 в 07:14

0

КРАТКИЙ ЭКСКУРС В 3D ОБЪЕКТЫ

Mingun 01.10.11 в 07:18

0

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

Mingun 01.10.11 в 07:21

0

Хотя это - грубое упрощение, сетка состоит примерно из двух частей: буфера вершин и буфера индексов.

Mingun 01.10.11 в 07:25

0

Буферы вершин определяют точки в трехмерном пространстве.

Mingun 01.10.11 в 07:26

0

Каждый элемент в буфере вершин определяется несколькими атрибутами, которые вы можете задать.

Mingun 01.10.11 в 07:27

0

Единственный атрибут, который вы должны установить - позиция вершины.

Mingun 01.10.11 в 07:27

0

Кроме того, есть множество необязательных свойств, которые вы можете задать, такие как цвет вершины, текстурные координаты и так далее.

Mingun 01.10.11 в 07:29

0

Какие из из них вы будете использовать зависит от того, что вы захотите сделать с сеткой.

Mingun 01.10.11 в 07:31

0

Индексные буферы "соединяют точки" путем указания точек из вершинного буфера.

Mingun 01.10.11 в 07:32

0

Каждые три индекса, указанные в индексном буфере, определяют один треугольник, рисуемый GPU.

Mingun 01.10.11 в 07:33

0

Порядок, в котором вы указываете вершины в индексном буфере, сообщает графической карте, в какую сторону будет обращен треугольник.

Mingun 01.10.11 в 07:35

0

Треугольник, рисуемый против часовой стрелки, обращен к вам, а рисуемый по часовой стрелке - от вас.

Mingun 01.10.11 в 07:36

0

Обычно отрисовывается только передняя сторона треугольника, так что важно быть уверенным, что ваши треугольники образованы правильным образом.

Mingun 01.10.11 в 07:39

0

Хотя все сетки имеют вершинный буфер, не все содержат буфер индексов.

Mingun 01.10.11 в 07:40

0

Например, у сетки, которую мы хотим создать, не будет индексного буфера, так как нам требуется пустой прямоугольник (в противоположность закрашенному прямоугольнику).

Mingun 01.10.11 в 07:42

0

Наконец, обратите внимание на то, что вершинные и индексные буферы обычно хранятся в собственной памяти видеокарты, поэтому ваше ПО может просто отправить карте один простой, дискретный набор команд, чтобы сказать ей использовать эти предопределенные буферы для отрисовки всей 3D сетки за один проход.

Mingun 01.10.11 в 07:46

0

ВВЕДЕНИЕ

Mingun 01.10.11 в 07:46

0

Существуют два способа создания вашей собственной сетки в Ogre.

Mingun 01.10.11 в 07:51

0

Первый вариант - унаследоваться от SimpleRenderable и предоставить через него вершинные и индексные буферы напрямую.

Mingun 01.10.11 в 07:58

0
+1

Это - самый прямой путь для создания сетки, но также и самый непонятный.

Mingun 01.10.11 в 08:07

0

Фрагмент кода Генерация сетки (Generating A Mesh) показывает пример его использования.

Mingun 01.10.11 в 08:09

0

Чтобы упростить задачу, Ogre предоставляет намного более лучший интерфейс, называемый ManualObject, который позволяет вам использовать некоторые простые функции для определения сетки вместо занесения "сырых" данных в объекты буферов.

Mingun 01.10.11 в 08:13

0

Вместо закидывания позиции, цвета и т.д. в буфер, вы просто вызываете функции position() и colour().

Mingun 01.10.11 в 08:14

0

В этом уроке нам необходимо создать белый прямоугольник, который будет отображаться, когда мы будем перетаскивать мышь для выделения объектов.

Mingun 01.10.11 в 08:16

0

В Ogre действительно нет класса, который мы могли бы использовать для отображения двумерного прямоугольника.

Mingun 01.10.11 в 08:18

0

Мы должны будем придумать способ сделать это самостоятельно.

Mingun 01.10.11 в 08:18

0

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

Mingun 01.10.11 в 08:22

0

Вместо этого мы генерируем очень простую 2D сетку, которая будет выполнять роль нашего прямоугольника выделения.

Mingun 01.10.11 в 08:24

0

РАМКА ВЫДЕЛЕНИЯ

Mingun 01.10.11 в 08:26

0

ОБЛАСТЬ ВЫДЕЛЕНИЯ

proVIDec 01.10.11 в 09:37

0

Теперь мы можем обработать всю функциональность рамки выделения в нашем учебном приложении, но это только приведет к беспорядку, который нам совсем не нужен.

Mingun 01.10.11 в 08:32

0

Это очень хорошая практика - разделять отдельные объекты в отдельные классы, потому что она делает вещи более ясными и легкими для использования.

Mingun 01.10.11 в 08:35

0

Поэтому вначале для рамки выделения мы сделаем отдельный заголовочный файл и файл реализации, называемые SelectionBox.h и SelectionBox.cpp соответственно, и мы просто объявим этот класс как и любой другой; кроме того, он будет расширять Ogre::ManualObject.

Mingun 01.10.11 в 08:38

0

Итак, сделайте ваши .cpp и .h файлы похожими на это.

proVIDec 01.10.11 в 08:24

0

Так что приведите ваши файлы .h и .cpp к чему-то, подобное этому.

Mingun 01.10.11 в 08:39

1
+1

КОД

proVIDec 01.10.11 в 08:23

0

КОД

Mingun 01.10.11 в 08:40

0

Когда мы делаем прямоугольную область выделения, мы должны основываться на том, что она будет отображена в 2D.

proVIDec 01.10.11 в 08:29

0

Когда мы создаем прямоугольник выделения, мы должны опираться на то, что он будет отрисовываться в 2D-пространстве.

Mingun 01.10.11 в 08:43

0

Так же нужно убедиться, что область будет отображена после всех оверлеев Ogre, так как она должна отображаться поверх всех остальных объектов на экране.

proVIDec 01.10.11 в 08:39

0

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

Mingun 01.10.11 в 08:47

0
Минутку...

Следующая страница →