Пятница, 07 Октября 2022, 05:38

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Модератор форума: beril  
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Изменение меша в realtime
Изменение меша в realtime
romeo98Дата: Пятница, 30 Января 2015, 08:23 | Сообщение # 1
участник
Сейчас нет на сайте
Недавно начал разбираться с программной деформацией мешей. Попытался сделать пример: на шаре при столкновении с объектом образуется кратер. Порывшись в интернете нашел код, который я подредактировал под себя. Вот что из этого вышло:
Код

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class PlanetEditor : MonoBehaviour
{
          protected static Transform editorTransform;

          // MESH
          private Mesh mesh;
          private Vector3[] points;
          private Vector3[] vertices;
          private int[] triangles;
          private Vector2[] uvs;

          public float depthLimit = 25;

          public float brushStrength = 0.1f;
          public float brushSize = 1;

          void Start()
          {
              editorTransform = transform;
              mesh = GetComponent<MeshFilter>().mesh;
              Spheriphy();
          }

          void HitCollision(Vector3 colPoint)
          {
              LowerPoint(DefineBrushSize(colPoint), brushStrength);
          }

          void Spheriphy()
          {
              vertices = mesh.vertices;
              triangles = mesh.triangles;
              uvs = mesh.uv;

              mesh.Clear();
              mesh.vertices = vertices;
              mesh.triangles = triangles;
              mesh.uv = uvs;
              mesh.Optimize();
              mesh.RecalculateNormals();
              points = mesh.vertices;

              gameObject.AddComponent<MeshCollider>();
          }

          Vector3 FindNearestPoint(Vector3 point)
          {
              Vector3 nearestPoint = new Vector3();
              float lastDistance = 9999999;

              for (int i = 0; i < points.Length; i++)
              {
                  float distance = Vector3.Distance(point, points[i]);

                  if (distance < lastDistance)
                  {
                      lastDistance = distance;
                      nearestPoint = points[i];
                  }
              }
              return nearestPoint;
          }

          public Vector3[] DefineBrushSize(Vector3 point)
          {
              List<Vector3> brushPoints = new List<Vector3>();
              Vector3 nearestPoint = FindNearestPoint(point);

              for (int i = 0; i < points.Length; i++)
              {
                  float distance = Vector3.Distance(nearestPoint, points[i]);

                  if (distance <= brushSize)
                  {
                      brushPoints.Add(points[i]);
                  }
              }
              return brushPoints.ToArray();
          }

          public void LowerPoint(Vector3[] editPoints, float strength)
          {
              for (int z = 0; z < editPoints.Length; z++)
              {
                  for (int i = 0; i < points.Length; i++)
                  {
                      if (points[i] == editPoints[z])
                      {
                          float pointDistance = Vector3.Distance(points[i], editorTransform.position);

                          if (pointDistance > depthLimit)
                          {
                    for (int v = 0; v < editPoints.Length; v++)
                    {
                        points[i] = points[i].normalized * (pointDistance - strength);
                    }
                          }
                      }
                  }
              }
              UpdateMesh();
          }

          public void UpdateMesh()
          {
              mesh.Clear();
              mesh.vertices = points;
              mesh.triangles = triangles;
              mesh.uv = uvs;
              mesh.Optimize();
              mesh.RecalculateNormals();
              points = mesh.vertices;
          }
}


Код вообще не мой, я просто удалил лишние для моей задачи. Вместе с кодом прилагался меш. Как я предпологаю, этот меш просто сфера с большим числом полигонов, чем стандартная. Я попытался заменить этот меш на свой. Своя моделька вроде бы тоже не малополигональная. Есть отличие в рельефе, тоесть, меш в комплекте просто высокопол. сфера, а у меня рельефная сфера (типо земля с горами). Код на сфере с новым мешом перестал работать - кратеры не образуются. Был бы благодарен, если подскажите более изящное решение (если есть) или поможете с этой проблемой.

P.S. Функция "HitCollision" вызывается извне. Ее вызывает объект, с которым столкнулась сфера и этот объект передает в функцию свои координаты.

Добавлено (30 января 2015, 08:23)
---------------------------------------------
Что? Нет идей?


Flist - social platform
PuzzleSystem - Open-source Unity Asset
[2D] Mission: Defender


Сообщение отредактировал romeo98 - Четверг, 29 Января 2015, 01:06
OtinagiДата: Пятница, 30 Января 2015, 09:24 | Сообщение # 2
постоянный участник
Сейчас нет на сайте
Может, размеры моделей разные, и изменения просто не заметны и невозможны? Если модель большая, то надо и brushStrength, brushSize соответственно увеличывать.

«Смерти меньше всего боятся те люди, чья жизнь имеет наибольшую ценность.»
Иммануил Кант
romeo98Дата: Суббота, 31 Января 2015, 22:11 | Сообщение # 3
участник
Сейчас нет на сайте
Есть у кого-нибудь идеи как лучше это сделать? Мне нужны не столько кратеры, сколько "разрушаемые горы". С каждым поподанием гора должна разрушатся. Как бы это сделать?

Flist - social platform
PuzzleSystem - Open-source Unity Asset
[2D] Mission: Defender
shizofrenДата: Суббота, 31 Января 2015, 22:22 | Сообщение # 4
Starting MS-DOS...
Сейчас нет на сайте
romeo98, просто составить объект геометрии с набором мешей, как кирпичик. При попадании в крипичик часть разлетаются. По примеру майнкрафта.

Моя команда
romeo98Дата: Понедельник, 02 Февраля 2015, 23:23 | Сообщение # 5
участник
Сейчас нет на сайте
shizofren, а нагрузка не большая будет? Все-таки, грубо говоря целый мир, хоть и не большой... Плюс, это тогда придется каждую гору делать, как отдельный объект, а затем делить на части? Ох мне кажется нагрузка будет... Я приму во внимание этот вариант, но кто-нибудь предложит еще?

Добавлено (02 февраля 2015, 23:23)
---------------------------------------------
Все еще нужны варианты решения задачи...


Flist - social platform
PuzzleSystem - Open-source Unity Asset
[2D] Mission: Defender


Сообщение отредактировал romeo98 - Суббота, 31 Января 2015, 23:49
berilДата: Вторник, 03 Февраля 2015, 00:15 | Сообщение # 6
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
ты этот исходник нашел в интернете?



Накодил? Убери за собой!
Инвентарь в Unity(UI)
Инвентарь в Unity(GUI)
MANMANAДата: Вторник, 03 Февраля 2015, 00:23 | Сообщение # 7
почти ветеран
Сейчас нет на сайте
коллайдеров, я так понимаю, не будет?
или у тебя меш коллайдер, т.е. еще и изменяется (ли?) в реальном времени?
если так - то тормоза будут кошмарные.
не проще ли изменять форму через шейдер?
есть шейдеры для трепещущего флага, для смещения меша целиком, удаления части меша и деформации меша.
p.s. лишь предположение... шейдеры такие встречал, примитивные коллайдеры при изменении меша не меняются в таком случае (остаются на месте даже при смещении меша в конкретно взятой реализации). сам в шейдерах не слишком силен


http://www.3dbuffer.com/ Текстуры, Unity3D, Blender: Эффекты, скрипты, моделирование, текстурирование, скульптинг
VKонтакте 3Dbuffer

Последнее:

Новый раздел "Текстуры"

Как запатентовать, защитить техническое решение, игру, идею
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Изменение меша в realtime
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2022 Рейтинг