2 / 2 / 1
Регистрация: 11.05.2013
Сообщений: 99

Procedural generation index

11.01.2015, 00:56. Показов 1132. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток, я только начал изучение unity3d, и меня заинтересовала процедурная генерация объектов.
Я делаю свой EditorWindow и сейчас научился делать плоскость с заранее заданными координатами. Вот может кому пригодится.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
GameObject objPlane = new GameObject("Procedural_Plane");
        var meshFilter = objPlane.AddComponent<MeshFilter>();
        var meshRenderer = objPlane.AddComponent<MeshRenderer>();
        
        Mesh mesh = new Mesh();
        meshFilter.mesh = mesh;
        
        Vector3[] vertices = new Vector3[]{
            new Vector3(-0.5f, 0, 0.5f),
            new Vector3(-0.5f, 0, -0.5f),
            new Vector3(0.5f, 0, -0.5f),
            new Vector3(0.5f, 0, 0.5f)
        };
        
        int[] indices = new []{0, 3, 1, 2, 1, 3};
        
        Vector3[] normals = new Vector3[]{
            new Vector3(0, 1, 0),
            new Vector3(0, 1, 0),
            new Vector3(0, 1, 0),
            new Vector3(0, 1, 0)
        };
        
        Vector2[] uv = new Vector2[]{
            new Vector2(0, 0),
            new Vector2(0, 1),
            new Vector2(1, 1),
            new Vector2(1, 0),
        };
        
        mesh.vertices = vertices;
        mesh.SetIndices(indices, MeshTopology.Triangles, 0);
        mesh.normals = normals;
        mesh.uv = uv;
У меня вопрос. Я сейчас делаю динамическую генерацию объекта (т.е. пока что в коде только указываю размеры плоскости и она сама генерируется по координатам). Генерацию вершин я сделал, но ни как не могу разобраться с индексами. Может кто нибудь поможет? хотя бы подсказать? я уже вроде все обрисовал на бумаге, мне не нужен код, подсказать нужно только сам алгоритм. Заранее спасибо за помощь
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.01.2015, 00:56
Ответы с готовыми решениями:

4K Procedural GFX demo
Отреверсил демку fruxis от rgba. Хочу поделиться с общественностью. Авторы использовали какой-то адовый упаковщик (точка входа...

Три файла,(index.coo, index.doc, index.lex) а что за БД не знаю
Мне дали файловую БД(о-очень много файлов) и три файла: index.coo, index.doc и index.lex. ни doc, ни lex не открываются ни Word-ом ни...

index.html на index.aspx (index.php...)
Вот, собственно, мучаясь с проблемой вылета сайта из топа 1000 (до этого было более 10 топовых (#1) позиций и около тридцати топ 10 позиций...

6
211 / 201 / 63
Регистрация: 24.09.2014
Сообщений: 532
11.01.2015, 10:47
Вобщем индексы описывают индексы вершин для топологии.
В твоём примере у тебя выбрана топология Triangles для неё индексы берутся по 3 штуки и из них строятся треугольники.
Т.е. будет построено 2 треугольника по вершинам с индексами 0, 3, 1 и по 2, 1, 3.
(Кстати для этого можно использовать не SetIndeces, а просто Mesh.triangles)

Возможно более наглядно понять индексы можно по мануалу

Еще пара примеров:
укажи индексы int[] indices = new int[] { 0, 1, 1, 2, 2, 3, 3, 0 }; а топологию выбери Lines. Будут построены линии для каждой пары индексов (0-1)(1-2)(2-3)(3-0)
укажи индексы int[] indices = new int[] { 3,2,1,0 }; а топологию выбери Quads. Будет построен Quad, состоящий из двух треугольников
0
2 / 2 / 1
Регистрация: 11.05.2013
Сообщений: 99
11.01.2015, 20:01  [ТС]
Спасибо за ответ) но я слегка о другом. вот код которым я генерю вершины

C#
1
2
3
4
5
6
7
8
9
for (int y = 0; y < columnVertexCount; ++y) {
            float rowY = (y * -rowHeight) + (planeHeight / 2.0f);
            for(int x = 0; x < rowVertexCount; ++x){
                float columnX = (x  * columnWidth) + (-planeWidth / 2.0f);
                int stringOffset = y * rowVertexCount + x;
                vertices[stringOffset] = new Vector3(columnX, 0, rowY);
                Debug.Log("Vertices string offset = " + vertices[stringOffset]);
            }
        }
и индексы должны сами генерироваться в зависимости от того сколько вершин, т.е. их не жестко задавать, а они сами должны создаваться.
0
211 / 201 / 63
Регистрация: 24.09.2014
Сообщений: 532
12.01.2015, 10:33
Auron, так нельзя сделать. Тебе в любом случае надо еще описать алгоритм и самому из кода строить треугольники по индексам.
вот например процедурная генерация круга (step это угол шага построения 1-360)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
        var verticles = new Vector3[step + 2];
        var triangles = new int[step * 3];
        var uvs = new Vector2[step + 2];
 
        for (int x = 0; x <= step; x += 1)
        {
            float ang = (360 / step) * x;
            Vector3 pos1 = Vector3.zero;
            pos1.x = topRadius * Mathf.Sin(ang * Mathf.Deg2Rad);
            pos1.y = topRadius * Mathf.Cos(ang * Mathf.Deg2Rad);
            Vector2 pos2 = Vector2.zero;
            pos2.x = Mathf.Sin(ang * Mathf.Deg2Rad)/2f + 0.5f;
            pos2.y = Mathf.Cos(ang * Mathf.Deg2Rad)/2f + 0.5f;
            pos1.z = z;
            verticles[x] = pos1;
            uvs[x] = pos2;
        }
 
        uvs[step + 1] = new Vector2(0.5f, 0.5f);
        verticles[step + 1] = new Vector3(0f, 0f, z);
 
        for (int x = 0; x < step; x += 1)
        {
            triangles[x * 3] = _vert.Length + verticles.Length - 1;
            triangles[x * 3 + (invert ? 2 : 1)] = _vert.Length + x;
            triangles[x * 3 + (invert ? 1 : 2)] = _vert.Length + x + 1;
        }
1
2 / 2 / 1
Регистрация: 11.05.2013
Сообщений: 99
12.01.2015, 18:57  [ТС]
а invert это тоже массив?
0
211 / 201 / 63
Регистрация: 24.09.2014
Сообщений: 532
13.01.2015, 00:50
Auron, не, это bool переменная инвертировать нормали. Нормали при автоматической генерации строятся в зависимости от очередности вершин в треугольнике
1
2 / 2 / 1
Регистрация: 11.05.2013
Сообщений: 99
18.01.2015, 21:48  [ТС]
вот что получилось, но все равно не правильно(((
никак не пойму

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Index
        int numTriangles = (rowVertexCount - 1) * (columnVertexCount - 1) * 2;
        //Debug.Log("numTriangle = " + numTriangles);
 
        int numIndices = numTriangles * 3;
        //Debug.Log ("numIndices = " + numIndices);
 
        int[] indices = new int[numIndices];
        //Debug.Log ("Indices = " + indices.Length);
 
        int indexCount = 0;
 
        for (int i = 0; i < (rowVertexCount + 1); ++i) {
            for(int j = 0; j < (rowVertexCount + 1); ++j){
                float index =  i + j * rowVertexCount;
 
                indices[indexCount++] = index;
                indices[indexCount++] = index + 1;
                indices[indexCount++] = index + rowVertexCount + 1;
 
                Debug.Log("Index = " + index);
            }
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.01.2015, 21:48
Помогаю со студенческими работами здесь

Generation Model YII
Не работает Generation Model, остальные генерации работают. В чем может быть причина?

Генерация пароля (pasword generation)
первым делом спросил гугл ;) то что увидел в первых подборка меня &quot;огорчило&quot; наткнулся на вариант кот подошел под критерии &quot;моих...

Информация по библиотеке SimMechanics second generation
Доброго времени суток. Буду рад любой информации по библиотеке SimMechanics second generation. Книги, уроки, вебинары, примеры работы....

Code generation, флаги Runtime Library
Может ли кто-нибудь подсказать по опции в св-вах проекта в дебаг версии, во вкладке С++ Code generation, пункт Runtime Library, почему если...

Code generation does not support anonymous function
Доброго, форумчане. подскажите нубарику в чем ошибка в получении сишного кода интеграла function Q=myint(a,b) %#codegen fun = @(x)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

Новые блоги и статьи
Анализ и линтинг кода JavaScript: ESLint, Prettier и JSHint
run.dev 26.04.2025
JavaScript прошёл долгий путь от простого языка для анимации веб-страниц до основы современной веб-разработки. С ростом сложности приложений, увеличением кодовых баз и масштабированием команд. . .
Паттерны в Python: Singleton, Factory и Observer
py-thonny 26.04.2025
Паттерны проектирования — это проверенные временем решения типовых проблем разработки программного обеспечения. Их история берёт начало с книги "Приёмы объектно-ориентированного проектирования. . . .
Исключения в C#: Stack Overflow, Access Violation и Out of memory
stackOverflow 26.04.2025
Исключения в C# — это не только механизм оповещения о проблемах, а целое искусство управления потоком выполнения программы в экстремальных ситуациях. Обычное исключение, например,. . .
Логирование в C# ASP.NET Core с помощью Serilog, ElasticSearch, Kibana
stackOverflow 25.04.2025
Помните те времена, когда для анализа проблемы приходилось подключаться к серверу, искать нужный лог-файл среди десятков других и вручную фильтровать тысячи строк в поисках ошибки? К счастью, эти дни. . .
Структура "железный OnKeyUp" вместо антидребезга. Полностью асинхронный счётчик.
Hrethgir 25.04.2025
Программа для симуляции схемы - Logisim Evolution В общем какое-то время отвлёкся, так было надо, теперь когда запилю это на verilog и FPGA , досоставлю заявку в ФИПС на полезную модель - не готов. . .
Автоматизация Amazon Web Services (AWS) с Boto3 в Python
py-thonny 25.04.2025
Облачные вычисления стали неотъемлемой частью современной ИТ-инфраструктуры, а Amazon Web Services (AWS) занимает лидирующие позиции среди провайдеров облачных услуг. Управление многочисленными. . .
Apache Kafka vs RabbitMQ в микросервисной архитектуре
ArchitectMsa 25.04.2025
Современная разработка ПО всё чаще склоняется к микросервисной архитектуре — подходу, при котором приложение разбивается на множество небольших, автономных сервисов. В этой распределённой среде. . .
Параллельное программирование с OpenMP в C++
NullReferenced 24.04.2025
Параллельное программирование — подход к созданию программ, когда одна задача разбивается на несколько подзадач, которые могут выполняться одновременно. Оно стало необходимым навыком для. . .
Цепочки методов в C# с Fluent API
UnmanagedCoder 24.04.2025
Современное программирование — это не только решение функциональных задач, но и создание кода, который удобно поддерживать, расширять и читать. Цепочки методов и Fluent-синтаксис в C# стали мощным. . .
Мульти-тенантные БД с PostgreSQL Row Security
Codd 23.04.2025
Современные облачные сервисы и бизнес-приложения всё чаще обслуживают множество клиентов в рамках единой программной инфраструктуры. Эта архитектурная модель, известная как мульти-тенантность, стала. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru