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

前言:

绘制了圆,就想到绘制与之相关的几何图形,以便更灵活的掌握Mesh动态创建模型的机制与方法。



一、分析:

首先,结合绘制圆的过程绘制环形:

圆形是由segments个等腰三角形组成的(上一篇中,将圆分为segments份,即segments个等腰三角形),圆环就是有segments个等腰梯形组成的。

那么等腰梯形由什么组成?两个三角形(多个也是可以的)。

故:添加一个变量,内圆半径。  即:到此时此刻,我们需要根据:外半径、内半径、分割的数目(  当然如果是扇形或扇面,我们还需要一个角度angle)来确定顶点vertices Vector3数组,以及triangles 三角形索引数组。



二、绘制圆环

代码如下:

using UnityEngine;

[RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))]
public class yuan : MonoBehaviour
{
    public float Radius = 6;          //外半径
    public float innerRadius = 3;     //内半径
    public float angleDegree = 360;   //扇形或扇面的角度
    public int Segments = 60;         //分割数  

    private MeshFilter meshFilter;

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

    Mesh CreateMesh(float radius, float innerradius,float angledegree,int segments)
    {
        //vertices(顶点):
        int vertices_count = segments* 2+2;              //因为vertices(顶点)的个数与triangles(索引三角形顶点数)必须匹配
        Vector3[] vertices = new Vector3[vertices_count];
        float angleRad = Mathf.Deg2Rad * angledegree;
        float angleCur = angleRad;
        float angledelta = angleRad / segments;
        for(int i=0;i< vertices_count; i+=2)
        {
            float cosA = Mathf.Cos(angleCur);
            float sinA = Mathf.Sin(angleCur);

            vertices[i] = new Vector3(radius * cosA, 0, radius * sinA);
            vertices[i + 1] = new Vector3(innerradius * cosA, 0, innerradius * sinA);
            angleCur -= angledelta;
        }

        //triangles:
        int triangle_count = segments * 6;
        int[] triangles = new int[triangle_count];
        for(int i=0,vi=0;i<triangle_count;i+=6,vi+=2)
        {
            triangles[i] = vi;
            triangles[i + 1] = vi+3;
            triangles[i + 2] = vi + 1;
            triangles[i + 3] =vi+2;
            triangles[i + 4] =vi+3;
            triangles[i + 5] =vi;
        }

        //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;
    }
}

效果图:



三、绘制扇面

其实绘制扇形面:只需要改变脚本中的参数,扇形覆盖的角度,即:

angleDegree效果如下:



四、绘制扇形

同理,只需要将内半径改为0,更改扇形覆盖的角度

 innerRadius=0;
 angleDegree即可!效果图如下:



总结:

静下心,慢慢分析,很简单,不过是初中几何而已。



【欢迎转载】

转载请表明出处: 乐学习


				
时间: 2024-11-03 21:59:40

Unity3D之Mesh(六)绘制扇形、扇面、环形的相关文章

Sliverlight实例之 绘制扇形和环形图

原文:Sliverlight实例之 绘制扇形和环形图 未解决: 1,任意偏角,是个重点问题: (1),  另一边在弧上坐标 (2),  这个弧的弧度(ArcSegment中的Size或Angle属性) (3),  如何把这个弧度做成依赖属性配置的 2,做成一个自定义控件 有时间,再完成 准备知识: 1,  平面几何思维(三角形,圆,弧,曲线,斜率,方程式) 2,  三次贝塞尔曲线的数学公式 3,  定时器与动画的区别是时间序列 4,  缓动动画   一,1道几何题 已知两点坐标确定一条直线,直线

Unity3D之Mesh(七)绘制长方体

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

Unity3D之Mesh(五)绘制圆

前言: Unity3D中Mesh的基本单位是三角形,而圆形就是由许许多多的三角形组成的.那么我们就知道了绘制圆形的Mesh需要两个变量:圆的半径  以及分割数: 一.实现过程 基本过程与之前的类似,最基本的依然是顶点以及三角形索引数组,即:我们需要根据圆的半径以及预备的分割数,通过算法得到:顶点的Vector3数组 以及对应的三角形索引数组: 1.基本的程序实现架构如下: using UnityEngine; [RequireComponent(typeof(MeshRenderer), typ

绘制扇形效果线条小Bug解决

绘制线条基本代码: 变量: CPoint m_ptOrigin;//起点坐标 bool m_bTrue;//检查鼠标左键是否按下 CPoint m_ptOldOrigin;//记录上一次绘制终点坐标,用于绘制边界线 初始化: m_ptOrigin = 0; m_bTrue = false; m_ptOldOrigin = 0; 代码实现: void CDrawView::OnLButtonDown(UINT nFlags, CPoint point){ // TODO: Add your mes

ios开发日记10 - 使用CAShapLayer绘制扇形

IOS-使用CAShapLayer绘制扇形 为了增加应用体验感,我们动态绘制扇形或者饼状图效果. 这里我们使用CAShapeLayer,这样就不必再-(void)draw函数内绘制图形 参考代码 -(void)reDraw { CAShapeLayer *chartLine; if (chartLine!=nil) { [chartLine removeAllAnimations];//这样就能重复绘制饼状图了 } else {  chartLine = [CAShapeLayerlayer];

[ActionScript 3.0] 动态绘制扇形实例(拖拽绘制)

1 package 2 { 3 import flash.display.Shape; 4 import flash.display.Sprite; 5 import flash.events.MouseEvent; 6 7 /** 8 * @author Frost.Yen 9 * @E-mail [email protected] 10 * @create 2015-7-13 上午11:14:16 11 * 12 */ 13 [SWF(width="800",height=&quo

[ActionScript 3.0] 绘制扇形方法

1 /** 2 * 绘制扇形 3 * @param mc 承载扇形的对象 4 * @param x 圆心角x 5 * @param y 圆心角y 6 * @param r 半径 7 * @param angle 绘制角度 8 * @param startFrom 起始角度 9 * @param color 填充颜色 10 * @param hasFrame 是否填充边框 11 */ 12 private function drawSector(sp:Sprite,x:Number=0,y:Num

「AI教程」轻松绘制扇形渐变

扇形渐变,在PS用角度渐变很好绘制,AI里没有角度渐变,那怎么样轻松的绘制扇形渐变呢? 此教程简单粗暴,但非常有效,一起来看看吧! https://www.macdown.com 1.绘制矩形,调好自己需要的渐变效果(线性渐变). 2.然后 对象-扩展 3.看图进行设置. 4.选择 自由变换工具-透视扭曲(这是cc版本,cs6可以 选择 自由变换工具-然后按按住Alt键同时用鼠标拖动矩形的一个顶点-然后依次按 Shift.Ctrl键(Mac时cmmand键)-拖动鼠标往里收-变成梯形,效果同cc

Unity3D之Mesh(四)绘制多边形

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