Использование одного меша и нескольких материалов

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

Использование одного меша и нескольких материалов

Сообщение Visochestvo 24 фев 2017, 18:36

Собираюсь сделать вот что. Допустим рисуется меш, на нем есть несколько материалов, в какой момент или при каком то условии, материал у меша должен поменяться на другой но не на весь меш, а от тогда момента с которого меняется материал.
Есть где мануал, по использованию?
Visochestvo
UNIверсал
 
Сообщения: 453
Зарегистрирован: 01 фев 2014, 14:11

Re: Использование одного меша и нескольких материалов

Сообщение DbIMok 24 фев 2017, 19:07

Visochestvo писал(а):не на весь меш, а от тогда момента с которого меняется материал

копать отсюда и до обеда. поясните как это должно выглядеть. лучше с картинками
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Использование одного меша и нескольких материалов

Сообщение Visochestvo 24 фев 2017, 19:55

Изображение
Это нарисовал, в 3Д редакторе для примера, так же нужно сделать в Unity. Один меш несколько материалов.
Visochestvo
UNIверсал
 
Сообщения: 453
Зарегистрирован: 01 фев 2014, 14:11

Re: Использование одного меша и нескольких материалов

Сообщение DbIMok 24 фев 2017, 20:06

Visochestvo писал(а):Это нарисовал, в 3Д редакторе для примера

на картинке же вроде юнити, один меш, два материала. что не так?
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Использование одного меша и нескольких материалов

Сообщение Visochestvo 24 фев 2017, 20:48

да но отредактированный в 3D редакторе, а нужно меш рисовать в юнити и назначать материалы
Visochestvo
UNIверсал
 
Сообщения: 453
Зарегистрирован: 01 фев 2014, 14:11

Re: Использование одного меша и нескольких материалов

Сообщение DbIMok 24 фев 2017, 21:24

правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Использование одного меша и нескольких материалов

Сообщение Visochestvo 24 фев 2017, 21:50

DbIMok писал(а):http://answers.unity3d.com/questions/1134075/material-for-each-submesh-in-script.html

думаю это то что надо попробую, спасибо с праздником :)
Visochestvo
UNIверсал
 
Сообщения: 453
Зарегистрирован: 01 фев 2014, 14:11

Re: Использование одного меша и нескольких материалов

Сообщение Visochestvo 25 фев 2017, 03:14

хм. пока получается так что 3 материала накладываются друг на друга... не понял как сделать что бы материл применялся только к новым треугольникам...

Синтаксис:
Используется csharp
private MeshRenderer render;
private Mesh mesh;

public Material[] materials;
private GameObject mark;
private Vector3[] vertices;
private int[] triangles;
private Vector2[] uvs;
private Color[] colors;

//Start
mark = new GameObject("mark");
render = mark.AddComponent<MeshRenderer> ();
render.materials = materials;
mesh = mark.AddComponent<MeshFilter> ().mesh;
mesh.subMeshCount = materials.Length;
....

//Update
....

triangles [segmentCount * 6 + 0] = segmentCount * 4 + 0;
triangles [segmentCount * 6 + 1] = segmentCount * 4 + 2;
triangles [segmentCount * 6 + 2] = segmentCount * 4 + 1;
                               
triangles [segmentCount * 6 + 3] = segmentCount * 4 + 2;
triangles [segmentCount * 6 + 4] = segmentCount * 4 + 3;
triangles [segmentCount * 6 + 5] = segmentCount * 4 + 1;
....

if (currMaterial == "Grass (Instance)") {
   mesh.SetTriangles(triangles, 0);
}
if (currMaterial== "Sand (Instance)") {
   mesh.SetTriangles(triangles, 1);
}
if (currMaterial == "Asphalt (Instance)") {
   mesh.SetTriangles(triangles, 2);
}
mesh.vertices = vertices;
mesh.uv = uvs;
mesh.colors = colors;
mesh.RecalculateBounds ();


получается он берет весь массив треугольников и меняет материал...
Visochestvo
UNIверсал
 
Сообщения: 453
Зарегистрирован: 01 фев 2014, 14:11

Re: Использование одного меша и нескольких материалов

Сообщение DbIMok 25 фев 2017, 08:43

Смысл в том, что меш может состоять из сабмешей, каждый из которых может иметь свой материал. Для этого нужно сообщить треугольникам к какому сабмешу они относятся и какой их индекс материала в массиве. А вы одним и тем же triangles назначаете разные материалы.
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Использование одного меша и нескольких материалов

Сообщение Visochestvo 25 фев 2017, 19:52

Это я уже понял, но как указать какие треугольники относятся к какому сабмешу. Пробовал создать отдельные массивы для треугольников разных материалов, и добавлять треугольники в массивы при разных условиях, что то не вышло...
Visochestvo
UNIверсал
 
Сообщения: 453
Зарегистрирован: 01 фев 2014, 14:11

Re: Использование одного меша и нескольких материалов

Сообщение Visochestvo 27 фев 2017, 03:01

Разобрался, оказалось все просто...

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

Синтаксис:
Используется csharp
                                verts.Add (last.posl);
                                verts.Add (last.posr);
                                verts.Add (curr.posl);
                                verts.Add (curr.posr);

                                colors.Add (new Color (1, 1, 1, last.intensity));
                                colors.Add (new Color (1, 1, 1, last.intensity));
                                colors.Add (new Color (1, 1, 1, curr.intensity));
                                colors.Add (new Color (1, 1, 1, curr.intensity));
                               
                                uvs.Add (new Vector2 (0, 0));
                                uvs.Add (new Vector2 (1, 0));
                                uvs.Add (new Vector2 (0, 1));
                                uvs.Add (new Vector2 (1, 1));

                                if (CurrentMaterial == "Asphalt (Instance)") {
                                        trisID1.Add (index + 0);
                                        trisID1.Add (index + 2);
                                        trisID1.Add (index + 1);
                                        trisID1.Add (index + 2);
                                        trisID1.Add (index + 3);
                                        trisID1.Add (index + 1);
                                } else if (CurrentMaterial == "Grass (Instance)") {
                                        trisID2.Add (index + 0);
                                        trisID2.Add (index + 2);
                                        trisID2.Add (index + 1);
                                        trisID2.Add (index + 2);
                                        trisID2.Add (index + 3);
                                        trisID2.Add (index + 1);
                                } else if (CurrentMaterial == "Sand (Instance)") {
                                        trisID3.Add (index + 0);
                                        trisID3.Add (index + 2);
                                        trisID3.Add (index + 1);
                                        trisID3.Add (index + 2);
                                        trisID3.Add (index + 3);
                                        trisID3.Add (index + 1);
                                }
                        }
                        _Mesh.vertices = verts.ToArray ();
                        _Mesh.SetTriangles (trisID1.ToArray(), 0);
                        _Mesh.SetTriangles (trisID2.ToArray(), 1);
                        _Mesh.SetTriangles (trisID3.ToArray(), 2);
                        _Mesh.uv = uvs.ToArray ();
                        _Mesh.colors = colors.ToArray ();
                        _Mesh.RecalculateNormals ();
Visochestvo
UNIверсал
 
Сообщения: 453
Зарегистрирован: 01 фев 2014, 14:11


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 26