| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 游戏开发 -> UI雷达图材质实现思路 -> 正文阅读 |
|
[游戏开发]UI雷达图材质实现思路 |
首先多边形雷达图的效果,肯定还是用动态mesh的方法比较好,数值变化的饿时候改变顶点位置。但是如果想要一个完全用材质实现的效果的话也可以做到,但是性价比不高,但也可以尝试下。以下以一个六边形为例 首先既然值的变化要控制点的位置变化,那么肯定首先需要画出多边形的形状遮罩区域,这里的做法是将六边形拆成六个三角分别来画。那么首先一步的操作就是要画出三角,那么如何根据输入的顶点坐标来画出一个三角区域呢。这里就需要用到二维向量的叉乘,但是需要注意的一点是二维向量的叉乘也是有方向性的,可以看成Z轴为0的三维叉乘,所以向量叉乘的顺序就很重要。 所以比如输入A B俩点连接成的底边的三角形,向量AP和AB的叉乘的模就是P到AB的垂线长乘AB长的值,这样的结果就可以理解为像素到AB直线的距离。那么对三角形的每一条边都这么做再求min,中间的区域就可以通过判断值是否大于0来提取出来了。 但如之前所说,二维向量的叉乘是有方向性的,我们想要的是边到三角形内部值的变化是0-正值,但如果A B顶点位置一对换,叉乘顺序一反,那边到三角形内值的变化就变成负值了。所以还需要一步来将叉乘顺序不对时的结果反向,这里直接给结论,设六边形的中心坐标为(0.5,0.5) 那么如上图的三角形的上面的顶点是六边形中心的话。AP叉乘AB就反向了,此时需要用中心点到B的向量叉乘BA的sign值来相乘,数学就是这么神奇。。 (此时向量交点为A,中心点->另一端点B的向量叉乘另一点到A点的向量BA的sign值判断) 这样就可以获取到每一块小三角的区域遮罩了 对于三角内部形状的操作,可以直接使用叉乘的结果,也可以通过2D SDF计算获得,我的实现中用到了2D线段SDF来做形状 ? ? 一些过程中的形状结果,三角形在下方,没加遮罩。有点坑的是由于用了frac,那么要用smoothstep去除形状的边缘锯齿的话,还得1-frac相乘来柔化俩侧的边缘,这部分计算还省不掉。。 接下来一步是画线框,那么想的肯定是通过以三角中心缩小三角来得到线框区域,这里又有一个需要注意的点,直接用上面叉乘min的结果来step我们会发现三角形不是沿中心所放的,如果需要向中心点缩放,那么需要除掉底边的边长。 ?这时看又有问题,因为中心点作为顶点的边是俩三角形叠在一起的,所以如果要保证线框宽度一致,这些中心点作为顶点的边还要提出来单独处理。我这里中心点相关的边除的底边长要减半,可以保证描边宽度一致,但是缩放不是沿着三角中心的。视觉上也看不出啥问题其实。。 最后一步就是六边形整个外轮廓的锯齿怎么消的问题。我首先想到的是都有远离三角中心点的那条边的渐变过度了,那就直接用它来做,用那条边的SDF也行。但是这些做法有个问题,就是这种在凸多边形的时候是没问题的,但是变成凹多边形的时候就不行了。。 ? 需要取遮罩的绝对值来算,并且这个交叉部分的断线还消不掉。。 所以目前就是改成每一个三角单独提出来算再混合,效果是能做对但是也增加了许多计算量。 shader不美观就不贴了. 最终效果: ? ?have fun ? ? ? ? ? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/28 0:28:57- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |