Докуметация Cтарт Статьи Форум Лента Вход
Не официальное русскоязычное сообщество
Главная
    Документация jMonkeyEngine
        jMonkeyEngine Уроки и Документация
            Документация для уверенных пользователей
                Как использовать материалы

Как использовать материалы

Опубликованно: 26.04.2017, 20:51
Последняя редакция, Andry: 26.09.2017 23:02

Геометрия(mesh(сетка)) — это просто форма объекта. JMonkeyEngine не может визуализировать фигуру, не зная ничего о свойствах ее поверхности. Чтобы сделать их видимыми, вам нужно применить цвет или текстуру к поверхности геометрии. В jMonkeyEngine цвета и текстуры представлены как объекты Material(Материал). (Альтернативой может быть также загрузка модели, которая включает материалы, созданные с помощью редактора сетки, такого как Blender.)

  • Все геометрии должны иметь материалы, определяющие цвет или текстуру.
  • Каждый Материал основан на файле Material Definition(Описание Материала).
    Примеры включеных в jME Описаний Материала: Lighting.j3md, Unshaded.j3md

Вы хотите максимально использовать ваши 3D-модели, задавая хорошие параметры материала. Разработчики должны быть в контакте с графическими дизайнерами относительно того, какие свойства материала они намереваются использовать в своих 3D-моделях. Вы должны понимать, что такое текстурные карты, чтобы иметь возможность использовать материалы с текстурами.

Не забудьте добавить Источник Света на сцену! Все материалы (кроме «не закрашенных») невидимы без источника света.

Если вам нужна более подробная информация: вы можете узнать больше о Описании Материалов в здесь. Полный список параметров материала вы можете найти в обзоре Свойств Описания Материалов. В этом разделе представлены наиболее часто используемые случаи. Обычно вы инициализируете объекты Material в методе simpleInitApp() и настраиваете их с помощью описанных здесь методов настройки. Затем загружаете материалы с помощью myGeometry.setMaterial(mat).

Пример кода

В следующих примерах предполагается, что вы загрузили геометрию с именем myGeometry и хотите присвоить ей материал.

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

Spatial myGeometry = assetManager.loadModel("Models/Teapot/Teapot.j3o");
Material mat = new Material(assetManager,  // Создадим новый материал и...
    "Common/MatDefs/Misc/Unshaded.j3md");  // ... укажем .j3md файл для использования(не затенённый).
mat.setColor("Color", ColorRGBA.Blue);     // Установим некоторые параметры, например. Синий.
myGeometry.setMaterial(mat);               // Используем новый материал на этой геометрии.

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

Spatial myGeometry = assetManager.loadModel("Models/Teapot/Teapot.j3o");
Material mat = new Material(assetManager,  // Создадим новый материал и...
    "Common/MatDefs/Light/Lighting.j3md"); // ... укажем .j3md файл для использования(освещеный).
mat.setBoolean("UseMaterialColors",true);  // Установим некоторые параметры, например. Синий.
mat.setColor("Ambient", ColorRGBA.Blue);   // ... цвет этого объекта
mat.setColor("Diffuse", ColorRGBA.Blue);   // ... цвет отраженного света
myGeometry.setMaterial(mat);               // Используем новый материал на этой геометрии.
Вы используете повторно Материалы? Вы можете сохранять свойства материала в файле .j3m и загружать все свойства одной строкой, используя

myGeometry.setMaterial( assetManager.loadMaterial("Materials/myMaterial.j3m"));

Цветной или текстурированный

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

Цветной

Чтобы задать не заштрихованному материалу цвет:

  • Укажите свойство цвета
    mat.setColor("Color", ColorRGBA.Blue); // с Unshaded.j3md
    

Чтобы задать материалу с Фонг-освещением цвет:

  1. Активировать цвета материалов:
    mat.setBoolean("UseMaterialColors",true); // с Lighting.j3md
    
  2. Укажите как минимум цвета Diffuse и Ambient. Установите оба цвета стандартном способом.
    mat.setColor("Diffuse", ColorRGBA.Blue ); // с Lighting.j3md
    mat.setColor("Ambient", ColorRGBA.Blue ); // с Lighting.j3md
    

Текстурирование

Чтобы задать не затененному материалу текстуру:

  • Укажите как минимум ColorMap:
    mat.setTexture("ColorMap", assetManager.loadTexture("Textures/monkey.png")); // с Unshaded.j3md
    

Чтобы задать материалу с Фонг-освещением текстуру:

  • Укажите, хотя бы, текстуру DiffuseMap:
    mat.setTexture("DiffuseMap", assetManager.loadTexture("Textures/wood_diffuse.png")); // с Lighting.j3md
    
Может случиться так, что вы загружаете текстуры в разных масштабах, например, ваши травинки могут выглядеть большими, как ветки, или тепловые плитки вашего космического корабля могут выглядеть как маленькие плитки для ванной. Затем вам нужно настроить масштаб текстуры, либо больше (> 1.0f), либо меньше (<1.0f).

geometry.scaleTextureCoordinates(new Vector2f(0.5f, 0.5f));

Все остальные настройки Текстурных Карт и Материалов не являются обязательными. Если их использовать искусно, они делают вашу модель отлично выглядящей.

(Необязательно) Bumpy(неровный)

NormalMap(Карта Нормалей) (также называемая BumpMap) — это дополнительная цветная текстура, описывающая мелкие неровности. Такие детали поверхности Материала как например: мелкие трещины, поры, складки, надрезы. Использование BumpMap более эффективно, чем пытаться сформировать сетку, чтобы быть придать неровности поверхности.

Чтобы добавить BumpMap (это имеет смысл только для освещенных Материалов):

  1. Сгенерируйте информацию о нормалях векторов для Mesh (не для Геометрии!), используя com.jme3.util.TangentBinormalGenerator.
    TangentBinormalGenerator.generate(mesh);
    
  2. Укажите текстуру NormalMap(Карта Нормалей) для материала.
    mat.setTexture("NormalMap", assetManager.loadTexture("Textures/wood_normal.png")); // с Lighting.j3md
    

Подробнее о создании и использовании NormalMap и BumpMap можно узнать здесь.

(Необязательно) Shiny(Блестящий)

Чтобы активировать Shininess (это имеет смысл только для освященных Материалов):

  1. Задайте интенсивность Блеска Материала.
    Shininess — float значение между 1 (неровная поверхность с размытым блеском) и 128 (очень гладкая поверхность с фокусированным блеском)

    mat.setFloat("Shininess", 5f);
    
  2. Активировать цвета материала:
    mat.setBoolean("UseMaterialColors",true);
    
  3. Задайте цвета Specular(зеркальный) и Diffuse(диффузный,рассеянный) блеска.
    Обычно вы будете устанавливаете Specular значения для ColorRGBA источника света, часто RGBA.White.

    mat.setColor("Specular",ColorRGBA.White);
    mat.setColor("Diffuse",ColorRGBA.White);
    
  4. (Необязательно) Укажите текстуру SpecularMap(Зеркальная карта).
    Вы можете по желанию вручную нарисовать эту текстуру в оттенках серого, чтобы детализировать, где поверхность должна быть более блестящей (белее серости) и где меньше (более темные серые). Если вы не зададите SpecularMap, то весь материал будет блестеть полностью.

    mat.setTexture("SpecularMap", assetManager.loadTexture("Textures/metal_spec.png")); // с Lighting.j3md
    

Деактивировать блеск

  • Установите Specular цвет в ColorRGBA.Black. Не устанавливайте Shininess в 0.
    mat.setColor("Specular",ColorRGBA.Black);
    

(Необязательно) Glow(Свечение)

Чтобы активировать свечение:

  1. Добавьте BloomFilter PostProcessor в ваш метод simpleInitApp() (всеми светящимися объектами он используется только один раз).
    FilterPostProcessor fpp=new FilterPostProcessor(assetManager);
    BloomFilter bloom = new BloomFilter(BloomFilter.GlowMode.Objects);
    fpp.addFilter(bloom);
    viewPort.addProcessor(fpp);
    
  2. Задайте цвет Glow.
    ColorRGBA значение по вашему выбору. Например выберите теплые или холодные цвета для различных эффектов, или белый для нейтрального свечения.

    mat.setColor("GlowColor",ColorRGBA.White);
    
  3. (Необязательно) Задайте текстуру GlowMap.
    Эта текстура определяет места, там где текстура DiffuseMap будет светиться. Если вы не используете GlowMap, весь материал будет светиться полностью.

    mat.setTexture("GlowMap", assetManager.loadTexture("Textures/alien_glow.png"));
    

Чтобы отключить свечение:

  • Установите цвет Glow на ColorRGBA.Black.
    mat.setColor("GlowColor", ColorRGBA.Black);
    

Узнайте больше о Bloom и Glow.

(Необязательно) Transparent(Прозрачный)

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

  • Alpha = 1.0f делает цвет непрозрачным (по умолчанию),
  • Alpha = 0.0f делает цвет полностью прозрачным
  • Альфа между 0f и 1f делает цвет более или менее полупрозрачным.

Чтобы сделать Геометрию прозрачной или полупрозрачной:

  1. Укажите, какие области вы хотели бы что бы были прозрачными или полупрозрачными, задав альфа-канал:
    • (Для цветных материалов) В любом RGBA цвете, первые три являются красный-зеленый-синий, а последний float является альфа-канал. Например, заменим ColorRGBA.Red на полупрозрачный красный:
      mat.setColor("Color", new ColorRGBA(1,0,0,0.5f));
      
    • (Для текстурированных материалов). Задайте в AlphaMap, описывающий, какие области являются прозрачными.
      mat.setTexture("AlphaMap", assetManager.loadTexture("Textures/window_alpha.png"));
      
    • (Для текстурированных материалов) Если DiffuseMap имеет альфа-канал, используйте:
      mat.setBoolean("UseAlpha",true);
      
  2. Укажите значение BlendMode Альфа для материала.
    mat.getAdditionalRenderState().setBlendMode(BlendMode.Alpha);
    
  3. Поместите Геометрию (а не Материал!) В соответствующее окно очереди рендеринга bucket.
    • Объекты в полупрозрачном bucket (например, частицы) не подвержены воздействию SceneProcessors (например, тени).
      geo.setQueueBucket(Bucket.Translucent);
      
    • Объекты в прозрачном bucket (например, листвы) подвержены воздействию SceneProcessors (например, тени).
      geo.setQueueBucket(Bucket.Transparent);
      
  4. (Необязательно) Укажите другие параметры материала.
Стандартная прозрачность материала  Описание Пример
getAdditionalRenderState().setBlendMode(BlendMode.Off);  Это значение по умолчанию, без прозрачности. Используйте для всех непрозрачных объектов, таких как стены, полы, люди …
getAdditionalRenderState().setBlendMode(BlendMode.Alpha);  Интерполирует фоновый пиксель с текущим пикселем, используя альфа текущего пикселя. Это наиболее часто используемый BlendMode для прозрачности и полупрозрачности: матовые оконные стекла, лед, стекло, альфа-смешанные текстуры растительности …
getAdditionalRenderState().setDepthWrite(false);  Отключает запись значения глубины пикселя в буфер глубины. Деактивируйте это на материалах, если вы ожидаете, что два или более прозрачных/полупрозрачных объектов заслоняют друг друга, и вам нужно видеть через них.
getAdditionalRenderState().setAlphaTest(true)
getAdditionalRenderState().setAlphaFallOff(0.5f); 
Включает альфа-тестирование и использует AlphaDiscardThreshold в качестве значения альфа-спада. Это означает, что градиенты в AlphaMap больше не интерпретируются как мягкая полупрозрачность, и части текстуры становятся полностью непрозрачными или полностью прозрачными. Отображаются только пиксели выше альфа-порога (например, 0,5f). Активируйте альфа-тестирование для (частично) прозрачных объектов, таких как листва, волосы и.т.д.
Деактивируйте альфа-тестирование для частично полупрозрачных объектов, таких как цветное стекло, дымчатое стекло, призраки.
Можно загрузить текстуру DiffuseMap с альфа-каналом и объединить ее с основным цветом материала.

mat.setBoolean("UseAlpha",true);

Цвет материала пропускается через прозрачные области текстуры верхнего слоя DiffuseMap. В этом случае вам не нужно BlendMode Alpha — потому что это не весь материал, который прозрачен, а только один из слоев текстуры. Вы можете использовать для создания эффекта кровотечения. Например при создании разноцветных униформ, животных или растений. Где каждый Материал использует одну и ту же «шаблонную текстуру DiffuseMap, но сочетает ее с другим цветом.

(Необязательно) Wireframe(Каркас)

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

Свойства Материала Описание Например
getAdditionalRenderState().setWireframe(true); Переключитесь на показ (текстурированного) материала в каркасном режиме. Каркас дополнительно использует значение цвета материала. Используйте каркасы для отладки сетки или для «матричного» или «холодекового» эффекта.
getAdditionalRenderState().setLineWidth(2f); Когда в каркасном режиме задается ширина линии сетки.

Переведено для jmonkeyengine.ru, оригинал
Автор перевода: Andry

Добавить комментарий

jMonkeyEngine.ru © 2017. Все права сохранены.