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