Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
4 / 3 / 1
Регистрация: 18.11.2018
Сообщений: 39

Бесшовная стыковка двух mesh поверхностей

30.11.2021, 04:37. Показов 807. Ответов 3

Студворк — интернет-сервис помощи студентам
Есть поверхность, которая генерируется скриптом. 131 на 131 вершин. Y-координаты каждой вершины смещены случайным образом с помощью функции шума Перлина. Игрок перемещается по этой поверхности. Когда коллайдер игрока входит в коллайдер-триггер, должна создаться новая поверхность, сгенерированная с другими случайными y-координатами, сместиться так чтобы соприкасаться с первой плоскостью, образуя с ней якобы одну целую непрерывную поверхность, то есть таким образом, чтобы шов между поверхностями на стыке не был заметен. Что я делаю:

вот так я генерирую поверхность:
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
    public GameObject triggerForGenerator;
 
    Mesh mesh;
    MeshCollider meshCollider;
 
    Vector3[] vertices;
    int[] triangles;
 
    public int xSize;
    public int zSize;
    public float surfaceCurve = 0.3f;
 
    public void CreateShape(Vector3[] firstLine = null)
    {
        mesh = new Mesh();
        mesh.name = "Snow";
        GetComponent<MeshFilter>().mesh.Clear();
        GetComponent<MeshFilter>().mesh = mesh;
        meshCollider = GetComponent<MeshCollider>();
 
        vertices = new Vector3[(xSize + 1) * (zSize + 1)];
        int index = 0;
        int z = 0;
   
        for (; z <= zSize; z++)
        {
            for (int x = 0; x <= zSize; x++)
            {
                float y;
                //для первого ряда ставим Y как у последнего ряда предыдущего мэша
                if (x == 0 && z == 0 && firstLine != null)
                    y = firstLine[index].y;
                else
                    y = Mathf.PerlinNoise(x * .3f, z * .3f) * surfaceCurve;
 
                vertices[index] = new Vector3(x, y, z);
                index++;
            }
        }
 
        triangles = new int[xSize * zSize * 6];
        int vert = 0;
        int tris = 0;
 
        for (z = 0; z < zSize; z++)
        {
            for (int x = 0; x < xSize; x++)
            {
                triangles[tris + 0] = vert + 0;
                triangles[tris + 1] = vert + xSize + 1;
                triangles[tris + 2] = vert + 1;
                triangles[tris + 3] = vert + 1;
                triangles[tris + 4] = vert + xSize + 1;
                triangles[tris + 5] = vert + xSize + 2;
 
                vert++;
                tris += 6;
            }
            vert++;
        }
 
        mesh.Clear();
        mesh.vertices = vertices;
        mesh.triangles = triangles;
 
        mesh.RecalculateNormals();
        meshCollider.sharedMesh = mesh;
        GetComponent<MeshFilter>().mesh = mesh;
    }
Дочерним объектом к объекту с этим мешем является триггер-коллайдер. Выглядит это вот так Вложение 1299948.

Затем когда игрок пересекает коллайдер, я вызываю следующий метод:
C#
1
2
3
4
5
6
7
8
9
10
11
12
 public void GenerateNext()
    {
        var nextMeshGenerator = Instantiate(this, 
            new Vector3(transform.position.x + 111.67f, transform.position.y -64.2f, transform.position.z), 
            transform.rotation);
        nextMeshGenerator.triggerForGenerator = nextMeshGenerator.GetComponentInChildren<TriggerForGeneratorController>().gameObject;
 
        Vector3[] lastLine = new Vector3[xSize+1];
        Array.Copy(vertices, vertices.Length - xSize - 1, lastLine, 0, xSize+1);
        nextMeshGenerator.CreateShape(lastLine);
        nextMeshGenerator.triggerForGenerator.GetComponent<TriggerForGeneratorController>().previousMeshGenerator = this.gameObject;
    }
Идея заключается в том чтобы скопировать последний ряд точек текущей поверхности для того чтобы назначить такие же координаты первого ряда новой поверхности. По моему предположению так шов соединения должен совпадать один в один


Но этого не происходит, что особо отчётливо заметно если увеличить высоту шума


Я не понимаю почему так происходит и как сделать чтобы всё стыковалось ровно
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.11.2021, 04:37
Ответы с готовыми решениями:

Cisco Packet Tracer. Не справляюсь, Frame Relay (Mesh/Full Mesh),OSPF с областями
Имеется Облако Frame Relay, к облаку подключены 4 маршрутизатора фота ниже из каждого маршрутизатора выходят 4 свитчи и дальше 4...

Сшивка двух поверхностей
Каким образом можно убрать разрыв при сшивке двух поверхностей? %уравнение сферы в прямоугольной СК ...

ЗД-график из двух поверхностей (плоскостей)
Здравствуйте! У меня задачка с Mathcad(плохо в нем разбираюсь). Есть две поверхности, которые я по точками построил в Excel (файл excel во...

3
4 / 3 / 1
Регистрация: 18.11.2018
Сообщений: 39
30.11.2021, 04:48  [ТС]
чё-то я тупанул конкретно, в условии назначения Y надо убрать x == 0, а то получается что только для одной точки копируется Y)))
0
4 / 3 / 1
Регистрация: 18.11.2018
Сообщений: 39
30.11.2021, 05:03  [ТС]
а как можно скрыть шов? Y у них теперь состыковывается
Миниатюры
Бесшовная стыковка двух mesh поверхностей  
0
4 / 3 / 1
Регистрация: 18.11.2018
Сообщений: 39
30.11.2021, 05:09  [ТС]
копирую 2 ряда, теперь гладко)
Миниатюры
Бесшовная стыковка двух mesh поверхностей  
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.11.2021, 05:09
Помогаю со студенческими работами здесь

Построить график двух пересекающихся поверхностей
f1(x,y)=sin(x^2+y^2) f2(x,y)=x^2+y^2-5 x=. y=

RenderState для двух полупрозрачных поверхностей
Как настроить RenderState , чтобы в 3д две пересекающихся плоских поверхности с полупрозрачными текстурами выглядели реалистично? См....

Построить и отформатировать в одних осях графики двух поверхностей
Построить и отформатировать в одних осях графики двух поверхностей:

Построить пространственную кривую, являющуюся пересечением двух поверхностей
Здравствуйте, у меня такой вопрос. Мне необходимо построить пространственную кривую, являющуюся пересечением двух поверхностей и найти...

Построить и отформатировать в MathCAD в одних осях графики двух поверхностей
Задание : Построить и отформатировать в MathCAD в одних осях графики двух поверхностей. Вроде бы написал в маткаде все правильно, но при...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru