Unity Gizmos扩展:画一个线框圆

定义

圆由圆心位置与半径决定的

在Unity中画圆,由于需要跟随对象转动而转动,除了圆心位置和半径,还需要提供两个方向向量

  • 有两条线,才有了决定一个面的基础

  • 为了方便,这两个方向需要相互垂直(也可以不垂直,但是懒啊),形成一个平面坐标轴

算法步骤
  1. 如图所示,以forward(蓝色箭头)和right(红色箭头)这两个方向决定的圆为例

  1. 计算下一个点的坐标,如图,根据forward方向和半径,可以算出A点的坐标
    PosA=Poscenter+forward∗radiusPos_{A}=Pos_{center}+forward*radius PosA​=Poscenter​+forward∗radius
  2. 根据每次转动角度delta,计算出B点相对于圆心的偏移量
    Offsetright=radius∗sin⁡(delta)∗rightOffsetforward=radius∗cos⁡(delta)∗forward\begin{aligned}Offset_{right}=radius*\sin(delta)*right \\ Offset_{forward}=radius*\cos(delta)*forward\end{aligned} Offsetright​=radius∗sin(delta)∗rightOffsetforward​=radius∗cos(delta)∗forward​
  3. 最后以将偏移值与圆心坐标相加,即可得到B的坐标
    PosB=Poscenter+Offsetforward+OffsetrightPos_{B}=Pos_{center}+Offset_{forward}+Offset_{right} PosB​=Poscenter​+Offsetforward​+Offsetright​
  4. 其他的点的坐标依次类推,直到转满360度。
代码

代码就是根据上述算法步骤来的,需要注意的是

根据stepAngle的大小进行每一次的转动的,如果后续累加的angle > 360,如果还是用通用公式计算,会导致这个圆不能闭合,因此在angle > 360时,最后一个点的值应该为第一个点startPos的值

/// <summary>/// 画一个三维可转动圆形框架,平面取决于forward与right共同所在面/// </summary>/// <param name="center">圆心</param>/// <param name="forward">扇形圆弧凸的方向</param>/// <param name="right">垂直于forward</param>/// <param name="radius">半径</param>/// <param name="divide">分多少块</param>public static void DrawWireCircle(Vector3 center, Vector3 forward, Vector3 right, float radius, int divide = 16){radius = Mathf.Abs(radius);forward = forward.normalized;right = right.normalized;divide = Mathf.Abs(divide);if (radius == 0 || divide < 3 || Vector3.Dot(forward, right) > 0.0001f) return;if(divide > 32) divide = 32;List<Vector3> vertices = new List<Vector3>();Vector3 startPos = center + forward * radius;vertices.Add(startPos);float stepAngle = 360.0f / divide;float angle = 0f;while (angle < 360){angle += stepAngle;if (angle <= 360){float x = radius * Mathf.Cos(Mathf.Deg2Rad * angle);float y = radius * Mathf.Sin(Mathf.Deg2Rad * angle);Vector3 vertex = center + right * y + forward * x;vertices.Add(vertex);}else{vertices.Add(startPos);}}for (int i = 1; i < vertices.Count; i++){Gizmos.DrawLine(vertices[i - 1], vertices[i]);}}

最后画出来的圆就可任意转动了

Unity Gizmos扩展:线框圆相关推荐

  1. Unity Gizmos扩展:线框胶囊体

    Unity Gizmos扩展:线框胶囊体 定义(拆解): 如下图,线框胶囊体可以看作由两个平面胶囊体和两个圆组成. 因此画平面胶囊体需要参数: 胶囊体中心位置PosCenterPos_{Center} ...

  2. Unity Gizmos扩展:线框平面胶囊体

    Unity Gizmos扩展:线框平面胶囊体 定义(拆解): 如下图,平面胶囊体可以看作由两个半圆和连接半圆对应端点的两条线段组成. 因此画平面胶囊体需要参数: 胶囊体中心位置PosCenterPos ...

  3. 【Unity】Unity Gizmos扩展(圆弧、扇形、圆形)

    [Unity]Unity Gizmos扩展(圆弧.扇形.圆形) 使用 UnityEditor.Handles 为Unity Gizmos 实现的扩展: GizmosX.DrawWireArc() :画 ...

  4. 【Unity编辑器扩展】(二)PSD转UGUI Prefab, 图层解析和碎图导出

    书接上回:[Unity编辑器扩展](一)PSD转UGUI Prefab, Aspose.PSD和Harmony库的使用_TopGames的博客-CSDN博客 工具使用预览: 工具目标: 1. 实现将p ...

  5. 【Unity编辑器扩展】(三)PSD转UGUI Prefab, 一键拼UI解放美术/程序(完结)

    工具效果: 第一步,把psd图层转换为可编辑的节点树,并自动解析UI类型.自动绑定UI子元素: 第二步, 点击"生成UIForm"按钮生成UI预制体 (若有UI类型遗漏可在下拉菜单 ...

  6. unity编辑器扩展#3 《Extending Unity with Editor Scripting 》笔记

    #1 编辑器创建新场景 EditorApplication.SaveCurrentSceneIfUserWantsTo(); //打开是否保存场景的对话框 EditorApplication.NewS ...

  7. Unity编辑器扩展之EditorWindow

    Unity编辑器扩展之EditorWindow 继承这个类的编辑器脚本可以用来创建一个编辑器窗口,类似Inspector窗口 若要在这个类中添加一些控件,可以使用GUI和GUILayout控件,还可以 ...

  8. Unity 编辑器扩展菜单

    Unity 编辑器扩展菜单 目录 Unity 编辑器扩展菜单 一.MenuItem 特性 菜单栏扩展 1.创建多级菜单 2.创建可使用快捷键的菜单项 3.创建可被勾选的菜单项 4.检查菜单是否使用 5 ...

  9. Unity编辑器扩展: 程序化打图集工具

    开始前的声明:该案例中图集所使用图片资源均来源于网络,仅限于学习使用 一.前言 关于编辑器扩展相关的知识,在前面的两篇内容中做了详细的描述,链接地址: 第一篇 :Unity编辑器扩展 UI控件篇 第二 ...

最新文章

  1. 生成对抗网络(GAN)应用于图像分类
  2. 中国年度AI省市格局:北广上稳居前三,江苏四川力压浙江,山西转型“挖数据”增速迅猛...
  3. Java相关面试题总结+答案(一)
  4. Android ViewGroup点击效果(背景色)
  5. 打造工业级推荐系统(三):推荐系统的工程实现与架构优化
  6. git安装 perl ubuntu_Ubuntu系统上安装Git
  7. 深入学习卷积神经网络中卷积层和池化层的意义(转)
  8. decode 大于比较 小于_「oracle decode」【ORACLE】Oracle提高篇之DECODE - seo实验室
  9. 海康摄像机取流RTSP地址规则说明
  10. cnvd与cnnvd区别_漏洞编码CVE/CAN/BUGTRAQ/CNCVE/CNVD/CNNVD都指什么?
  11. 亲身体验 DDOS(拒绝服务)攻击硬防DIY
  12. java实验3_Java实验3
  13. 实践Python控制NI SMU PXIe-4143
  14. 地质勘查土质分类图片_工程土质分类
  15. 数据分析师的思维方式
  16. 远程缝制葡萄皮,成本仅1万元,华为200万年薪博士杰作
  17. 航空枢纽问题 matlab,[原创]航空领域常用几个速度的定义和说明
  18. 【Kaldi 新手入门】手把手教你搭建简易英文数字ASR系统
  19. java订单表字段_javaweb企业订单管理系统
  20. c语言中英文翻译 毕业设计,c语言中英文翻译资料 毕设论文.doc

热门文章

  1. Python字典练习_注册校验
  2. 数字图像处理5--边缘检测探究(内容较多,持续更新)
  3. php touch 无效,php提示 Warning: touch() [function.touch]: Utime failed: Permission denied in错误...
  4. OpenGL ES 多目标渲染(MRT)
  5. java计算机毕业设计至臻阁古董拍卖网源码+数据库+系统+lw文档+mybatis+运行部署
  6. 第二章 - 线程的创建
  7. 手持扫描打印终端POS机应用商场零售批发移动销售开单
  8. PROTAC与抗体偶联药物的结合
  9. python server酱_程序猿推送利器:使用Python+Server酱打造微信通知推送利器
  10. 深度学习环境配置超详细教程【Anaconda+PyTorch(GPU版)+CUDA+cuDNN】