Mesh Vertices

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Re: Mesh Vertices

Сообщение Medveckij 14 янв 2013, 17:05

seaman писал(а):Дорогое, конечно, но сделать можно. Почему у Вас не заработало понять без кода невозможно, а вы его так и не привели.



Заработало. Все по логике за исключением одной строчки. зачем она нужна? ---> myMesh.vertices = myVertices;


К примеру мы пишем:

Синтаксис:
Используется csharp
Mesh myMesh = new Mesh();              
go.AddComponent<MeshFilter>().mesh = myMesh;

Vector3[] myVertices = myMesh.vertices; //<<------ вот тут мы задаем переменную массиву вершин.

myVertices = new Vector3[]
                {
                        new Vector3(1, 1, 0),
                        new Vector3(1, 0, 0),
                        new Vector3(0 ,0, 0)
                };

myMesh.vertices = myVertices; // <<------- но без этой строчки Unity ругается. Для чего она нужна?
 


Если я правильно понимаю, то

1) мы задаем переменную массиву вершин;
2) в массиве перечисляем координаты вершин;
3) а последней строчкой подытоживаем перечисленное? или Как?
Аватара пользователя
Medveckij
Адепт
 
Сообщения: 1014
Зарегистрирован: 10 ноя 2012, 15:44

Re: Mesh Vertices

Сообщение Medveckij 14 янв 2013, 17:52

И в итоге вышло вот что...

Синтаксис:
Используется csharp

public bool letsTryThis = false;

void Start()
        {
               
                GameObject go = this.gameObject;
               
                go.AddComponent<MeshRenderer>();
               
                go.renderer.sharedMaterial = new Material(Shader.Find("Diffuse"));
               
                go.renderer.sharedMaterial.color = Color.yellow;
               
               
                Mesh myMesh = new Mesh();
               
                go.AddComponent<MeshFilter>().mesh = myMesh;
               
               
                Vector3[] myVertices = myMesh.vertices;
                Vector2[] myUv = myMesh.uv;
                int[] myTris = myMesh.triangles;
               
               
                myVertices = new Vector3[]
                {
                        new Vector3(1, 1, 0),
                        new Vector3(1, 0, 0),
                        new Vector3(0, 0, 0)
                };
               
               
                myUv = new Vector2[]
                {
                    new Vector2(0, 0),
                        new Vector2(0, 0),     
                        new Vector2(0, 0)
                };
               
               
                myTris = new int[]
                {
                        0, 1, 2
                };
               

                myMesh.vertices = myVertices;
               
                myMesh.uv = myUv;
               
                myMesh.triangles = myTris;
               
               
                myMesh.RecalculateNormals();
               
        }
       
       
       
        void Update()
        {

                if(letsTryThis)
                {
                       
                        Mesh newMesh = GetComponent<MeshFilter>().mesh;
                       
                        Vector3[] newVertices = newMesh.vertices;
                        Vector2[] newUV = newMesh.uv;
                        int[] newTris = newMesh.triangles;
                       
                        newVertices = new Vector3[]
                        {
                                new Vector3(2, 2, 0),
                                new Vector3(2, 0, 0),
                                new Vector3(0, 0, 0)
                        };
                       
                        newUV = new Vector2[]
                        {
                                new Vector2(0, 0),
                                new Vector2(0, 0),
                                new Vector2(0, 0)
                        };
                       
                        newTris = new int[]
                        {
                            0, 1, 2    
                        };

                        newMesh.vertices = newVertices;
                        newMesh.uv = newUV;
                        newMesh.triangles = newTris;
                       
                        newMesh.RecalculateNormals();
                       
                        letsTryThis = false;
                }
       
        }

 
Аватара пользователя
Medveckij
Адепт
 
Сообщения: 1014
Зарегистрирован: 10 ноя 2012, 15:44

Re: Mesh Vertices

Сообщение Medveckij 14 янв 2013, 20:57

Ну вот, вроде как добился чего хотел. А вот как плавно изменить позицию вершины пока непонятно.

Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class ShapeScript : MonoBehaviour {
       
        public int indexus = 0;
       
        private bool rotateShape1 = false;
       
       
        void Start()
        {

                GameObject go = this.gameObject;
               
                go.AddComponent<MeshRenderer>();
               
                go.renderer.sharedMaterial = new Material(Shader.Find("Diffuse"));
               
                go.renderer.sharedMaterial.color = Color.green;
               
               
                Mesh newMesh = new Mesh();
               
                go.AddComponent<MeshFilter>().mesh = newMesh;
               
                Vector3[] newVert = newMesh.vertices;
                Vector2[] newUV = newMesh.uv;
                int[] newTris = newMesh.triangles;
               
               
                newMesh.vertices = newVert;
                newMesh.uv = newUV;
                newMesh.triangles = newTris;
               
                newMesh.RecalculateNormals();

        }
       
        void Update()
        {
               
               
               
                /////////////////////////////////////////////////////////////////////////
                if(indexus == 1)
                {
                       
                gameObject.GetComponent<MeshRenderer>();
                gameObject.renderer.sharedMaterial.color = Color.green;
               
                Mesh newMesh = GetComponent<MeshFilter>().mesh;
                newMesh.Clear();
                       
                       
                Vector3[] newVert = newMesh.vertices;
                Vector2[] newUV = newMesh.uv;
                int[] newTris = newMesh.triangles;
               
                newVert = new Vector3[]
                {
                        new Vector3(0, 2, 0), new Vector3(1, 0, -1), new Vector3(-1, 0, -1),
                       
                        new Vector3(-1, 0, 1), new Vector3(1, 0, 1), new Vector3(0, 2, 0),
                       
                        new Vector3(-1, 0, -1), new Vector3(-1, 0, 1), new Vector3(0, 2, 0),
                       
                        new Vector3(0, 2, 0), new Vector3(1, 0, 1), new Vector3(1, 0, -1),
                       
                        new Vector3(1, 0, -1), new Vector3(1, 0, 1), new Vector3(-1, 0, -1),
                       
                        new Vector3(-1, 0, -1), new Vector3(1, 0, 1), new Vector3(-1, 0, 1)
                };
               
                newUV = new Vector2[]
                {
                        new Vector2(1, 1), new Vector2(1, 0), new Vector2(0, 0),
                        new Vector2(1, 1), new Vector2(1, 0), new Vector2(0, 0),
                        new Vector2(1, 1), new Vector2(1, 0), new Vector2(0, 0),
                        new Vector2(1, 1), new Vector2(1, 0), new Vector2(0, 0),
                        new Vector2(1, 1), new Vector2(1, 0), new Vector2(0, 0),
                        new Vector2(1, 1), new Vector2(1, 0), new Vector2(0, 0)
                };
               
                newTris = new int[]
                {
                        0, 1, 2,    3, 4, 5,    6, 7, 8,    9, 10, 11,    12, 13, 14,    15, 16, 17
                };
               
                newMesh.vertices = newVert;
                newMesh.uv = newUV;
                newMesh.triangles = newTris;
               
                newMesh.RecalculateNormals();
                       
                indexus = 0;
                       
                rotateShape1 = true;
                       
                }
                //////////////////////////////////////////////////////////////////////////////////
               
               
               
               
                //////////////////////////////////////////////////////////////////
                if(indexus == 2)
                {
                       
                gameObject.GetComponent<MeshRenderer>();
                gameObject.renderer.sharedMaterial.color = Color.yellow;
                       
                Mesh newMesh = GetComponent<MeshFilter>().mesh;
                newMesh.Clear();
               
                Vector3[] newVert = newMesh.vertices;
                Vector2[] newUV = newMesh.uv;
                int[] newTris = newMesh.triangles;
               
                newVert = new Vector3[]
                {
                        new Vector3(-1, 0, -1), new Vector3(1, 0, -1), new Vector3(0, 0, -3),
                       
                        new Vector3(0, 0, 3), new Vector3(1, 0, 1), new Vector3(-1, 0, 1),
                       
                        new Vector3(-3, 0, 0), new Vector3(-1, 0, 1), new Vector3(-1, 0, -1),
                       
                        new Vector3(1, 0, -1), new Vector3(1, 0, 1), new Vector3(3, 0, 0),
                       
                        new Vector3(-1, 0, -1), new Vector3(1, 0, 1), new Vector3(1, 0, -1),
                       
                        new Vector3(-1, 0, 1), new Vector3(1, 0, 1), new Vector3(-1, 0, -1)
                };
               
                newUV = new Vector2[]
                {
                        new Vector2(1, 1), new Vector2(1, 0), new Vector2(0, 0),
                        new Vector2(1, 1), new Vector2(1, 0), new Vector2(0, 0),
                        new Vector2(1, 1), new Vector2(1, 0), new Vector2(0, 0),
                        new Vector2(1, 1), new Vector2(1, 0), new Vector2(0, 0),
                        new Vector2(1, 1), new Vector2(1, 0), new Vector2(0, 0),
                        new Vector2(1, 1), new Vector2(1, 0), new Vector2(0, 0)
                };
               
                newTris = new int[]
                {
                        0, 1, 2,    3, 4, 5,    6, 7, 8,    9, 10, 11,    12, 13, 14,    15, 16, 17
                };
               
                newMesh.vertices = newVert;
                newMesh.uv = newUV;
                newMesh.triangles = newTris;
               
                newMesh.RecalculateNormals();
                       
                indexus = 0;
                       
                rotateShape1 = true;
                       
                }
                /////////////////////////////////////////////////////////////////////
               
               
               
               
               
                if(rotateShape1)
                gameObject.transform.Rotate(0, 100 * Time.deltaTime, 0);
               

        }

        void OnGUI()
        {
               
               
                if(GUI.Button(new Rect(10, 10, 100, 40), "Click me" ))
                {
                        indexus = 1;
                }
               
                if(GUI.Button(new Rect(120, 10, 100, 40), "Click me 2" ))
                {
                        indexus = 2;
                }
       
        }
       
       

}

 
Аватара пользователя
Medveckij
Адепт
 
Сообщения: 1014
Зарегистрирован: 10 ноя 2012, 15:44

Re: Mesh Vertices

Сообщение Neodrop 14 янв 2013, 21:07

Меши менять можно. Вот, наглядный пример : viewtopic.php?f=99&t=5836
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Mesh Vertices

Сообщение Medveckij 14 янв 2013, 21:29

Neodrop писал(а):Меши менять можно. Вот, наглядный пример : viewtopic.php?f=99&t=5836


кра-со-та. К чему и пытаюсь прийти. Any advice как изменить позицию вершины, но плавно? Изменить я уже изменил, но не плавно.
Аватара пользователя
Medveckij
Адепт
 
Сообщения: 1014
Зарегистрирован: 10 ноя 2012, 15:44

Re: Mesh Vertices

Сообщение aler 15 янв 2013, 04:08

Гугли Interpolation. Есть линейная интерполяция и не линейная, что касается органики (типа, воды), природа очень хорошо имитируется через синусойды.

Вот пример написал, повесить нужно на стандартный плейник.

Синтаксис:
Используется csharp
using UnityEngine;

public class MeshVerticesAnimation : MonoBehaviour
{
    private MeshFilter _mf;

    public float Scale = 0.1f;

        // Use this for initialization
        void Start ()
        {
            _mf = GetComponent<MeshFilter>();
        }
       
        // Update is called once per frame
        void Update ()
        {
            var verts = _mf.mesh.vertices;
            for (var i = 0; i < verts.Length; i+=2)
            {
                var dir = Vector3.up;
                var shift = dir*(Mathf.Sin(Time.time*Mathf.PI))*Scale;

                verts[i] += shift;
            }

            _mf.mesh.vertices = verts;
            _mf.mesh.RecalculateNormals();
        }
}
 
Аватара пользователя
aler
UNIверсал
 
Сообщения: 351
Зарегистрирован: 20 фев 2011, 17:41

Re: Mesh Vertices

Сообщение aler 15 янв 2013, 04:08

Но вообще если есть возможность, лучше делать через шейдер
Аватара пользователя
aler
UNIверсал
 
Сообщения: 351
Зарегистрирован: 20 фев 2011, 17:41

Re: Mesh Vertices

Сообщение Medveckij 15 янв 2013, 06:35

aler писал(а):Гугли Interpolation. Есть линейная интерполяция и не линейная, что касается органики (типа, воды), природа очень хорошо имитируется через синусойды.

Вот пример написал, повесить нужно на стандартный плейник.

Синтаксис:
Используется csharp
using UnityEngine;

public class MeshVerticesAnimation : MonoBehaviour
{
    private MeshFilter _mf;

    public float Scale = 0.1f;

        // Use this for initialization
        void Start ()
        {
            _mf = GetComponent<MeshFilter>();
        }
       
        // Update is called once per frame
        void Update ()
        {
            var verts = _mf.mesh.vertices;
            for (var i = 0; i < verts.Length; i+=2)
            {
                var dir = Vector3.up;
                var shift = dir*(Mathf.Sin(Time.time*Mathf.PI))*Scale;

                verts[i] += shift;
            }

            _mf.mesh.vertices = verts;
            _mf.mesh.RecalculateNormals();
        }
}
 



Ага, интересный эффект :) Спасибо, обязательно погуглю.

Подобное уже делал (признаюсь, не сам, подсмотрел вычисления на форумах) и все это конечно замечательно. Но есть ли возможность манипулировать конкретным количеством вершин, а не вершинами в целом? К примеру, чтобы трансформировать один многогранник в другой? Плавненько, с добавлением вершин походу дела.
Аватара пользователя
Medveckij
Адепт
 
Сообщения: 1014
Зарегистрирован: 10 ноя 2012, 15:44

Re: Mesh Vertices

Сообщение BigPando 19 янв 2013, 10:52

Но есть ли возможность манипулировать конкретным количеством вершин, а не вершинами в целом? К примеру, чтобы трансформировать один многогранник в другой? Плавненько, с добавлением вершин походу дела.


Пардонте, что я влазию в вашу беседу.

вы не это ищете ?

Синтаксис:
Используется javascript
 // This script is placed in public domain. The author takes no responsibility for any possible harm.

var scale = 1.0;
var speed = 1.0;
var recalculateNormals = false;

private var baseVertices : Vector3[];
private var noise : Perlin;

function Start ()
{
        noise = new Perlin ();
}

function Update () {

        var mesh : Mesh = GetComponent(MeshFilter).mesh;
       
        if (baseVertices == null)
                baseVertices = mesh.vertices;
               
        var vertices = new Vector3[baseVertices.Length];
       
        var timex = Time.time * speed + 0.1365143;
        var timey = Time.time * speed + 1.21688;
        var timez = Time.time * speed + 2.5564;
        for (var i=0;i<vertices.Length;i++)
        {
                var vertex = baseVertices[i];
                               
                vertex.x += noise.Noise(timex + vertex.x, timex + vertex.y, timex + vertex.z) * scale;
                vertex.y += noise.Noise(timey + vertex.x, timey + vertex.y, timey + vertex.z) * scale;
                vertex.z += noise.Noise(timez + vertex.x, timez + vertex.y, timez + vertex.z) * scale;
               
                vertices[i] = vertex;
        }
       
        mesh.vertices = vertices;
       
        if (recalculateNormals)
                mesh.RecalculateNormals();
        mesh.RecalculateBounds();
       
}
У вас нет доступа для просмотра вложений в этом сообщении.
BigPando
UNец
 
Сообщения: 11
Зарегистрирован: 07 мар 2012, 14:14

Re: Mesh Vertices

Сообщение Medveckij 19 янв 2013, 14:55

Спасибо за помощь, но я уже написал то, что мне было нужно :ympeace:

Было не сложно. Как оказалось:

Скрытый текст:
Изображение
Аватара пользователя
Medveckij
Адепт
 
Сообщения: 1014
Зарегистрирован: 10 ноя 2012, 15:44

Re: Mesh Vertices

Сообщение Cyrix 23 мар 2013, 23:47

Скажите, какой смысл "шуметь" вершинами, если MeshCollider всё равно остаётся ровным? Вот создали мы планету, при помощи шума перлина на поврхности всякие неровности, а смысл? Всё равно персонаж будет проходить насквозь.
Cyrix
UNIт
 
Сообщения: 116
Зарегистрирован: 16 сен 2009, 11:32

Re: Mesh Vertices

Сообщение Medveckij 23 мар 2013, 23:53

Cyrix писал(а):Скажите, какой смысл "шуметь" вершинами, если MeshCollider всё равно остаётся ровным? Вот создали мы планету, при помощи шума перлина на поврхности всякие неровности, а смысл? Всё равно персонаж будет проходить насквозь.


Вам поумничать захотелось? Кто сказал, что динамика мешей мне была нужна для рельефа поверхности? Кто сказал, что я не хотел раздробить бочку на осколки? Или собрать по кускам пункты меню? Впрочем неважно... ценного вы ничего не сказали, да и теме уже миллион лет.
Аватара пользователя
Medveckij
Адепт
 
Сообщения: 1014
Зарегистрирован: 10 ноя 2012, 15:44

Re: Mesh Vertices

Сообщение Cyrix 24 мар 2013, 19:44

да причём здесь Вы??? я говорю вобще о unity3d в целом! есть ли смысл шуметь вершинами, если всё равно это будет лишь красота, "по ходить" по этим вершинам не получится. Может быть кто нибудь уже задумывался об этом? Как пересчитать mesh collider относительно шума перлина?
Cyrix
UNIт
 
Сообщения: 116
Зарегистрирован: 16 сен 2009, 11:32

Re: Mesh Vertices

Сообщение Woolf 24 мар 2013, 20:01

Cyrix писал(а):да причём здесь Вы??? я говорю вобще о unity3d в целом! есть ли смысл шуметь вершинами, если всё равно это будет лишь красота, "по ходить" по этим вершинам не получится. Может быть кто нибудь уже задумывался об этом? Как пересчитать mesh collider относительно шума перлина?


Кто сказал, что не получится? С чего вы это вообще взяли? Что такое mesh collider вы не знаете?

PS 90% современных игр - это тоже просто "только красота". заполнять базу данных числами можно и без 3д графики и звуковых эффектов.
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: Mesh Vertices

Сообщение Medveckij 24 мар 2013, 20:36

Cyrix писал(а):да причём здесь Вы??? я говорю вобще о unity3d в целом! есть ли смысл шуметь вершинами, если всё равно это будет лишь красота, "по ходить" по этим вершинам не получится. Может быть кто нибудь уже задумывался об этом? Как пересчитать mesh collider относительно шума перлина?


Эта тема содержит конкретный вопрос на который дали несколько полезных ответов. У вас есть вопросы? Создайте тему с вопросом/проблемой и вам обязательно помогут. И да, в Unity можно сделать абсолютно все что душе угодно. Тут все претензии к навыкам, знаниям.
Аватара пользователя
Medveckij
Адепт
 
Сообщения: 1014
Зарегистрирован: 10 ноя 2012, 15:44

Пред.

Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot], Yandex [Bot] и гости: 12