Unity3D之Mesh(五)绘制圆

前言:

Unity3D中Mesh的基本单位是三角形,而圆形就是由许许多多的三角形组成的。那么我们就知道了绘制圆形的Mesh需要两个变量:圆的半径  以及分割数;



一、实现过程

基本过程与之前的类似,最基本的依然是顶点以及三角形索引数组,即:我们需要根据圆的半径以及预备的分割数,通过算法得到:顶点的Vector3数组 以及对应的三角形索引数组;

1、基本的程序实现架构如下:

using UnityEngine;

[RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))]
public class yuan : MonoBehaviour
{

    public float Radius = 6;    //半径
    public int Segments = 60;   //分割数  

    private MeshFilter meshFilter;

    void Start()
    {

        meshFilter = GetComponent<MeshFilter>();
        meshFilter.mesh = CreateMesh(Radius, Segments);
    }

    Mesh CreateMesh(float radius, int segments)
    {
        Mesh mesh = new Mesh();
        return mesh;
    }
}

2、接下来就需要实现CreateMesh()函数的基本功能(下述的程序包含该函数功能的实现);整个程序的代码如下:

using UnityEngine;

[RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))]
public class yuan : MonoBehaviour
{
    public float Radius = 6;    //半径
    public int Segments = 60;   //分割数
    private MeshFilter meshFilter;

    void Start()
    {
        meshFilter = GetComponent<MeshFilter>();
        meshFilter.mesh = CreateMesh(Radius, Segments);
    }

    Mesh CreateMesh(float radius, int segments)
    {
        //vertices:
        int vertices_count = Segments + 1;
        Vector3[] vertices = new Vector3[vertices_count];
        vertices[0] = Vector3.zero;
        float angledegree = 360.0f;
        float angleRad = Mathf.Deg2Rad * angledegree;
        float angleCur = angleRad;
        float angledelta = angleRad / Segments;
        for(int i=1;i< vertices_count; i++)
        {
            float cosA = Mathf.Cos(angleCur);
            float sinA = Mathf.Sin(angleCur);

            vertices[i] = new Vector3(Radius * cosA, 0, Radius * sinA);
            angleCur -= angledelta;
        }

        //triangles
        int triangle_count = segments * 3;
        int[] triangles = new int[triangle_count];
        for(int i=0,vi=1;i<= triangle_count-1;i+=3,vi++)     //因为该案例分割了60个三角形,故最后一个索引顺序应该是:0 60 1;所以需要单独处理
        {
            triangles[i] = 0;
            triangles[i + 1] = vi;
            triangles[i + 2] = vi + 1;
        }
        triangles[triangle_count - 3] = 0;
        triangles[triangle_count - 2] = vertices_count - 1;
        triangles[triangle_count - 1] = 1;                  //为了完成闭环,将最后一个三角形单独拎出来

        //uv:
        Vector2[] uvs = new Vector2[vertices_count];
        for (int i = 0; i < vertices_count; i++)
        {
            uvs[i] = new Vector2(vertices[i].x / radius / 2 + 0.5f, vertices[i].z / radius / 2 + 0.5f);
        }

        //负载属性与mesh
        Mesh mesh = new Mesh();
        mesh.vertices = vertices;
        mesh.triangles = triangles;
        mesh.uv = uvs;
        return mesh;
    }
}

3、效果图:



碰到的小知识:



【欢迎转载】

转载请表明出处: 乐学习

时间: 2024-10-11 13:49:30

Unity3D之Mesh(五)绘制圆的相关文章

Unity3D之Mesh(七)绘制长方体

前言: 从现在开始,终于感觉进入一点点正题了!动态创建三维立体模型mesh!依然从简单入手:长方体. 一.基本思路 由于是创建长方体mesh,由之前的研究得知,两个数据必须要有,即:顶点的数据:vertices与索引的三角形(即负责管理每个三角形的三点的索引顺序):triangles.长方体:一般会得知:长宽高:即今天我们由长宽高为参数得到vertices与triangles. 二.基本程序框架 创建一个empty的gameobject,挂在脚本. 由基本思路可得基本框架,之后,实现函数功能即可

Unity3D之Mesh(六)绘制扇形、扇面、环形

前言: 绘制了圆,就想到绘制与之相关的几何图形,以便更灵活的掌握Mesh动态创建模型的机制与方法. 一.分析: 首先,结合绘制圆的过程绘制环形: 圆形是由segments个等腰三角形组成的(上一篇中,将圆分为segments份,即segments个等腰三角形),圆环就是有segments个等腰梯形组成的. 那么等腰梯形由什么组成?两个三角形(多个也是可以的). 故:添加一个变量,内圆半径. 即:到此时此刻,我们需要根据:外半径.内半径.分割的数目(  当然如果是扇形或扇面,我们还需要一个角度an

C# Graphic 绘制圆、三角形、椭圆、图片

原文:C# Graphic 绘制圆.三角形.椭圆.图片 在form和panel上可以绘制图形,线段,圆,文字,图形等等. 绘制代码必须放在OnPaint()函数里面,因为窗体刷新的时候,都会调用该函数,重新刷新所绘的图. 示例代码在Panel上绘制图形来简单的描述下绘线和绘图原理. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System

HDU 3467 (求五个圆相交面积) Song of the Siren

还没开始写题解我就已经内牛满面了,从晚饭搞到现在,WA得我都快哭了呢 题意: 在DotA中,你现在1V5,但是你的英雄有一个半径为r的眩晕技能,已知敌方五个英雄的坐标,问能否将该技能投放到一个合适的位置,使得对面所有敌人都被眩晕,这样你就有机会能够逃脱. 分析: 对于敌方一个英雄来说,如果技能的投放位置距离他不超过r则满足要求,那么如果要眩晕所有的敌人,可行区域就是以五人为中心的半径为r的圆的相交区域. 现在问题就转化为求五个半径相同的圆的相交部分的面积,如果只有一个点则输出该点. 在求交之前,

Python 如何绘制圆

http://blog.csdn.net/pipisorry/article/details/40005163 1. 调用包函数绘制圆形Circle和椭圆Ellipse ################################### # !/usr/bin/env python # coding=utf-8 # __author__ = 'pipi' # ctime 2014.10.11 # 绘制椭圆和圆形 ################################### from

canvas绘制圆

canvas绘制圆: <!doctype html> <html> <head> <meta charset="utf-8"> <title>canvas绘制圆</title> <style> canvas{border:1px solid black;} </style> <script> window.onload=function(){ var ctx=document.g

canvas二:绘制圆和其他曲线

1.绘制圆 绘制圆是canvas里面不可缺少的功课,而且绘制圆在canvas中的用处很多,好嘞,开扯 绘制圆需要用到arc这个方法: arc(X坐标,Y坐标,半径,起始弧度,结束弧度,旋转方向): 弧度与角度的关系:弧度 = 角度*Math.PI/180: 旋转方向:true(逆时针),false(顺时针),默认为顺时针: 实例:我想画一个半圆,先里一下思路,首先我们需要一个区域,也就是绘制路径,即beginPath, 然后我们再需要定义一个开始的绘制点,即moveTo,之后在进行绘圆操作,那么

canvas绘制圆和弧(三)

利用context的方法,进行圆和弧的绘制 context.arc(x,y,radius,startingAngle,endingAngle,anticlockwise); x,y:表示圆心坐标 radius:圆的半径 startingAngle:绘制圆弧的起始位置(弧度制,比如0,0.5*Math.PI.....) endingAngle:绘制圆弧的终止位置 anticlockwise:false和true,true表示逆时针,false表示顺时针.不写默认false 和绘制直线一样,你可以把

Unity3D之Mesh(四)绘制多边形

前言: 依然如故,由於之前的基本介紹,所以有關的知識點不做贅述,只上案例,知識作爲自己做試驗的記錄,便於日後查看. 一些知识点的说明记录与补充: 1. 总的来说绘制平面的思想十分简单,就是将需要的平面拆分成几个三角形然后进行绘制就可以啦,主要的思路就在于三角形的拆分.如果说一个平面有7个顶点,我们把它们分别编号0到6,拆分情况如图所示: 即:如果用n来表示顶点的个数,那么在同一个平面内,可以分割的三角形个数是:n-2; 2. 在这里,我们选择应用Mesh Filter组件来进行绘制,Mesh F