zoukankan      html  css  js  c++  java
  • 使用Unity3D的网格功能生成自己的球体网格模型

            前面已经讲过怎样使用mesh生成一个自己的网格,那么本文将会讲述怎样将这个网格变换成自己想要的形状,比如一个球体。

    我们需要知道一个从平面坐标到球体坐标的映射公式。假设平面坐标是(x,y),球体坐标是(x0,y0,z0),则

          

            球体坐标(x0,y0,z0)可以通过以下代码得到,(x,y) 对应vertices[i].x和vertices[i].y。

                v.x = r * Mathf.Cos(vertices[i].x / width * 2 * Mathf.PI) * Mathf.Cos(vertices[i].y / height * Mathf.PI - Mathf.PI / 2);
                v.y = r * Mathf.Sin(vertices[i].x / width * 2 * Mathf.PI) * Mathf.Cos(vertices[i].y / height * Mathf.PI - Mathf.PI / 2);
                v.z = r * Mathf.Sin(vertices[i].y / height * Mathf.PI - Mathf.PI / 2);

               完整代码在最后,将完整的脚本绑定到一个空物体上,把棋盘格图案chessboard.jpg放到AssetsResources下,还要在场景中生成一个sphere作为显示网格顶点的辅助物体。一切就绪后,运行效果如下:




    using UnityEngine;
    using System.Collections;
    
    public class BallMesh : MonoBehaviour
    {
    
        Mesh mesh;
        Vector3[] vertices;
        Vector2[] uv;
        int[] triangles;
        Vector3[] normals;
        public GameObject sphere;
        GameObject[] spheres;
        
        void Start()
        {
            gameObject.AddComponent<MeshFilter>();
            gameObject.AddComponent<MeshRenderer>();
            Texture img = (Texture)Resources.Load("tm");
            gameObject.GetComponent<Renderer>().material.mainTexture = img;
            mesh = new Mesh();
            int m = 25; //row  
            int n = 50;  //col  
            float width = 8;
            float height = 6;
            vertices = new Vector3[(m + 1) * (n + 1)];//the positions of vertices  
            spheres = new GameObject[(m + 1) * (n + 1)];
            uv = new Vector2[(m + 1) * (n + 1)];
            normals = new Vector3[(m + 1) * (n + 1)];
            triangles = new int[6 * m * n];
            for (int i = 0; i < vertices.Length; i++)
            {
                float x = i % (n + 1);
                float y = i / (n + 1);
                float x_pos = x / n * width;
                float y_pos = y / m * height;
                vertices[i] = new Vector3(x_pos, y_pos, 0);
                float u = x / n;
                float v = y / m;
                uv[i] = new Vector2(u, v);
            }
            for (int i = 0; i < 2 * m * n; i++)
            {
                int[] triIndex = new int[3];
                if (i % 2 == 0)
                {
                    triIndex[0] = i / 2 + i / (2 * n);
                    triIndex[1] = triIndex[0] + 1;
                    triIndex[2] = triIndex[0] + (n + 1);
                }
                else
                {
                    triIndex[0] = (i + 1) / 2 + i / (2 * n);
                    triIndex[1] = triIndex[0] + (n + 1);
                    triIndex[2] = triIndex[1] - 1;
    
                }
                triangles[i * 3] = triIndex[0];
                triangles[i * 3 + 1] = triIndex[1];
                triangles[i * 3 + 2] = triIndex[2];
            }
           
            int r = 10;
            for (int i = 0; i < vertices.Length; i++)
            {
                spheres[i] =  Instantiate( sphere,this.transform) as GameObject;
                Vector3 v ;
                v.x = r * Mathf.Cos(vertices[i].x / width * 2 * Mathf.PI) * Mathf.Cos(vertices[i].y / height * Mathf.PI - Mathf.PI / 2);
                v.y = r * Mathf.Sin(vertices[i].x / width * 2 * Mathf.PI) * Mathf.Cos(vertices[i].y / height * Mathf.PI - Mathf.PI / 2);
                v.z = r * Mathf.Sin(vertices[i].y / height * Mathf.PI - Mathf.PI / 2);
                //v = vertices[i];
    
                vertices[i] = v;
                spheres[i].transform.localPosition = v;
    
                normals[i] = new Vector3(0,1,0);
            }
            
            mesh.vertices = vertices;
            mesh.normals = normals;
            mesh.uv = uv;
            mesh.triangles = triangles;
            this.GetComponent<MeshFilter>().mesh = mesh;
    
        }
    
    }  
    




  • 相关阅读:
    1212. 地宫取宝
    895. 最长上升子序列
    高層タワー [MISSION LEVEL: B]
    分组背包
    多重背包
    1015. 摘花生
    1211. 蚂蚁感冒
    1205. 买不到的数目
    SQL基础教程(第2版)第4章 数据更新:4-2 数据的删除(DELETE)
    SQL基础教程(第2版)第4章 数据更新:4-1 数据的插入(INSERT)
  • 原文地址:https://www.cnblogs.com/yanhuiqingkong/p/7770082.html
Copyright © 2011-2022 走看看