This page has been translated automatically.
Основы UNIGINE
1. Введение
2. Виртуальные миры и работа с ними
3. Подготовка 3D моделей
4. Материалы
5. Камеры и освещение
7. Создание кат-сцен и запись видео
8. Подготовка проекта к релизу
9. Физика
10. Основы оптимизации
11. ПРОЕКТ2: Шутер от первого лица
12. ПРОЕКТ3: Аркадная гонка по пересеченной местности от 3-го лица
13. ПРОЕКТ4: VR приложение с простым взаимодействием

Управление материалами

Changing parameters of the material assigned to the object surface via code, and replacing one assigned material with another.Изменение параметров материала, назначенного на поверхность объекта из кода, а также замена самого материала на другой.

Materials can be operated not only in the Editor — sometimes it is required to assign materials via code (in case of procedural content generation, for example) or configure some of their parameters. To control materials via API, we use the following two classes:С материалами можно работать не только в Редакторе, иногда бывает нужно назначать материалы из кода (при процедурной генерации контента, например) или менять какие-то их параметры. Для управления материалами через API мы используем следующие два класса:

  • Materials class that represents an interface for managing loaded materials (this is a manager class that can help you find a required material, for example).Materials, который представляет интерфейс для управления загруженными материалами (это класс-менеджер, с его помощью можно, к примеру, отыскать нужный материал).
  • Material class that is used to manage each individual material.Material, который используется для управления конкретным материалом.

The following example demonstrates how to inherit a new material from the base one, which is called mesh_base.Следующий пример показывает как унаследовать новый материал от базового, который называется mesh_base.

Исходный код (C#)
private void Init()
{

	// создаем куб (ObjectMeshDynamic node)
	ObjectMeshDynamic my_mesh = Primitives.CreateBox(new vec3(1.5f, 1.5f, 1.5f));

	// находим материал с именем mesh_base, от которого будем наследоваться
	Material mesh_base = Materials.FindManualMaterial("Unigine::mesh_base");
	
	// наследуем от него дочерний материал
	Material my_mesh_base = mesh_base.Inherit();
	
	// сохраняем дочерний материал в файл "materials/my_mesh_base0.mat" (до сохранения 
	// такой материал существует только в оперативной памяти и удаляется после завершения работы приложения)
	my_mesh_base.CreateMaterialFile("materials/my_mesh_base0.mat");

	// устанавливаем множитель цвета альбедо для материала в красный
	my_mesh_base.SetParameterFloat4("albedo_color", new vec4(255, 0, 0, 255));

	// назначаем материал "my_mesh_base0.mat" первой поверхности (с индексом 0) объекта my_mesh (ObjectMeshDynamiс)
	my_mesh.SetMaterialPath("materials/my_mesh_base0.mat", 0);

	// назначаем материал "my_mesh_base0.mat" всем поверхностям объекта my_mesh (ObjectMeshDynamiс)
	my_mesh.SetMaterialPath("materials/my_mesh_base0.mat", "*");
}

private void Shutdown()
{

	// удаляем материал "materials/my_mesh_base0.mat"
	Materials.RemoveMaterial(Materials.FindMaterialByPath("materials/my_mesh_base0.mat").GUID, true);
}

Practice
Практика#

Now let's create an interactive poster in our interior with an ability to change its albedo texture and apply a light filter to the picture (add a tone).Теперь давайте добавим в наш интерьер интерактивный постер, который будет иметь возможность изменения текстуру альбедо и наложения на картинку светофильтра (добавление тона).

First, we're gonna need a Static Mesh plane.Для начала нам понадобится плоскость (Static Mesh).

  1. Go to the archviz/textures folder and find the plane.mesh asset.Откройте в Ассет Браузере папку archviz/textures и найдите в ней ассет plane.mesh.
  2. Drag it to the scene (a new Static Mesh object will be created) and change its name to "poster".Перетащите ассет на сцену (будет создан новый объект Static Mesh и переименуйте его в "poster".
  3. Set poster's transformation as shown on the image below:Измените положение и поворот постера, как показано на рисунке:

  4. In the Surface Material section create a child material for the surface (click create a child material) to be able to change its parameters and drag the tex01.jpg asset to the Albedo field in the Textures tab.В группе Surface Material отнаследуйте для поверхности новый материал (щелкните create a child material), чтобы иметь возможность изменять его параметры, затем перетащите ассет tex01.jpg в поле Albedo на вкладке Textures.

Let's create the Customizable component (inherited from Interactable) that switches textures from the list (the array parameter) on the object — Action(0), and changes the albedo color multiplier by overrriding the method — Action(1). The code of the component looks like this:Постер готов, теперь давайте создадим компонент Customizable (наследник Interactable), переключающий на объекте текстуры из списка (array parameter) Action(0) и меняющий множитель цвета albedo через перегрузку метода Action(1). Код компонента выглядит так:

Исходный код (C#)
using System;
using System.Collections;
using System.Collections.Generic;
using Unigine;

[Component(PropertyGuid = "AUTOGENERATED_GUID")] // <-- идентификатор генерируется автоматически для нового компонента
public class Customizable : Interactable
{
	public  List<AssetLink> textures = null;
	private int current_texture = 0;
	
	public void Init()
	{
		// задаем текст подсказки, которая будет отображаться при наведении курсора на объект
		tooltip = "По правому щелчку мыши циклически переключает материалы на объекте по списку."+
		" По клавише 'TAB' случайным образом меняет цветовой тон.";
	}

	// перегрузка действия для дочернего компонента
	public override void Action(int num)
	{
		// выбор действия
		switch (num)
		{
			// циклическая смена текстур альбедо в материале объекта из указанного списка
			case 0:
				// если список текстур не задан или пуст, ничего не делаем
				if(textures == null || textures.Count < 0)
					return;

				current_texture++;
				if (current_texture >= textures.Capacity)
					current_texture = 0;

				(node as Unigine.Object).SetMaterialTexture("albedo", textures[current_texture].AbsolutePath,0);
			break;
			// смена множителя цвета albedo для текущего материала на объекте на произвольный цвет
			case 1:
				(node as Unigine.Object).GetMaterial(0).SetParameterFloat4("albedo_color", MathLib.RandColor());
			break;
		}
	}
}

Then let's assign our component to the poster node and fill the texture array (tex01, tex02, tex03).И, наконец, назначим наш компонент на ноду poster и заполним массив текстур (tex01, tex02, tex03).

Now the image on the poster can be changed in one click.Теперь на стене у нас постер, изображение на котором можно сменить в один клик.

Последнее обновление: 16.08.2024
Build: ()