Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

problemas con el script

Iniciado por yaneisy, Enero 14, 2016, 12:28:19 PM

Tema anterior - Siguiente tema
Hola, como soy nueva en lo de unity voy poco a poco haciendo mis cosas, primero en un script tenia esto:

using UnityEngine;

using System.Collections;

 

[RequireComponent(typeof(MeshFilter))]

public class ReverseNormals : MonoBehaviour

{

 

    void Start()

    {

        MeshFilter filter = GetComponent(typeof(MeshFilter)) as MeshFilter;

        if (filter != null)

        {

            Mesh mesh = filter.mesh;

 

            Vector3[] normals = mesh.normals;

            for (int i = 0; i < normals.Length; i++)

                normals = -normals;

            mesh.normals = normals;

 

            for (int m = 0; m < mesh.subMeshCount; m++)

            {

                int[] triangles = mesh.GetTriangles(m);

                for (int i = 0; i < triangles.Length; i += 3)

                {

                    int temp = triangles[i + 0];

                    triangles[i + 0] = triangles[i + 1];

                    triangles[i + 1] = temp;

                }

                mesh.SetTriangles(triangles, m);

            }

        }

    }

}

 

 

Y se lo asignaba a un gameobject de tipo esfera que yo tenia en la escena y funcionaba super bien. Pero ahora necesito desde un script crear la esfera y que se inviertan sus normales y lo he tratado de hacer asi y no me funciona lo de la funcion InvertirNormales miren ahi les pongo el codigo a ver que puedo hacer para que me funciones todo desde el escript:

 

                GameObject esfera = GameObject.CreatePrimitive(PrimitiveType.Sphere);

               esfera.transform.position = new Vector3((float) p.x, 0, (float) p.z);

               Renderer rend = esfera.GetComponent<Renderer>();

              rend.material.mainTexture = Resources.Load("texturas/"+ p.file_name) as Texture;

                        InvertirNormales(esfera.GetComponent<MeshFilter>());

 

 

 

    //funcion de invertir normales

 

    void InvertirNormales(MeshFilter filter)

    {

        //MeshFilter filter = GetComponent(typeof(MeshFilter)) as MeshFilter;

        if (filter != null)

        {

            Mesh mesh = filter.mesh;

 

            Vector3[] normals = mesh.normals;

            for (int i = 0; i < normals.Length; i++)

                normals = -normals;

            mesh.normals = normals;

 

            for (int m = 0; m < mesh.subMeshCount; m++)

            {

                int[] triangles = mesh.GetTriangles(m);

                for (int i = 0; i < triangles.Length; i += 3)

                {

                    int temp = triangles[i + 0];

                    triangles[i + 0] = triangles[i + 1];

                    triangles[i + 1] = temp;

                }

                mesh.SetTriangles(triangles, m);

            }

        }

    }

}


            Vector3[] normals = mesh.normals;

            for (int i = 0; i < normals.Length; i++)

                normals = -normals;

            mesh.normals = normals;

 

Ese codigo te hacia algo en serio ? debo estar muy pajaro xD tengo que probarlo ... pero ahora me entero que se puede hacer Vector3[] = -Vector3[] (eso me ha matado) y en ese estado, encontrar el sentido a ese for ya seria lo mas xD pero si te funcionaba, he aprendido algo nuevo ^.^ yo hubiera dicho que incluso deberia de saltar un error de codigo. Con eso, ya te habras imaginado que no podre ser de mucha ayuda


Pues como bien explique anteriormente, el codigo de la clase public class ReverseNormals : MonoBehaviour, funcionaba bien como un script ReverseNormals.cs y asignarlo a una esfera en la escena, pero ahora yo quiero crear por codigo la esfera y mediante una funcion invertir sus normales pues ahi es donde tengo el problema, por eso pido ayuda. Esto sirve para cuando le pones textura a una esfera y le inviertes sus normales puedes introducir una camara dentro y ver la textura dentro de la esfera y no por fuera. 

[quote author=yaneisy date=1452784940" data-ipsquote="" data-cite="yaneisy" class="ipsQuote">Esto sirve para cuando le pones textura a una esfera y le inviertes sus normales puedes introducir una camara dentro y ver la textura dentro de la esfera y no por fuera. [/quote]Si ... ya se lo que significa invertir las normales ^.^ es el codigo (mas bien las lineas que cite) lo que me mato, y no la funcion que hace o pretende hacerEn cualquier caso, si aseguras que el script ReverseNormals funciona perfectamente no entiendo el problema ... para que quieres hacer otra funcion en otro script que hace exactamente lo mismo ? Solo necesitas 2 lineas :GameObject esfera = GameObject.CreatePrimitive (PrimitiveType.Sphere);esfera.AddComponent<ReverseNormals> ();Con esas dos lineas ya tienes las normales invertidas; en realidad lo unico que hace es añadir el script ReverseNormals a la nueva esfera y como este ya tienes comprobado que funciona ... pues trabajo hecho ;)

[quote author=Arthure date=1452785500" data-ipsquote="" data-cite="Arthure" class="ipsQuote">Si ... ya se lo que significa invertir las normales ^.^ es el codigo (mas bien las lineas que cite) lo que me mato, y no la funcion que hace o pretende hacer[/quote]se te volarán las calcetas cuando sepas que puedes multiplicar un vector por un escalar: -Vector3 es lo mismo que Vector3 * -1 ;)

[quote author=Braltor date=1452790403" data-ipsquote="" data-cite="Braltor" class="ipsQuote">se te volarán las calcetas cuando sepas que puedes multiplicar un vector por un escalar: -Vector3 es lo mismo que Vector3 * -1 [/quote]no te lo tomes a mal eh ! pero y cuando aprendamos a leer ... que volara ? xDYa me diras lo que tiene que ver Vector3 [ ] * (-1) con Vector3 * (-1) porque hasta el momento yo no le encuentro la similitudQue es posible multiplicar un Vector3 por cualquier numero lo se de sobra, que si lo multiplicas por -1 da la direccion contraria lo se de sobra ... pero que tiene que un Vector3 con un array (no la posicion de un array que si seria lo mismo que tu dices) ?No te lo tomes a mal, es costumbre hablar antes de leer las cosas bien ... siempre de buen rollito ;)

eso es cuestion de "operator overloads"

[quote author=Arthure" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="34911" data-ipsquote-contentcommentid="126050">Si ... ya se lo que significa invertir las normales ^.^ es el codigo (mas bien las lineas que cite) lo que me mato, y no la funcion que hace o pretende hacerEn cualquier caso, si aseguras que el script ReverseNormals funciona perfectamente no entiendo el problema ... para que quieres hacer otra funcion en otro script que hace exactamente lo mismo ? Solo necesitas 2 lineas :GameObject esfera = GameObject.CreatePrimitive (PrimitiveType.Sphere);esfera.AddComponent<ReverseNormals> ();Con esas dos lineas ya tienes las normales invertidas; en realidad lo unico que hace es añadir el script ReverseNormals a la nueva esfera y como este ya tienes comprobado que funciona ... pues trabajo hecho ;)

Cita de: Braltor date=1452791188" data-ipsquote="" data-cite="Braltor" class="ipsQuote">eso es cuestion de "operator overloads"/quote]mmm en ese script no sobreescribe ningun operador ... por otra parte, tengo serias dudas que alguien que pregunta las dudas que tiene yaneisy (aunque no estoy criticando su nivel, solo remarco que se le nota que esta empezando en la programacion) tenga los conocimientos de sobreescribr los operadores cuando es algo que se utiliza en ocasiones especificas y lo mas comun es sobreescribir los operadores con clases propias y no clases que ya existen.teniendo en cuenta que no tiene "operator overloads", al menos que se pueda observar (y cuesta creer que lo tenga en cualquier otro script) ... entiendes ahora mejor mi duda de porque no comprendia la linea en cuestion que cite ? seguramente otra vez leas mejor ... de buen rollito claro ;)

Como bien dices estoy empezando en este mundo de la programación y de usar Unity, y si les pido ayuda a ustedes es porque ya llevan tiempo y tiene la experiencia que yo no tengo, como bien explique al principio yo use un script para invertir normales http://wiki.unity3d.com/index.php/ReverseNormals" rel="external nofollow">ReverseNormals que me funcionaba bien y lo obtuve de esta direccion http://wiki.unity3d.com/index.php/ReverseNormals" rel="external nofollow"><http://wiki.unity3d.com/index.php/ReverseNormals>. lo que como no sabia yo usar un script desde el mismo script por eso intentaba llamar a la función InvertirNormales hecha con el mismo codigo del script que tenia anteriormente. Pero ya ire cogiendo experiencia en el tema.

No tiene caso yaneisy ... todos hemos empezado en algun momento u otro con la programacion y se sabe que es algo complicado o lioso al principio; aunque te recomiendo tirar mucho de la pagina de referencia oficial de unity cuando no sepas si existe alguna funcion como en este caso la de AddComponent.Al margen de eso ... muchas gracias por poner la pagina de donde sacaste el script jajajaja me habia dejado todo loco, pero ahora ya esta resuelto el misterio ^.^ ya decia yo que no era normal y te debia tirar algun error; la cosa es que lo habias copiado mal aqui en el foro :Vector3 [ ] normals = mesh.normals;for (int i = 0; i < normals.Length; i ++) normals = -normals;mesh.normals = normals;Mientras que lo correcto seria :Vector3 [ ] normals = mesh.normals;for (int i = 0; i < normals.Length; i ++) normals [ i ] = -normals [ i ];mesh.normals = normals;

Pues si es cierto, no me di cuenta a la hora de copiarlo sorry, pero gracias por la ayuda. 

Etiquetas: