Esempio n. 1
0
        public static GameObject CreateOcean(GameObject sphere, SphereProperties sphereProps, OceanProperties oceanProps)
        {
            GameObject oceanObj = SphereGenerator.GenPrimitive (sphereProps);
            MeshRenderer r = oceanObj.AddComponent<MeshRenderer>();
            r.material = oceanProps.material;
            r.material.mainTexture = oceanProps.texture;
            r.material.mainTextureScale = oceanProps.textureScale;
            oceanObj.transform.position = sphere.transform.position;
            oceanObj.transform.localScale = oceanProps.scale;

            return oceanObj;
        }
Esempio n. 2
0
        public static GameObject GenPrimitive(SphereProperties initProps)
        {
            GameObject obj = new GameObject();
            obj.name = "SpherePrimitive";
            MeshFilter filter = obj.AddComponent<MeshFilter>();
            Mesh mesh = filter.mesh;
            mesh.name = "SphereMesh";
            mesh.Clear();

            float radius = initProps.radius; //1f
            // Longitude |||
            int nbLong = initProps.longitude;  //24
            // Latitude ---
            int nbLat = initProps.latitude;  //16

            #region Vertices
            Vector3[] vertices = new Vector3[(nbLong+1) * nbLat + 2];
            float _pi = Mathf.PI;
            float _2pi = _pi * 2f;

            vertices[0] = Vector3.up * radius;
            for( int lat = 0; lat < nbLat; lat++ )
            {
                float a1 = _pi * (float)(lat+1) / (nbLat+1);
                float sin1 = Mathf.Sin(a1);
                float cos1 = Mathf.Cos(a1);

                for( int lon = 0; lon <= nbLong; lon++ )
                {
                    float a2 = _2pi * (float)(lon == nbLong ? 0 : lon) / nbLong;
                    float sin2 = Mathf.Sin(a2);
                    float cos2 = Mathf.Cos(a2);

                    vertices[ lon + lat * (nbLong + 1) + 1] = new Vector3( sin1 * cos2, cos1, sin1 * sin2 ) * radius;
                }
            }
            vertices[vertices.Length-1] = Vector3.up * -radius;
            #endregion

            #region Normals
            Vector3[] normals = new Vector3[vertices.Length];
            for( int n = 0; n < vertices.Length; n++ )
                normals[n] = vertices[n].normalized;
            #endregion

            #region UVs
            Vector2[] uvs = new Vector2[vertices.Length];
            uvs[0] = Vector2.up;
            uvs[uvs.Length-1] = Vector2.zero;
            for( int lat = 0; lat < nbLat; lat++ )
                for( int lon = 0; lon <= nbLong; lon++ )
                    uvs[lon + lat * (nbLong + 1) + 1] = new Vector2( (float)lon / nbLong, 1f - (float)(lat+1) / (nbLat+1) );
            #endregion

            #region Triangles
            int nbFaces = vertices.Length;
            int nbTriangles = nbFaces * 2;
            int nbIndexes = nbTriangles * 3;
            int[] triangles = new int[ nbIndexes ];

            //Top Cap
            int i = 0;
            for( int lon = 0; lon < nbLong; lon++ )
            {
                triangles[i++] = lon+2;
                triangles[i++] = lon+1;
                triangles[i++] = 0;
            }

            //Middle
            for( int lat = 0; lat < nbLat - 1; lat++ )
            {
                for( int lon = 0; lon < nbLong; lon++ )
                {
                    int current = lon + lat * (nbLong + 1) + 1;
                    int next = current + nbLong + 1;

                    triangles[i++] = current;
                    triangles[i++] = current + 1;
                    triangles[i++] = next + 1;

                    triangles[i++] = current;
                    triangles[i++] = next + 1;
                    triangles[i++] = next;
                }
            }

            //Bottom Cap
            for( int lon = 0; lon < nbLong; lon++ )
            {
                triangles[i++] = vertices.Length - 1;
                triangles[i++] = vertices.Length - (lon+2) - 1;
                triangles[i++] = vertices.Length - (lon+1) - 1;
            }
            #endregion

            mesh.vertices = vertices;
            mesh.normals = normals;
            mesh.uv = uvs;
            mesh.triangles = triangles;

            mesh.RecalculateBounds();
            mesh.Optimize();

            return obj;
        }