| Изменение меша в 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
 
 Последнее:
 
 Новый раздел "Текстуры"
 
 Как запатентовать, защитить техническое решение, игру, идею
 |  |  |  |  |