Ogre3D Intermediate Tutorials / Промежуточные туториалы Ogre3D: Intermediate Tutorial 5: Static Geometry
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
ВВЕДЕНИЕ proVIDec 03.10.11 в 07:25 |
|
|
Существует немало ситуаций, когда вам нужны объекты в сцене, но вообще не требуется перемещать их. Mingun 08.10.11 в 03:58 Существует немало ситуаций, когда вам нужны объекты на сцене, ну вообще не нуждающиеся в перемещении. proVIDec 08.10.11 в 10:55 |
||
|
Например, если вы не добавляете в движок никакой физики, скалы и деревья вряд ли когда-либо будут перемещаться. Mingun 08.10.11 в 04:02 |
+3 | |
|
Для этих ситуаций Ogre предоставляет класс статической геометрии StaticGeometry, который позволяет вам создавать пачки (batch) объектов для отрисовки одной большой группой. Mingun 08.10.11 в 04:09 |
||
|
Это обычно быстрее, чем делать вручную с помощью узлов сцены. Mingun 08.10.11 в 04:10 |
||
|
В этом руководстве мы познакомимся с основами применения статической геометрии в программе. proVIDec 03.10.11 в 07:36 В этом уроке мы рассмотрим основные применения статической геометрии в вашей программе. Mingun 08.10.11 в 04:11 |
||
|
Мы также рассмотрим еще несколько вещей, которые вы можете сделать с помощью ManualObject. Mingun 08.10.11 в 04:12 |
||
|
Смотрите <b>предыдущий урок</b> об использовании ManualObject. Mingun 08.10.11 в 04:13 |
||
|
В этом уроке мы вручную создадим сетку травы и затем добавим большое их количество к объекту статической геометрии в нашей сцене. Mingun 08.10.11 в 04:14 |
||
|
Полный код данного руководства вы можете найти <b>здесь</b>. proVIDec 03.10.11 в 07:34 Полный код данного урока вы сможете найти <b>здесь</b>. Mingun 08.10.11 в 04:16 |
+1 | |
|
Так как вы проходите урок, вы должны медленно добавлять код в ваш проект и наблюдать результаты, когда мы собираем его. Mingun 08.10.11 в 04:18 |
||
|
Заметим, что данное руководство в частности основывается на библиотеке GrassDemo, которая есть в готовых образцах Ogre. proVIDec 03.10.11 в 07:42 Обратите внимание, что этот урок основан на кодовой базе демки Трава (Grass), являющейся частью примеров Ogre. Mingun 08.10.11 в 04:22 |
+3 | |
|
Вы также можете покопаться в ее исходниках, чтобы получить более полную информацию. Mingun 08.10.11 в 04:24 |
||
|
ПРЕДВАРИТЕЛЬНЫЕ УСЛОВИЯ proVIDec 03.10.11 в 07:32 |
||
|
Загрузите новый проект с Ogre основой для руководств и приведите ваш проект к такому виду: proVIDec 03.10.11 в 07:40 Создайте новый проект на Каркасе уроков Ogre и настройте его, чтобы он выглядел так: Mingun 08.10.11 в 04:29 |
+3 | |
|
Перед тем, как продолжать, убедитесь, что приложение компилируется и запускается. proVIDec 03.10.11 в 07:33 |
||
|
Вы должны увидеть робота, стоящего на плоской поверхности. proVIDec 03.10.11 в 07:32 |
||
|
СОЗДАНИЕ СЦЕНЫ proVIDec 03.10.11 в 07:25 |
||
|
СОЗДАНИЕ СЕТКИ Mingun 08.10.11 в 04:33 |
||
|
Первым делом нам нужно создать сетку травы, которую мы будем отрисовывать. Mingun 08.10.11 в 04:39 |
||
|
Общая идея - создать три квадратных четырехугольника, перекрывающих друг друга. Mingun 08.10.11 в 04:43 |
||
|
Каждый четырехугольник будет иметь текстуру травы на себе, поэтому, с какого бы направления, кроме вертикального, вы на него не посмотрите, он будет немного походить на 3D траву. Mingun 08.10.11 в 04:48 |
||
|
Самый простой способ создать перекрывающиеся четырехугольники - это создать один, потом другой, повернутый на 60 градусов и третий, повернутый еще на 60 градусов. Mingun 08.10.11 в 04:54 |
||
|
Как и в предыдущем уроке, мы будем использовать ManualObject для генерации нашего объекта, но, в отличие от предыдущего урока, мы действительно создадим сетку вместо простого списка линий (что потребует от нас создание индексного буфера, определяющего, как будут образованы треугольники). Mingun 08.10.11 в 04:57 |
||
|
Первым делом объявим некоторые базовые переменные. Mingun 08.10.11 в 04:58 |
||
|
Так как мы собираемся вращать четырехугольник, который мы определим, будет легче, если мы будем для математики использовать конструкции Ogre, такие как Vector3 и Quaternion, вместо попытки выполнить все вручную. Mingun 08.10.11 в 05:01 |
||
|
Наш план - создать Vector3 с координатами X и Z в нем, создать один четырехугольник из него, затем повернуть его с помощью кватерниона и повторить. Mingun 08.10.11 в 05:06 |
||
|
Найдите функцию-член createGrassMesh() и добавьте следующий код: Mingun 08.10.11 в 05:07 |
||
|
Теперь, когда мы подготовили наши переменные, нам нужно начать определение объекта ManualObject. Mingun 08.10.11 в 05:08 |
||
|
В отличие от предыдущего урока, мы назначим материал для использования этим объектом. Mingun 08.10.11 в 05:10 |
||
|
Также наша операция визуализации будет установлена в список треугольников, что означает, что после объявления наших вершин мы должны объявить список треугольников, которые создадут грани на нашем четырехугольнике: Mingun 08.10.11 в 05:17 |
||
|
Для каждого четырехугольника мы собираемся определить четыре вершины, одну на каждый угол. Mingun 08.10.11 в 05:19 |
||
|
Для каждой вершины мы, кроме того, определим текстурные координаты. Mingun 08.10.11 в 05:20 |
||
|
Текстурные координаты сообщают Ogre, как производить выборку текстуры, которую мы определили в материале Examples/GrassBlades. Mingun 08.10.11 в 05:22 |
||
|
Мы сделаем верхний левый угол точкой (0, 0) на текстуре, нижний правый угол точкой (1, 1) и так далее: Mingun 08.10.11 в 05:24 |
||
|
Теперь, когда мы определили четыре угла нашего четырехугольника, нам требуется создать грани. Mingun 08.10.11 в 05:25 |
||
|
Как кратко упоминалось в предыдущем уроке, вы должны определить грани созданием треугольников и вы должны убедиться, что произвели обход против часовой стрелки, чтобы они смотрели на вас. Mingun 08.10.11 в 05:28 |
||
|
Для каждого четырехугольника мы создадим два треугольника. Mingun 08.10.11 в 05:29 |
||
|
Первый будет основан вершинами (0, 3, 1), а второй - вершинами (0, 2, 3). Mingun 08.10.11 в 05:30 |
||
|
Это корректно определяет четырехугольник. Mingun 08.10.11 в 05:32 |
||
|
Также вспомните, что мы повторяем действия несколько раз, и каждый раз мы создаем 4 вершины, поэтому мы должны использовать переменную смещения для выбора соответствующей вершины: Mingun 08.10.11 в 05:39 |
||
|
Затем мы должны повернуть вектор, использованный нами при создании текущего четырехугольника и продолжить цикл. Mingun 08.10.11 в 05:41 |
||
|
После того, как цикл завершится, мы должны вызвать ManualObject::end() для завершения объекта: Mingun 08.10.11 в 05:42 |
||
|
Теперь, когда мы имеем описанный объект ManualObject, мы почти готовы начать создавать статическую геометрию. Mingun 08.10.11 в 06:39 |
||
|
Последнее, что мы сделаем, это создадим сетку из нашего ManualObject. Mingun 08.10.11 в 06:41 |
||
|
Сетки чуть более оптимизированы для отрисовки, чем использование объекта ManualObject. Mingun 08.10.11 в 06:44 |
||
|
Для этого нам просто нужно вызвать ManualObject::convertToMesh() с желаемым именем для сохраненной сетки: Mingun 08.10.11 в 06:47 |
||
|
Теперь мы закончили создание сетки травы. Mingun 08.10.11 в 06:47 |
||
|
Обратите внимание, что если вы таким образом создали очень сложную сетку, вы можете сохранить ее в файл и просто загрузить обратно вместо пересоздания объекта ManualObject каждый раз во время загрузки программы. Mingun 08.10.11 в 06:51 |
||
|
Чтобы сделать это, мы берем возвращаемое значение convertToMesh() (которое отбрасывается в рабочем коде) и передаем возвращенную им сетку в функцию MeshSerializer::exportMesh(). Mingun 08.10.11 в 06:55 |
