看到这篇文章你可能好奇unity自带圆柱体组件,直接就可以生成,为什么我们还要用代码生成。其实是最近领导对项目有一个要求,就是我们要在自写编辑器内操作圆管,也就是圆柱体。功能类似3DMax里的拉伸管线。刚开始看到这个要求我内心是拒绝的,mmp我是unity程序员不是图像学程序员啊,这看着有点底层啊。但是心想,这也是自我学习提升的机会,于是我就给领导个面子将它实现吧。我们知道如果想像3Dmax里那样操作管线,就必须用代码创建圆柱体并用代码控制他的顶点位置才能实现我们的需求。所以第一步就是用代码创建我们需要的圆柱体。实现的效果如下:

其实之前我自己尝试了解创建立方体的代码,看着很简单,其实也不简单,主要是对顶点,以及对应组成三角面顶点顺序的设置。我在网上搜到一篇自写圆柱体的代码,看着不错,直接复制来了,但是他提供的少两个面。所以需要我们自己去补上这个面。然后很重要的一点是两个面的交点不可以共用,必须再添加一次,因为涉及到法线的问题

//圆柱体是由两个圆和一个长方形组成的  先输入长方形的顶点 然后在输入圆顶点private void UpdateMesh(Mesh mesh,int edg_x, int edg_y, float rad, float len){edg_x = Mathf.Max(2, edg_x);//保证最低2个边edg_y = Mathf.Max(2, edg_y);int _deglen = (edg_x +1)*edg_y;//长方体int totalcount = _deglen + (1 + edg_x + 1) * 2; //加两个圆Vector3[] normals = new Vector3[totalcount];Vector3[] verts = new Vector3[totalcount];Vector2[] uvs = new Vector2[totalcount];int[] trians = new int[edg_x * edg_y*6];    float reg = 6.28318f / edg_x;float _len = len / (edg_y - 1);for (int y = 0; y < edg_y; y++)for (int x = 0; x < edg_x + 1; x++)//多一个边来保存UV值{int i = x + y * (edg_x + 1);verts[i] = new Vector3(Mathf.Sin((reg * (x % edg_x)) % 6.28318f) * rad, Mathf.Cos((reg * (x % edg_x)) % 6.28318f) * rad, rightPos + y * _len);//计算顶点坐标normals[i] = new Vector3(verts[i].x, verts[i].y, 0);//计算法线方向int id = x % (edg_x + 1) * 6 + y * edg_x * 6;if (x < edg_x + 1 && y < edg_y - 1 && (id + 5) < trians.Length)//计算顶点数组{if(length>0){trians[id] = i;trians[id + 1] = trians[id + 4] = i + edg_x + 1;trians[id + 2] = trians[id + 3] = i + 1;trians[id + 5] = i + edg_x + 2;}else{trians[id] = i;trians[id + 1] = trians[id + 3] = i + 1;trians[id + 2]= trians[id + 5]=i + edg_x + 1;trians[id + 4] = i + edg_x + 2;}}//if (edg_x != 2)//计算UV,考虑到2个边的情况//    uvs[i] = new Vector2(x == edg_x ? 1f : quaduvStep.x * x, y == edg_y - 1 ? (2*rad+len)/totalLen : quaduvStep.y * y);//else//    uvs[i] = new Vector2(x % edg_x, y == edg_y - 1 ? (2 * rad + len) / totalLen : quaduvStep.y * y);}int maxId = edg_x * (edg_y - 1) * 6;verts[_deglen] = new Vector3(0,0,rightPos);normals[_deglen] = -Vector3.forward;//uvs[_deglen] = new Vector2(0.5f, (rad) / totalLen);//原点一面for (int x = 0; x < edg_x+1 ; x++){verts[_deglen + 1 + x] = new Vector3(Mathf.Sin((reg * (x % edg_x)) % 6.28318f) * rad, Mathf.Cos((reg * (x % edg_x)) % 6.28318f) * rad, rightPos);normals[_deglen + 1 + x] = -Vector3.forward;if (x == edg_x) continue;if(length>0){trians[3 * x + maxId] = _deglen;trians[3 * x + 1 + maxId] = _deglen + 1 + x;trians[3 * x + 2 + maxId] = _deglen + 2 + x;}else{trians[3 * x + maxId] = _deglen;trians[3 * x + 1 + maxId] = _deglen + 2 + x;trians[3 * x + 2 + maxId] = _deglen + 1 + x;}}//远点一面maxId += 3 * edg_x;verts[_deglen + 2 + edg_x] = new Vector3(0, 0, leftPos);normals[_deglen + 2 + edg_x] = Vector3.forward;//uvs[_deglen + 1] = new Vector2(0.5f, (3 * rad + len) / totalLen);for (int x = 0; x < edg_x+1; x++){verts[1 + x+edg_x+2+ _deglen] =new Vector3(Mathf.Sin((reg * (x % edg_x)) % 6.28318f) * rad, Mathf.Cos((reg * (x % edg_x)) % 6.28318f) * rad,leftPos);normals[1 + x + edg_x + 2 + _deglen] = Vector3.forward;if (x == edg_x) continue;if (length > 0){trians[3 * x + maxId] = _deglen + 2 + edg_x;trians[3 * x + 1 + maxId] = _deglen + 2 + edg_x + x + 2;trians[3 * x + 2 + maxId] = _deglen + 2 + edg_x + x + 1;}else{trians[3 * x + maxId] = _deglen + 2 + edg_x;trians[3 * x + 1 + maxId] = _deglen + 2 + edg_x + x + 1;trians[3 * x + 2 + maxId] = _deglen + 2 + edg_x + x + 2;}}mesh.Clear();mesh.vertices = verts;mesh.triangles = trians;//mesh.uv = uvs;mesh.normals = normals;mesh.RecalculateBounds();}

其实看代码会发现这个圆柱体的长度len是由我们自己声明的变量leftPos-rightPos获得的。即length=len=leftPos-rightPos。我们可以操作变量leftPos和rightPos来控制圆柱一端的位置以及其长度。当我们length<0的时候,他的三角面顶点绘制顺序正好相反,所以需要在代码块中判断下。以上就是对代码绘制圆柱体的实现。希望对你有帮助。

Unity3D开发之代码创建圆柱体相关推荐

  1. Unity3d代码创建空心圆柱体

    代码创建空心圆柱体 算法实现 public GameObject CreateHollowClinder(Vector3 ptStart, Vector3 ptEnd, float innerRadi ...

  2. IOS14.3开发之使用纯代码创建UIButton以及弹框的使用

    IOS14.3开发之使用纯代码创建UIButton以及弹框的使用 源码在这 // // ViewController.m // testDemo1 // // Created by 鲁军 on 202 ...

  3. ios14.3开发之使用纯代码创建UITabbarController

    ios14.3开发之使用纯代码创建UITabbarController 这里我们IOS版本14.3.Xcode 版本选择的是.12.3版本:来自apple最新的xcode版本,该版本支持最新的swif ...

  4. 一、创建Assetbundle 在unity3d开发的游戏中,无论模型,音频,还是图片等,我们都做成Prefab,然后打包成Assetbundle,方便我们后面的使用,来达到资源的更新。

    一.创建Assetbundle 在unity3d开发的游戏中,无论模型,音频,还是图片等,我们都做成Prefab,然后打包成Assetbundle,方便我们后面的使用,来达到资源的更新. 一个Asse ...

  5. 【Swift Mac开发】纯代码创建NSViewController

    对于习惯了纯代码iOS开发的人来说,刚接触Mac端开发时,是非常不友好的,网上所有的教程都是通过Xib或StoryBoard的方式创建NSViewController,而且苹果文档也是鼓励用Xib的开 ...

  6. 【Unity3D】Unity3D开发《我的世界》之六、创建地形(视频 + 源码)

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/unity_minecraft_06.html 一.引入LibNoise 虽然Unity3D里也有一个Mathf.P ...

  7. Unity3d开发跳一跳AI(ML-agents)全纪录

    本文首发于"洪流学堂"微信公众号. 洪流学堂,让你快人几步! 跳一跳介绍 最近微信上非常火的一个小游戏,相信大家都已经玩过了. 玩法 小人跳跃的距离和你按压屏幕的时长有关,按屏幕时 ...

  8. Unity3D编辑器扩展--自定义创建圆锥体

    前言 这几天琢磨着开发个个人作品的时候,发现原来Unity3D官方没有提供圆锥体的创建功能,就自己做了个编辑器扩展.鉴于之前搜索Mesh编程的时候很少有博客把自己的算法讲清楚,这里我抛砖引玉,尽我所能 ...

  9. 在学习计算机编程不写代码_使用代码创建:通过制作游戏来学习和教授计算机编程

    在学习计算机编程不写代码 Create with Code is Unity Education's new, free program for teaching and learning compu ...

最新文章

  1. 【基础篇】DatePickerDialog日期控件的基本使用(一)
  2. CVPR 2019审稿满分论文:中国博士提出融合CV与NLP的视觉语言导航新方法
  3. 微信聊天和朋友圈可以拍摄和分享大视频?
  4. 重要的事情说三遍!网站如何改版才能最大限度降低影响率?
  5. JavaWeb——内置对象session与httpSession对象是同一个东西么?
  6. solidity事件详解
  7. server 2008 mysql 报错 0xc000007b_这十个MySQL经典错误,99%的程序员一定遇到过!你呢?...
  8. SQL基本操作(三):存储过程和触发器
  9. SpringBoot基础教程2-1-6 日志规范-使用AOP统一处理Web日志
  10. 福州大学第十四届程序设计竞赛-重现赛(Record)
  11. 业务信息化与管理信息化
  12. 办公室常用计算机常识,这10个办公必备的电脑小技巧,让你事半功倍
  13. Maya-Mel-1:入门数据类型
  14. js:nodejs通过async异步提交事务数据
  15. 004.前端面试排雷之唱、跳、rap三步曲(一)唱篇
  16. 腾讯兔小巢是什么?零代码如何连接企业微信机器人
  17. 在云计算行业内有什么证书比较有名?受市场认可大?
  18. Rasa课程、Rasa培训、Rasa面试、Rasa实战系列之 Model Confidence v2
  19. Windows 2003 变慢原因分析及解决
  20. Redis面试题从基础到进阶

热门文章

  1. ORB_SLAM3编译错误整理
  2. 两个有序顺序表的合并
  3. 工程流体力学笔记暂记21 (几种简单的平面势流及其叠加)
  4. vb.net 菜单点击后不消失_【影评】消失的星期三: 七重人格的共存共荣
  5. SpringBoot项目,网站【代号Sham】已发布测试版本
  6. java生成、识别条形码和二维码
  7. NIPS(Conference and Workshop on Neural Information Processing Systems)
  8. CSS3中的径向渐变知识点整理
  9. nginx 日志处理goaccess、shell
  10. 《幸福的勇气》——“我”的价值由自己来决定,这叫“自立”