unity通过Mesh网格绘制图形球体

本文实例为大家分享了unity通过Mesh网格绘制球体的具体代码,供大家参考,具体内容如下

接着上一篇文章说:

球体

public class 球体 : MonoBehaviour
{
    MeshRenderer meshRenderer;
    MeshFilter meshFilter;

    List<Vector3> verts;
    List<int> indices;
    int N = 10;
    void Start()
    {
        verts = new List<Vector3>();
        indices = new List<int>();
        meshRenderer = GetComponent<MeshRenderer>();
        meshFilter = GetComponent<MeshFilter>();
        BuildModel();
    }

    void BuildModel()
    {
        for(float i = -N / 2f; i <= N / 2f; i++)
        {
            for(float j = -N / 2f; j <= N / 2f; j++)
            {
                verts.Add(new Vector3(i, j, -N / 2f));
            }
        }
        for (float i = -N / 2f; i <= N / 2f; i++)
        {
            for (float j = -N / 2f; j <= N / 2f; j++)
            {
                verts.Add(new Vector3(N / 2f, j, i));
            }
        }
        for (float i = -N / 2f; i <= N / 2f; i++)
        {
            for (float j = -N / 2f; j <= N / 2f; j++)
            {
                verts.Add(new Vector3(i, N / 2f, j));
            }
        }
        for (float i = -N / 2f; i <= N / 2f; i++)
        {
            for (float j = -N / 2f; j <= N / 2f; j++)
            {
                verts.Add(new Vector3(-N / 2f, j, i));
            }
        }
        for (float i = -N / 2f; i <= N / 2f; i++)
        {
            for (float j = -N / 2f; j <= N / 2f; j++)
            {
                verts.Add(new Vector3(i, j, N / 2f));
            }
        }
        for (float i = -N / 2f; i <= N / 2f; i++)
        {
            for (float j = -N / 2f; j <= N / 2f; j++)
            {
                verts.Add(new Vector3(i, -N / 2f, j));
            }
        }

        //真正控制球体成型的部分
        for (int i = 0; i < verts.Count; i++)
        {
            verts[i] = verts[i].normalized;
        }
        //绘制
        MakePos(0);
        MakePos(1);
        MakePos(2);
        OtherMakePos(3);
        OtherMakePos(4);
        OtherMakePos(5);
        Draw();
    }
    public void MakePos(int num)
    {
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < N; j++)
            {
                int index = j * (N + 1) + (N + 1) * (N + 1)* num + i;
                int up = (j + 1) * (N + 1) + (N + 1) * (N + 1)* num + i;
                indices.AddRange(new int[] { index, index + 1, up + 1 });
                indices.AddRange(new int[] { index, up + 1, up });
            }
        }
    }
    public void OtherMakePos(int num)
    {
        for (int i = 0; i < N + 1; i++)
        {
            for (int j = 0; j < N + 1; j++)
            {
                if (i != N && j != N)
                {
                    int index = j * (N + 1) + (N + 1) * (N + 1) * num + i;
                    int up = (j + 1) * (N + 1) + (N + 1) * (N + 1) * num + i;
                    indices.AddRange(new int[] { index, up + 1, index + 1 });
                    indices.AddRange(new int[] { index, up, up + 1 });
                }
            }
        }
    }
    public void Draw()
    {
        Mesh mesh = new Mesh();
        mesh.vertices = verts.ToArray();
        mesh.triangles = indices.ToArray();
        mesh.RecalculateNormals();
        mesh.RecalculateBounds();
        meshFilter.mesh = mesh;
    }
}

原理

假设手里有个空的正方体牛奶盒,我们拿习惯向里吹起,会让牛奶盒的六个面都鼓起来。牛奶盒够软并且气体足够多的话,它就会越逼近球体。
即:先创建一个正方体/长方体/正八面体等等等等,只要是个闭合的图形并且顶点的数量够多分布的够均匀,效果应该就不错。

然后将所有的顶点和物体中心连线并截取同样的长度,保证所有顶点到中心点的距离相等。

调整所有三角形顶点的坐标和物体中心的距离相等:

取正方体的中心点作为球的中心点,也是为了让各个顶点分布的比较均匀。
以下是设定球的半径为1并且中心点刚好在(0,0,0)的情况:

for (int i = 0; i < verts.Count; i++)
        {
            verts[i] = verts[i].normalized;
        }

若中心点不在(0,0,0)的话

for (int i = 0; i < verts.Count; i++)
            {
                Vector3 vec3 = verts[i];
                Vector3 o = new Vector3(1, 2, 3);//例如中心点在(1,2,3)
                verts[i] = o + (vec3 - o).normalized;
            }

效果:

原来正方体的接缝处变成球体之后仍存在:
原因请参考上一章讨论绘制正方体的部分:链接: 绘制正方体.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Unity3D网格功能生成球体网格模型

    本文实例为大家分享了Unity3D网格功能生成球体网格模型的具体代码,供大家参考,具体内容如下 前面已经讲过怎样使用mesh生成一个自己的网格,那么本文将会讲述怎样将这个网格变换成自己想要的形状,比如一个球体. 我们需要知道一个从平面坐标到球体坐标的映射公式.假设平面坐标是(x,y),球体坐标是(x0,y0,z0),则 球体坐标(x0,y0,z0)可以通过以下代码得到,(x,y) 对应vertices[i].x和vertices[i].y. v.x = r * Mathf.Cos(vertice

  • unity通过Mesh网格绘制图形球体

    本文实例为大家分享了unity通过Mesh网格绘制球体的具体代码,供大家参考,具体内容如下 接着上一篇文章说: 球体 public class 球体 : MonoBehaviour { MeshRenderer meshRenderer; MeshFilter meshFilter; List<Vector3> verts; List<int> indices; int N = 10; void Start() { verts = new List<Vector3>()

  • unity通过Mesh网格绘制图形(三角形、正方体、圆柱)

    一.介绍 Mesh类:通过脚本创建或是获取网格的类,网格包含多个顶点和三角形数组.顶点信息包含坐标和所在面的法线. unity中3D的世界的所有图形全部都是由三角形构成的. 比如unity已经装配好的几种图形我们可以看一下: 我们可以在unity中通过Mesh类来绘制图形. 所以在我们绘制其它图形之前,首先完成一个小目标,画一个三角形. 二.绘制三角形 首先做准备工作: 1.在场景中创建一个空物体,并挂载MeshRenderer和MeshFilter组件.//我们先不考虑碰撞器的问题,所以不添加

  • PyQt5的PyQtGraph实践系列3之实时数据更新绘制图形

    在之前介绍PyQtGraph的文章中,我们都是一次性的获取数据并将其绘制为图形.然而在很多场景中,我们都需要对实时的数据进行图形化展示,比如:股票的实时行情.仪器设备的实时状态等,这时候就需要对数据进行实时的更新和绘制. 今天我们就来介绍一下在PyQtGraph中根据实时数据更新绘制图形. 今天的例子我们通过编写一个电脑CPU实时使用率助手来讲解. 一.通过Python获取实时的CPU信息 在Windows操作系统的电脑上,我们通过"任务管理器"可以很方便地查看到自己电脑CPU实时的使

  • Unity中 mesh生成斜坡的示例代码

    Mesh概念: Mesh是Unity中的一个组件,称为网格组件.通俗的讲,Mesh是指模型的网格,3D模型是由多边形拼接而成,而多边形实际上是由多个三角形拼接而成的.所以一个3D模型的表面其实是由多个彼此相连的三角面构成.三维空间中,构成这些三角形的点和边的集合就是Mesh. Mesh组成: 1.顶点坐标数组vertexes 2.顶点在uv坐标系中的位置信息数组uvs 3.三角形顶点顺时针或者逆时针索引数组triangles 4.MeshFiler组件,用于增加mesh属性 5.MeshRend

  • WPF基于物理像素绘制图形

    WPF中有一个DrawingContext类,该类提供了很多画法方法,例如DrawLine,DrawText,DrawRectangle等.开发者使用它们可以方便地进行图形绘制.不过,在使用DrawingContext过程中,我发现使用DawLine方法画出的线条在某些部分有些模糊.这个问题的解决,需要一些计算机图形学方面的知识,使用的方法并不是很复杂.不过,这个方法所涉及到的一些过程有些令人费解(好吧,我没有专门学过计算机图形学),本文是我在实践中的一些尝试和经验的总结. 还是从一个例子开始吧

  • C#画笔Pen使用路径绘制图形的方法

    本文实例讲述了C#画笔Pen使用路径绘制图形的方法.分享给大家供大家参考.具体实现方法如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Drawing.Drawing2D; namesp

  • Android shape 绘制图形的实例详解

    Android shape 绘制图形 Android 绘制图形可以使用shape也可以使用自定义控件的方式,这里我们说下shape的方式去实现. 在绘制图形之前,我们先来了解下shape的几个属性. shape /* * 线行 圆形 矩形 / android:shape="line" android:shape="oval" android:shape="rectangle" size 图形的大小 <size android:height=

  • Java如何在PPT中绘制图形

    Microsoft PowerPoint可支持在幻灯片中插入各种类型的图形并且可设置图形填充.线条颜色.图形大小.位置等.下面将通过Java编程来演示在PPT中绘制图形的方法. 工具:Free Spire.Presentation for Java Jar文件导入方法1:通过官网下载. Step1:在程序中新建一个Directory目录并命名为lib:并将控件包中的Spire.Presentation.jar(可在解压控件包下的lib文件中获取)直接复制该目录下. Step2: 选中复制后的Sp

  • Python实现在tkinter中使用matplotlib绘制图形的方法示例

    本文实例讲述了Python实现在tkinter中使用matplotlib绘制图形的方法.分享给大家供大家参考,具体如下: 一. 代码: # coding=utf-8 import sys import Tkinter as Tk import matplotlib from numpy import arange, sin, pi from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg,NavigationToolbar2T

随机推荐