Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
82 / 78 / 34
Регистрация: 13.02.2018
Сообщений: 1,347

Генерация непрямых объектов

13.08.2018, 17:36. Показов 2911. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, давно этим интересовался но не доходилось искать ответ, а теперь нужно, но искал и так и не смог найти что-то похожее, собственно как сгенерировать непрямой пол, что бы он не был прямым а примерно таким как в игре на видео:
https://www.youtube.com/watch?v=uQiwC06_cI8
Есть идея сделать много маленьких кусочков, но мне кажется это плохая идея, как можно посмотреть на видео там генерируется все разное, то есть это не заготовки.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.08.2018, 17:36
Ответы с готовыми решениями:

Генерация объектов
Я хочу сгенерировать кодом объект и оставить его в таком положении в редакторе для его изменения уже не в режиме игры. Возможно ли это...

Генерация и движение однотипных объектов в заданную точку
Доброго времени суток. Суть такова: есть начальная и конечная точка пути. В начальной точке создается объект, который движется к...

Генерация объектов по рандомным точкам без повторения
Как сделать так чтобы не повторялись объекты в точках по которым происходит генерация

3
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
13.08.2018, 19:52
Лучший ответ Сообщение было отмечено k0vpack как решение

Решение

k0vpack,
Во-первых, а вы действительно уверены, что вы хотите сделать так как на видео? Там сложность примерно на порядок выше, чем при обычной плоской дороге (переменная гравитация, выставление препятствий по нормалям и все такое, будут сложности с анимациями, нужно будет уметь определять позицию игрока на треке и т.д.).

Ну а в целом, нужно делать так.
Разобьем дорогу на небольшие сегменты. Каждый сегмент характеризуется двумя величинами - вектором направления (d) и нормалью (n):



Соответственно, всю дорогу можно построить из таких сегментов. Если d и n - постоянны, то мы получим просто прямую дорогу.
Но если на каждом шагу немного менять значения n и d, то мы получим искривленную дорогу.
Однако, если менять d и n просто на случайный вектор, то дорога получится очень неровной, рваной. Для того, что бы она была плавной нужно случайный вектор генерировать с помощью случайных непрерывных функций (шум Перлина, симплекс-шум, и т.п.). Я в примере использую coherent noise.

BuildRoad
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class BuildRoad : MonoBehaviour
{
    public int Length = 300;
    public int Seed = 1;
    public float Curvature = 0.2f;
    public float Frequency = 0.1f;
 
    public Material Material;
 
    void Start ()
    {
        var mesh = new Mesh();
 
        BuildMesh(mesh);
 
        var road = new GameObject();
        var mr = road.AddComponent<MeshRenderer>();
        mr.sharedMaterial = Material;
        var mf = road.AddComponent<MeshFilter>();
        mf.mesh = mesh;
        var mc = road.AddComponent<MeshCollider>();
        mc.sharedMesh = mesh;
    }
 
    private void BuildMesh(Mesh mesh)
    {
        var verticies = new List<Vector3>();
        var triangles = new List<int>();
        var p = new Vector3(0, 0, 0);//start point
        var d = new Vector3(0, 0, 1);//start direction
        var n = new Vector3(0, 1, 0);//start normal
 
        for (int i = 0; i < Length; i++)
        {
            //add segment to mesh
            var pp = Vector3.Cross(d, n);
            verticies.Add(p + pp);
            verticies.Add(p - pp);
            if (i >= 2)
            {
                var j = verticies.Count - 1;
                triangles.Add(j - 2);
                triangles.Add(j - 1);
                triangles.Add(j - 0);
 
                triangles.Add(j - 1);
                triangles.Add(j - 2);
                triangles.Add(j - 3);
            }
            //build next segment
            BuildNextSegment(i, ref p, ref d, ref n);
        }
 
        //build mesh
        mesh.vertices = verticies.ToArray();
        mesh.triangles = triangles.ToArray();
        mesh.RecalculateNormals();
        mesh.RecalculateTangents();
        mesh.RecalculateBounds();
    }
 
    private void BuildNextSegment(int i, ref Vector3 p, ref Vector3 d, ref Vector3 n)
    {
        var dd = GetRandomVector(i, 5) * Curvature;
        var dn = GetRandomVector(i, 15) * Curvature;
 
        d += dd;
        n += dn;
 
        d.Normalize();
        n.Normalize();
 
        p += d;
    }
 
    Vector3 GetRandomVector(int i, int seed)
    {
        var x = LPWNoise.GetValue(i * Frequency, seed + Seed * 10);
        var y = LPWNoise.GetValue(i * Frequency, seed + 100 + Seed * 10);
        var z = LPWNoise.GetValue(i * Frequency, seed + 130 + Seed * 10);
 
        return new Vector3(x, y, z).normalized;
    }
}


LPWNoise
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
35
36
37
38
39
40
41
42
using UnityEngine;
 
public static class LPWNoise
{
 
    public static float GetValue(float x, float y)
    {
        int ix = Mathf.FloorToInt(x);
        int iy = Mathf.FloorToInt(y);
 
        float xs = x - ix;
        float ys = y - iy;
 
        float n0 = Hash(ix, iy);
        float n1 = Hash(ix + 1, iy);
        float ix0 = Mathf.Lerp(n0, n1, xs);
 
        n0 = Hash(ix, iy + 1);
        n1 = Hash(ix + 1, iy + 1);
        float ix1 = Mathf.Lerp(n0, n1, xs);
 
        return Mathf.Lerp(ix0, ix1, ys);
    }
 
    const int factorX = 1619;
    const int factorY = 31337;
    const int factorZ = 6971;
    const int factorSeed = 1013;
    //static int seed = 1337;
 
    public static float Hash(int x, int z)
    {
        int n = (
                    factorX * x
                    + factorZ * z
                    + factorSeed) //* seed)
                & 0x7fffffff;
        n = (n >> 13) ^ n;
        n = (n * (n * n * 60493 + 19990303) + 1376312589) & 0x7fffffff;
        return 1 - (n / 1073741824f); // normalize for [-1,1]
    }
}


В результате имеем такую дорожку:

Вложения
Тип файла: zip New Unity Project (4).zip (102.3 Кб, 2 просмотров)
2
82 / 78 / 34
Регистрация: 13.02.2018
Сообщений: 1,347
13.08.2018, 20:42  [ТС]
Storm23, ооу, спасибо за столь ясное деяния, но не могли бы ответить на несколько вопросов:
1)
Цитата Сообщение от Storm23 Посмотреть сообщение
C#
1
var mr = road.AddComponent<MeshRenderer>();
это добавляет компонент в road и одновременно переменная mr ссылается на этот компонент?;
2)
Цитата Сообщение от Storm23 Посмотреть сообщение
C#
1
2
3
4
5
int n = (
 factorX * x
+ factorZ * z
 + factorSeed) //* seed)
 & 0x7fffffff;
не пойму зачем приравнивать к максимальному числу (32)?
3)еще у меня ошибка:
Assets/BuildRoad.cs(62,14): error CS1061: Type `UnityEngine.Mesh' does not contain a definition for `RecalculateTangents' and no extension method `RecalculateTangents' of type `UnityEngine.Mesh' could be found (are you missing a using directive or an assembly reference?)
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
13.08.2018, 21:01
Лучший ответ Сообщение было отмечено k0vpack как решение

Решение

Цитата Сообщение от k0vpack Посмотреть сообщение
это добавляет компонент в road и одновременно переменная mr ссылается на этот компонент?;
Да.
Цитата Сообщение от k0vpack Посмотреть сообщение
не пойму зачем приравнивать к максимальному числу (32)?
Отрезается знак числа.
Цитата Сообщение от k0vpack Посмотреть сообщение
еще у меня ошибка
Ну закоментируйте RecalculateTangents. Это не столь важно.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.08.2018, 21:01
Помогаю со студенческими работами здесь

Рандомная генерация уровня. Смена направления генерации объектов
Всем привет. Не могу сменить направление генерации объектов. Требуется после 15 созданных объектов сменить направление на (-1, -1). Кол-во...

Генерация объектов
Здравствуйте. Я пишу программу, которая работает с сайтом. Я отсылаю на сервер запрос, мне приходит ответ в виде json. Допустим, у меня...

Генерация комбинаторных объектов
как сделать, чтобы была возрастающая последовательность? 1+1+1+1, 1+1+2, 1+3, 2+2, 4 program Razbieniya; type Razb=array of byte; ...

Рандомная генерация объектов
Помогите, как сделать так чтобы по всей ширине дороги, начали появляться препятствия(встречный транспорт) и всегда в разным местах. Делаю...

Динамическая генерация объектов по строке имени
Есть ли возможность как то переопределить в следующем коде For Each Letter In ActiveDocument.Paragraphs сущность константы...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. fontSize": 18, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations":. . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru