首页 > 其他分享 >记录一下绘制圆柱的过程

记录一下绘制圆柱的过程

时间:2023-01-07 16:44:50浏览次数:40  
标签:圆柱 ang 记录 vh float Mathf next new 绘制

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class CreatCylinder : MonoBehaviour
{
public int n = 6;
public float r = 5;
// Start is called before the first frame update
void Start()
{
//创建一个网格
Mesh mesh = new Mesh();
//顶点助手
VertexHelper vh = new VertexHelper();
//圆柱4个面组成
//这是圆柱上下圆的每个角弧度
float ang = 2 * Mathf.PI / n;
//第一个面(上面的圆盖)

//上圆的顶点
vh.AddVert(new Vector3(0, 1, 0), Color.blue, new Vector2(0.5f, 0.5f));
for (int i = 0; i < n; i++)
{
//通过正弦和余弦函数计算顶点的坐标
float x = Mathf.Sin(ang * i) * r;
float y = Mathf.Cos(ang * i) * r;
//计算uv坐标
float uvx = (x + r) / (r + r);
float uvy = (y + r) / (r + r);
//添加顶点
vh.AddVert(new Vector3(x, 1, y), Color.white, new Vector2(uvx, uvy));
//绘制上圆
if (i == 0)
{
vh.AddTriangle(0, n, 1);
}
else
{
vh.AddTriangle(0, i, i + 1);
}
}
//用过的顶点不再使用
int next = 1 + n; ;

//下面的圆
vh.AddVert(new Vector3(0, -1, 0), Color.blue, new Vector2(0.5f, 0.5f));
for (int i = 0; i < n; i++)
{
//通过正弦和余弦函数计算顶点的坐标
float x = Mathf.Sin(ang * i) * r;
float y = Mathf.Cos(ang * i) * r;
//计算uv坐标
float uvx = (x + r) / (r + r);
float uvy = (y + r) / (r + r);
//添加顶点
vh.AddVert(new Vector3(x, -1, y), Color.white, new Vector2(uvx, uvy));
//绘制下圆
if (i == 0)
{
vh.AddTriangle(0+next, 1 + next, n + next);
}
else
{
vh.AddTriangle(0 + next, i + 1 + next, i + next);
}
}
//用过的顶点再使用
next = (1 + n) * 2;
//圆柱侧面
for (int i = 0; i < n+1; i++)
{
//计算顶点坐标
float x = Mathf.Sin(ang * i) * r;
float y = Mathf.Cos(ang * i) * r;
//计算uv坐标(这个n除以几就是要把侧面贴图分几份)
float uvx = (float)i / ((float)n / 2);
//计算最后一个的坐标
if(i==n)
{
x = Mathf.Sin(ang * 0) * r;
y = Mathf.Cos(ang * 0) * r;
}
//添加顶点
vh.AddVert(new Vector3(x, 1, y), Color.white, new Vector2(uvx, 0));
vh.AddVert(new Vector3(x, -1, y), Color.white, new Vector2(uvx, 1));

}
//绘制图形
//+next是为了绘制时跳过使用过的顶点
for (int i = 0; i < n; i++)
{
vh.AddTriangle(i * 2 + next, i * 2 + 1 + next, (i + 1) * 2 + 1 + next);
vh.AddTriangle(i * 2 + next, (i + 1) * 2 + 1 + next, (i + 1) * 2 + next);
}
//顶点助手数据放到网格上
vh.FillMesh(mesh);
//自动计算法线(也可以说是添加棱角)
mesh.RecalculateNormals();
//mesh网格赋值给网格过滤器
GetComponent<MeshFilter>().mesh = mesh;
}

// Update is called once per frame
void Update()
{

}
}

标签:圆柱,ang,记录,vh,float,Mathf,next,new,绘制
From: https://www.cnblogs.com/zanzz/p/17032946.html

相关文章

  • 宝塔 Nginx 实现日志记录 Cloudflare 下访客真实IP
    网站套Cloudflare后,Nginx日志记录的都CloudflareIP,要记录访客真实IP,可以按下面方法:1.自动化脚本生成如下配置文件因为Cloudflare的IP段会定期更新,所以建个任务计......
  • 2023/1/4 记录最近的单片机调试
    1同一单元的UART时钟最好用不同的时钟(指UART1与UART0,UART2由于是1单元因此目前看来不产生影响)。2GPS发送消息过多如果接收长度没有填好会导致填满内存最终死机。3......
  • C#中线程和定时器的使用记录
    记录学习代码。使用线程,创建一个消息队列阻塞等待消息。使用定时器,每隔一秒钟发送一条消息。监听键盘Esc按键实现程序退出。代码如下:1usingSystem;2usingSy......
  • [RMQ记录] P2048 [NOI2010] 超级钢琴
    题目如果枚举所有的情况肯定是不行的。不过可以发现一些对答案完全没有影响的答案也被枚举,十分浪费时间,所以下面介绍一种很好的思路。首先,考虑优化暴力(暴力指用堆维护每......
  • 《随机算法在信息学竞赛中的应用》做题记录
    目录《随机算法在信息学竞赛中的应用》做题记录MSTONESProblemSolutionP3567[POI2014]KUR-CouriersProblemSolutionCF364DGhdProblemSolutionTKCONVEXProblemSolutionP12......
  • 今日阅读思考记录
    李廌《师友谈记》东坡爷爷苏序的记载《师友谈记》,宋李廌著。一卷。此书记苏轼、范祖禹、黄庭坚、秦观、晁说之、张耒等所谈,故名书《师友谈记》。书中所载,多名言格论,非......
  • UI的绘制
    usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.UI;publicclassImage2:Graphic{publicoverrideTexturemai......
  • cube的绘制以及图片的完整显示
    usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassCreatUVCube:MonoBehaviour{publicMeshFiltermf;publicMeshR......
  • 服务器安装IB驱动记录
    内核5.xxxx升级一晚上失败  先检查下有没有网卡lspci-v|grepMellanox 找不到问题所在,先进入解压的目录下使用.supported_kernels查看支持的内核......
  • OPPO暑期实习记录
    1、浏览器业务接入Goblin自动化测试框架1)传统单元测试痛点>单元测试数据依赖复杂且无法实现数据隔离>mock框架学习成本高,代码冗余>基于内存实现成本高,且易出现生产环境......