unity实现3D饼图

有一段时间没有玩过unity了,还是忙里偷闲捡起来折腾一下。最近升级到了4.6,新的版本加入了unity自带的unity系统,看起来清爽多了。在没有UGUI的日子里,有NGUI用用自然也是不错的,但好与坏都是相对的吧,相信unity官方做出来来的新的UI系统可以更加出色,方便易用。

对于新的UI系统,网上好多大牛都相继出了系列教程了,我暂时还没有太多精力来琢磨透。希望之后能够深入的研究一些东西,而不是浮于表面。总而言之,自己离大牛还有好几个身位,革命尚未成功,同志任需努力。

之前呢,就有用unity开发各种稀奇古怪小工具的想法,比如说制作3D图表之类的玩意,看起来就酷酷的哈。虽然说自我感觉执行力不差,但是有时候还是有点懒惰,无奈的研究生生活~~~昨天看到一哥们发了一篇制作3D图表的博客,利用LineRenderer绘制折线图,感觉还不错。于是就坚定了我写这篇博客的动力。

/*************************************分割线*************************************/

好吧,下面开始说正事。

先上图

首先呢,饼图其实就是将一个圆柱体按照比例分成若干个部分。每个部分都是一个扇形区域。

然后呢,我就把整个圆柱大致分成了100个如下图所示的三角形区域(实际上是立体的,这里姑且称这些三角形区域为一个基元)。

为什么说是大致100个部分呢,因为我们可能遇到某个扇页的占比有小数的情况,那么这种情况下,我会把有小数的区域分割成两块,各自计算占比,然后依据占比缩放。

之后,我们依据统计的数据,计算出这些数据之和,以及各扇页的占比,求得需要的的基元数目,以及各个基元的旋转角度,并对同一扇页内的基元加上相同的颜色。

最后,在各个扇页上方显示出占比。

基元:

若干扇区:

前面呢,说了实现的大致流程。整体实现起来是比较简单的,但是也遇到一些小问题。

1.unity自带的3D gameobject中是没有类似于基元的三明治形状的模型的。但我又不想去从外面倒入一个模型进来,于是干脆用代码生成一个好了。使用的方法比较笨,要自己设置网格的顶点和三角形。关键代码如下。

    /// <summary>
    /// 初始化网格
    /// </summary>
    void initMesh()
    {
        float y = Mathf.PI * Config.R / Config.NUM;
        float x = Mathf.Sqrt(Config.R * Config.R - y * y);
        Vector3 origin1 = new Vector3(0, 0, 0);
        Vector3 origin2 = new Vector3(x, 0, y);
        Vector3 origin3 = new Vector3(x, 0, -y);
        Vector3 offset = new Vector3(0, Config.HEIGHT, 0);

        mesh = new Mesh();
        mesh.vertices = new Vector3[6] { origin1 + offset, origin2 + offset, origin3 + offset,
                                        origin1 - offset, origin2 - offset, origin3 - offset };

        mesh.triangles = new int[24] { 0,1,2,3,5,4,
                                0,3,2,2,3,5,
                                0,1,3,4,3,1,
                                2,1,4,2,4,5};

        meshFilter = gameObject.AddComponent<MeshFilter>();
        meshFilter.mesh = mesh;

        meshRenderer = gameObject.AddComponent<MeshRenderer>();
        meshRenderer.material.shader = Shader.Find("Diffuse");
    }

2.因为我们这里每个基元都是1%,但有的扇页占据的比例可能会出现20.5%这样的数据,这样就需要做特殊处理。

    /// <summary>
    /// 创建一组fanbase
    /// 起始部分和结束部分特殊处理
    /// 因为可能不是整数,所以会有缩放
    /// </summary>
    private void initFanBaseList()
    {
        float beginCeil = Mathf.Ceil(begin);
        float endFloor = Mathf.Floor(end);

        createFanBase((beginCeil + begin) / 2-0.5f, beginCeil - begin);

        for (int i = (int)Mathf.Ceil(begin); i < (int)Mathf.Floor(end); i++)
        {
            createFanBase(i, 1f);
        }

        createFanBase((end + endFloor) / 2 - 0.5f, end - endFloor);
    }

3.最后一个小问题是,立体的文字显示,新版本的unity中,我已经找不到3D text了。

于是像下面这样,自己另外创建一个gameobject,加上TextMesh和MeshRenderer组件就可以显示立体的文字了。

总之,实现起来还是比较简单的。源代码保存在云盘中了,需要的朋友可以看看。(可能对旧版本有兼容问题)

http://pan.baidu.com/s/16g4nc

时间: 2024-10-15 23:10:35

unity实现3D饼图的相关文章

R绘制3D饼图

二维饼图 代码如下: #绘制2维饼图 x=read.delim("C:/Users/a/Desktop/sample.txt",header=FALSE) #读入文本数据 names(x)=c("word","count") #加表头 x=transform(x, pct=round(x$count/sum(x$count)*100)) #数据框增加百分比列 y=x[order(x[,2],decreasing=T),]#排序 z=head(y,

AnyChart如何快速创建3D饼图和圈图(含代码)

AnyChart如何快速创建3D饼图和圈图 在新发布的7.6.0版本中,AnyChart已经支持3D的饼图和圈图了,这篇文章主要介绍如何使用JavaScript创建3D的饼图和圈图,AnyChart提供了AnyChart.pie3d()函数用于创建饼图,具体可以查看下面的代码: Anychart试用版本下载地址:http://www.componentcn.com/kongjianchanpin/tubiao/jibentubiaokongjian/2014-09-15/161.html 详细代

Highcharts 3D柱形图;Highcharts 堆叠3D柱形图;Highcharts 3D饼图;Highcharts 3D圆环图

Highcharts 3D柱形图 配置 chart.options3d 配置 以下列出了 3D 图的基本配置,设置 chart 的 type 属性为 column,options3d 选项可设置三维效果. var chart = { type: 'column', options3d: { enabled: true, //显示图表是否设置为3D, 我们将其设置为 true alpha: 15, //图表视图旋转角度 beta: 15, //图表视图旋转角度 depth: 50, //图表的合计

[Unity官方文档翻译]Primitive and Placeholder Objects Unity原生3D物体教程

Primitive and Placeholder Objects 原始的基础物体 Unity can work with 3D models of any shape that can be created with modelling software. However, there are also a number of primitive object types that can be created directly within Unity, namely the Cube, S

Unity导入3D模型的过程与方法

一.介绍 资源是游戏开发中的原材料,也就是组成游戏的模块. Unity只是一个游戏开发引擎,而并不是一个资源开发软件.这就意味着在游戏中需要的资源通常是由一些设计者使用其他软件开发出来的,然后设计者会将这些制作好的资源导出,并传递给Unity,而Unity负责将这些资源有机地组合到一个游戏系统中. 本文介绍的是如何将3ds Max文件导入进Unity的方法,其他3D模型或文件的导入与此类似. 软件环境:3ds Max2015,Unity 2017.3.0f3 (64-bit) 二.导入步骤 1,

读取数据库数据,并将数据整合成3D饼图在jsp中显示

首先我将生成饼图的方法独立写成一个PieChar.java类,详细代码如下:(数据库需要自己建,如有需要的话) 1 import java.io.IOException; 2 import java.sql.SQLException; 3 import org.jfree.chart.ChartFactory; 4 import org.jfree.chart.JFreeChart; 5 import org.jfree.data.general.DefaultPieDataset; 6 7 p

Unity工程3D和2D开发模式切换

在新建工程时,经常会选择默认的3D工程,但是如果想做2D游戏又不小心选了3D工程呢,总不能把工程删了重新建吧,有个办法就是打开 Edit > Project Settings > Editor > Mode 改成2D

unity普通的3D地图+人物行走demo

unity3D 五个面板: scene(场景视图) 整个游戏视图的概览 Game(游戏视图)是主摄像机照射 整体地图 所显示的区域 Hierarchy(层级视图) 存放scene视图 所用到的gameObjects Project(工程视图) 存放游戏图片材质的(可引入untiy自带的材质库) Inspector(监视视图) 主要用于设置对象属性的 位置 旋转 颜色,脚本,材质等组件 Hierarchy 层次视图下面的main Camera 为主摄像机 在Hierarchy 下面创建一个地形,T

3D相机在固定场景中的适配(Unity之3D相机适配)

有时候我们做固定平面的3D游戏的时候,有3D镜头适配的需求,最近正好遇到了,临时编了一个,拿出来和大家一起分享: using UnityEngine; using System.Collections; public class ScreenUnit : MonoBehaviour { private float height = 480; private float width = 854; private float rate1 = 480 / 854.0f; private float r