尽管unity3D中直接有模块画圆柱体,但画圆面仍旧需要自己使用mesh来绘制。使用mesh画图一般分为四个步骤。

1.顶点

2.三角形

3.UV

4.负载属性与mesh

自己绘制一个简单的平面代码如下:

Mesh Createmeshp(float radius, float Height){//vertices:int p_vertices_count = 4;Vector3[] p_vertices = new Vector3[p_vertices_count];p_vertices[0] = new Vector3(-radius, -Height / 2, radius);p_vertices[1] = new Vector3(-radius, Height / 2, radius);p_vertices[2] = new Vector3(radius, -Height / 2, radius);p_vertices[3] = new Vector3(radius, Height / 2, radius);//trianglesint[] p_triangles = new int[6];p_triangles[0] = 0;p_triangles[1] = 1;p_triangles[2] = 2;p_triangles[3] = 3;p_triangles[4] = 2;p_triangles[5] = 1;//uv:Vector2[] p_uvs = new Vector2[4];float p_uvSetup = 1.0f ;p_uvs[0] = new Vector2(p_uvSetup * 0, 1);p_uvs[1] = new Vector2(p_uvSetup * 0, 0);p_uvs[2] = new Vector2(p_uvSetup * 1, 1);p_uvs[3] = new Vector2(p_uvSetup * 1, 0);//负载属性与meshMesh mesh = new Mesh();mesh.vertices = p_vertices;mesh.triangles = p_triangles;mesh.uv = p_uvs;return mesh;}

绘制结果如下图所示:

而圆柱面和平面最大的区别就是面是首尾相连的,所以在画三角形时应该分别考虑连续的部分和首尾相连的部分,比如考虑由四个平面组成的首尾相连的长方体侧面,他们可以按如下代码绘制:

 Mesh Createmesh(float radius, float Height){int s_vertices_count = 8;Vector3[] s_vertices = new Vector3[s_vertices_count];s_vertices[0] = new Vector3(-radius, -Height / 2, -radius);s_vertices[1] = new Vector3(-radius, Height / 2, -radius);s_vertices[2] = new Vector3(-radius, -Height / 2, radius);s_vertices[3] = new Vector3(-radius, Height / 2, radius);s_vertices[4] = new Vector3(radius, -Height / 2, radius);s_vertices[5] = new Vector3(radius, Height / 2, radius);s_vertices[6] = new Vector3(radius, -Height / 2, -radius);s_vertices[7] = new Vector3(radius, Height / 2, -radius);//trianglesint tri_num = 8;int tri_cout = tri_num * 3;int[] s_triangles = new int[tri_cout];for (int i = 0, vi = 0; i < tri_cout - 6; i += 6, vi += 2){s_triangles[i] = vi;s_triangles[i + 1] = vi + 1;s_triangles[i + 2] = vi + 2;s_triangles[i + 3] = vi + 3;s_triangles[i + 4] = vi + 2;s_triangles[i + 5] = vi + 1;}s_triangles[tri_cout - 6] = 6;s_triangles[tri_cout - 5] = 7;s_triangles[tri_cout - 4] = 0;s_triangles[tri_cout - 3] = 1;s_triangles[tri_cout - 2] = 0;s_triangles[tri_cout - 1] = 7;//uv:Vector2[] s_uvs = new Vector2[s_vertices_count];float s_uvSetup = 1.0f / 4;int iduv = 0;for (int i = 0; i < s_vertices_count; i = i + 2){s_uvs[i] = new Vector2(s_uvSetup * iduv, 1);s_uvs[i + 1] = new Vector2(s_uvSetup * iduv, 0);iduv++;}//负载属性与meshMesh mesh = new Mesh();mesh.vertices = s_vertices;mesh.triangles = s_triangles;mesh.uv = s_uvs;return mesh;}

结果显示如下:

由于圆柱面地面是个圆,还得需要按照一定的规律来计算圆周上的各点

 Mesh CreateMesh(float radius, int segments, float Height){//vertices:int vertices_count = Segments * 2;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 = 0; i < vertices_count; i++){float cosA = Mathf.Cos(angleCur);float sinA = Mathf.Sin(angleCur);vertices[i] = new Vector3(Radius * cosA, Height / 2, Radius * sinA);i++;vertices[i] = new Vector3(Radius * cosA, -Height / 2, Radius * sinA);angleCur -= angledelta;}//trianglesint triangle_count = segments * 3 * 2;int[] triangles = new int[triangle_count];int vert = 0;int idx = 0;for (int i = 0; i < segments - 1; i++)     //因为该案例分割了60个三角形,故最后一个索引顺序应该是:0 60 1;所以需要单独处理{triangles[idx++] = vert + 1;triangles[idx++] = vert;triangles[idx++] = vert + 3;triangles[idx++] = vert;triangles[idx++] = vert + 2;triangles[idx++] = vert + 3;vert += 2;}triangles[triangle_count - 6] = vertices_count - 1;triangles[triangle_count - 5] = vertices_count - 2;triangles[triangle_count - 4] = 1;triangles[triangle_count - 3] = vertices_count - 2;triangles[triangle_count - 2] = 0;triangles[triangle_count - 1] = 1;                           //为了完成闭环,将最后一个三角形单独拎出来//uv:Vector2[] uvs = new Vector2[vertices_count];float uvSetup = 1.0f / Segments;int iduv = 0;for (int i = 0; i < vertices_count; i = i + 2){uvs[i] = new Vector2(uvSetup * iduv, 1);uvs[i + 1] = new Vector2(uvSetup * iduv, 0);iduv++;}//负载属性与meshMesh mesh = new Mesh();mesh.vertices = vertices;mesh.triangles = triangles;mesh.uv = uvs;return mesh;}

结果如下:

侧面

俯视

附整体代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class NewBehaviourScript : MonoBehaviour
{public float Radius = 10f;    //半径  public int Segments = 600;   //分割数  public float Height = 2;           ///3.1415926f;private MeshFilter meshFilter;void Start(){//Debug.Log("hello unity: ");meshFilter = GetComponent<MeshFilter>();//圆柱,长方体,平面meshFilter.mesh = CreateMesh(Radius, Segments,Height);//meshFilter.mesh = Createmesh(Radius,  Height);//meshFilter.mesh = Createmeshp(Radius, Height);}Mesh CreateMesh(float radius, int segments, float Height){//vertices:int vertices_count = Segments * 2;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 = 0; i < vertices_count; i++){float cosA = Mathf.Cos(angleCur);float sinA = Mathf.Sin(angleCur);vertices[i] = new Vector3(Radius * cosA, Height / 2, Radius * sinA);i++;vertices[i] = new Vector3(Radius * cosA, -Height / 2, Radius * sinA);angleCur -= angledelta;}//trianglesint triangle_count = segments * 3 * 2;int[] triangles = new int[triangle_count];int vert = 0;int idx = 0;for (int i = 0; i < segments - 1; i++)     //因为该案例分割了60个三角形,故最后一个索引顺序应该是:0 60 1;所以需要单独处理{triangles[idx++] = vert + 1;triangles[idx++] = vert;triangles[idx++] = vert + 3;triangles[idx++] = vert;triangles[idx++] = vert + 2;triangles[idx++] = vert + 3;vert += 2;}triangles[triangle_count - 6] = vertices_count - 1;triangles[triangle_count - 5] = vertices_count - 2;triangles[triangle_count - 4] = 1;triangles[triangle_count - 3] = vertices_count - 2;triangles[triangle_count - 2] = 0;triangles[triangle_count - 1] = 1;                           //为了完成闭环,将最后一个三角形单独拎出来//uv:Vector2[] uvs = new Vector2[vertices_count];float uvSetup = 1.0f / Segments;int iduv = 0;for (int i = 0; i < vertices_count; i = i + 2){uvs[i] = new Vector2(uvSetup * iduv, 1);uvs[i + 1] = new Vector2(uvSetup * iduv, 0);iduv++;}//负载属性与meshMesh mesh = new Mesh();mesh.vertices = vertices;mesh.triangles = triangles;mesh.uv = uvs;return mesh;}Mesh Createmesh(float radius, float Height){int s_vertices_count = 8;Vector3[] s_vertices = new Vector3[s_vertices_count];s_vertices[0] = new Vector3(-radius, -Height / 2, -radius);s_vertices[1] = new Vector3(-radius, Height / 2, -radius);s_vertices[2] = new Vector3(-radius, -Height / 2, radius);s_vertices[3] = new Vector3(-radius, Height / 2, radius);s_vertices[4] = new Vector3(radius, -Height / 2, radius);s_vertices[5] = new Vector3(radius, Height / 2, radius);s_vertices[6] = new Vector3(radius, -Height / 2, -radius);s_vertices[7] = new Vector3(radius, Height / 2, -radius);//trianglesint tri_num = 8;int tri_cout = tri_num * 3;int[] s_triangles = new int[tri_cout];for (int i = 0, vi = 0; i < tri_cout - 6; i += 6, vi += 2){s_triangles[i] = vi;s_triangles[i + 1] = vi + 1;s_triangles[i + 2] = vi + 2;s_triangles[i + 3] = vi + 3;s_triangles[i + 4] = vi + 2;s_triangles[i + 5] = vi + 1;}s_triangles[tri_cout - 6] = 6;s_triangles[tri_cout - 5] = 7;s_triangles[tri_cout - 4] = 0;s_triangles[tri_cout - 3] = 1;s_triangles[tri_cout - 2] = 0;s_triangles[tri_cout - 1] = 7;//uv:Vector2[] s_uvs = new Vector2[s_vertices_count];float s_uvSetup = 1.0f / 4;int iduv = 0;for (int i = 0; i < s_vertices_count; i = i + 2){s_uvs[i] = new Vector2(s_uvSetup * iduv, 1);s_uvs[i + 1] = new Vector2(s_uvSetup * iduv, 0);iduv++;}//负载属性与meshMesh mesh = new Mesh();mesh.vertices = s_vertices;mesh.triangles = s_triangles;mesh.uv = s_uvs;return mesh;}Mesh Createmeshp(float radius, float Height){int p_vertices_count = 4;Vector3[] p_vertices = new Vector3[p_vertices_count];p_vertices[0] = new Vector3(-radius, -Height / 2, radius);p_vertices[1] = new Vector3(-radius, Height / 2, radius);p_vertices[2] = new Vector3(radius, -Height / 2, radius);p_vertices[3] = new Vector3(radius, Height / 2, radius);//trianglesint[] p_triangles = new int[6];p_triangles[0] = 0;p_triangles[1] = 1;p_triangles[2] = 2;p_triangles[3] = 3;p_triangles[4] = 2;p_triangles[5] = 1;//uv:Vector2[] p_uvs = new Vector2[4];float p_uvSetup = 1.0f ;p_uvs[0] = new Vector2(p_uvSetup * 0, 1);p_uvs[1] = new Vector2(p_uvSetup * 0, 0);p_uvs[2] = new Vector2(p_uvSetup * 1, 1);p_uvs[3] = new Vector2(p_uvSetup * 1, 0);//负载属性与meshMesh mesh = new Mesh();mesh.vertices = p_vertices;mesh.triangles = p_triangles;mesh.uv = p_uvs;return mesh;}// Update is called once per framevoid Update(){}
}

unity3D中使用mesh画圆柱面相关推荐

  1. Unity3D中使用mesh collider和box collider的区别

    Unity3D中使用mesh collider和box collider的区别 踩坑过程记录. 设备是HTC的VIVE 和 Unity 5.x CPU: Intel Xeon Silver 4116 ...

  2. unity 画球面_unity中实现Mesh画球体、半球体、四分之一球体以及任意弧面

    感谢两篇文章: mesh绘制模型:https://blog.csdn.net/qq_29579137/article/details/77369734?depth_1-utm_source=distr ...

  3. sketchup画圆柱面

    1.画好一个圆面 2.使用选择工具选中圆面的边,右键拆分,输入14(14等分为例子) 3.推拉 4.使用橡皮擦将图调整至此形状 5.选中下方圆形底 右键查找中心,会多出如图中的中心点 6橡皮擦到只剩一 ...

  4. matlab中做出球面和圆柱面,如何用MATLAB在直角坐标系下绘制球面x^2+y^2+z^2=4被柱面(x-1)^2+y^2=1截得的部分曲面.急!谢谢...

    答:clear;clc; r=1;%r的值自己改 %柱面部分 t=linspace(0,2*pi,37); q=linspace(-1,1,11); [tt,qq]=meshgrid(t,q); x= ...

  5. 【坑】html5中使用canvas画圆,弧度和角度傻傻分不清楚

    问题导入 <body> <canvas id="myCanvas" width="400" height="400" st ...

  6. 如何通过Matplotlib画圆

    前言 前两天因为需要,尝试着用Matplotlib 中的pyplot画圆我画圆的方法是通过圆的方程来画的,另外在图中做了必要的说明.半径为1,圆心为(2,2),方程分为两个,话不多说,直接看代码 画圆 ...

  7. 在Unity3D中利用描点法画圆

    直接法: 调用函数即可 //N为描点的个数,CirclePoint圆心距离,radius半径, mycolor为颜色 void MyDrawCircles(int N, Vector3 CircleP ...

  8. 问题四十一:怎么用ray tracing画任意圆柱面(generalized cylinder)

    我们之前在"35.2"章节中画过椭圆柱面: 我们还在"36.4"章节中画过圆柱面的Inverse Mapping图: 但是,这些柱面都是:底面与ZOX平面平行, ...

  9. WebGIS中基于AGS的画圆查询简析以及通过Polygon来构造圆的算法

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 某个项目需求中需要在前端进行画圆查询,将圆范围上的多边形要素 ...

最新文章

  1. $‘\r‘: command not found解决方法
  2. C# 制作Com组件:java调用.net DLL的方法
  3. 解决 ubuntu出现的 cd Do-bash: cannot create temp file for here-document: Permission denied问题
  4. 端午安康 | 6月14日 星期一 | B站首个破亿视频诞生;荣耀50系列预约人数超百万;贝索斯太空船票拍出2800万美元...
  5. 数据结构基础(15) --基数排序
  6. 线上分享|云和恩墨大讲堂201902:MySQL基础之体系结构
  7. matlab2c使用c++实现matlab函数系列教程-polyder函数
  8. Linux入门自学笔记
  9. Spring之自动装配注入
  10. Android模拟器SDL_app:emulator.exe 解决方法
  11. 多线程之同步Synchronized
  12. 美国军方称密切关注量子加密,法国国防部重金投资量子技术
  13. VS2003 搜索直接导致卡死问题
  14. 卡西欧计算机能开根号吗,考研计算器怎么开根号
  15. 实战智能推荐系统(12)-- 标签推荐系统
  16. ubantu14.04搜狗拼音安装
  17. 支持联发科cpu的linux系统,联发科发表 10 核心的新 Helio X20 处理器
  18. 【CVPR 2021】Cylinder3D:用于LiDAR点云分割的圆柱体非对称3D卷积网络
  19. MASM汇编入门:寄存器数据的使用
  20. Mac系统下Cypress使用初体验

热门文章

  1. 【mybatis】mybatis中使用小于号
  2. 记账本简单应用-原生vue的实现对比
  3. Windows中快速在指定文件打开命令行
  4. sql中coalesce()函数的使用
  5. 阿里云linux服务器安装桌面
  6. 2013.03.20清晨北京的雪
  7. 什么是W3C,相关标准是什么?
  8. 今天,大佬云集的夜幕团队正式成立了!
  9. (转)Neithernbsp;usernbsp;10027…
  10. 物联网专业的优势、发展趋势与障碍的介绍