在某些特殊情况下,不得不对模型进行一些简单的修改,所以写了个简单的编辑脚本。

思路就是获取mesh上的所有顶点,然后在每个顶点位置创建一个控制点,控制点可以是任意你喜欢的物体,通过判断控制点的位置信息来修改mesh的顶点位置。

在unity中,mesh上的顶点与几个面相交,就会有几个坐标点,估计是把点为每一个三角形面复制了一份,所以这里在生成控制点时要注意剔除重复的点,不要重复生成。

这里我是把每个顶点的坐标转为字符串,使用该坐标的字符串作为key来把控制点与顶点数据联系起来。

下面给出完整代码

首先是控制点的脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class MeshEditorPoint : MonoBehaviour {//顶点id,(顶点初始位置转字符串)[HideInInspector] public string pointid;//记录坐标点上一次移动的位置,用于判断控制点是否移动[HideInInspector] private Vector3 lastPosition;public delegate void MoveDelegate(string pid,Vector3 pos);//控制点移动时的回调public MoveDelegate onMove = null;// Use this for initializationvoid Start () {lastPosition = transform.position;}// Update is called once per framevoid Update () {if(transform.position != lastPosition){if(onMove != null) onMove(pointid, transform.localPosition);lastPosition = transform.position;}}
}

然后是顶点编辑脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Text;
using System;public class ModelMeshEditor : MonoBehaviour {//控制点的大小public float pointScale = 1.0f;private float lastPointScale = 1.0f;Mesh mesh;//顶点列表List<Vector3> positionList = new List<Vector3>();//顶点控制物体列表List<GameObject> positionObjList = new List<GameObject>();/// <summary>/// key:顶点字符串/// value:顶点在列表中的位置/// </summary>Dictionary<string, List<int>> pointmap = new Dictionary<string, List<int>>();// Use this for initializationvoid Start () {lastPointScale = pointScale;mesh = GetComponent<MeshFilter>().sharedMesh;CreateEditorPoint();}//创建控制点public void CreateEditorPoint(){positionList = new List<Vector3>(mesh.vertices);for (int i = 0; i < mesh.vertices.Length; i++){string vstr = Vector2String(mesh.vertices[i]);if(!pointmap.ContainsKey(vstr)){pointmap.Add(vstr,new List<int>());}pointmap[vstr].Add(i);}foreach (string key in pointmap.Keys){GameObject editorpoint = (GameObject)Resources.Load("Prefabs/MeshEditor/MeshEditorPoint");editorpoint = Instantiate(editorpoint);editorpoint.transform.parent = transform;editorpoint.transform.localPosition = String2Vector(key);editorpoint.transform.localScale = new Vector3(1f, 1f, 1f);MeshEditorPoint editorPoint = editorpoint.GetComponent<MeshEditorPoint>();editorPoint.onMove = PointMove;editorPoint.pointid = key;positionObjList.Add(editorpoint);}}//顶点物体被移动时调用此方法public void PointMove(string pointid,Vector3 position){if(!pointmap.ContainsKey(pointid)){return;}List<int> _list = pointmap[pointid];for (int i = 0; i < _list.Count; i ++){positionList[_list[i]] = position;}mesh.vertices = positionList.ToArray();mesh.RecalculateNormals();}// Update is called once per framevoid Update () {//检测控制点尺寸是否改变if (Math.Abs(lastPointScale - pointScale) > 0.1f){lastPointScale = pointScale;for (int i = 0; i < positionObjList.Count; i ++){positionObjList[i].transform.localScale = new Vector3(pointScale, pointScale, pointScale);}}}string Vector2String(Vector3 v){StringBuilder str = new StringBuilder();str.Append(v.x).Append(",").Append(v.y).Append(",").Append(v.z);return str.ToString();}Vector3 String2Vector(string vstr){try{string[] strings = vstr.Split(',');return new Vector3(float.Parse(strings[0]), float.Parse(strings[1]), float.Parse(strings[2]));}catch(Exception e){Debug.LogError(e.ToString());return Vector3.zero;}}
}

使用:

首先制作控制点的prefab,然后挂载上MeshEditorPoint脚本。

在想要编辑的mesh的GameObject上挂载ModelMeshEditor,不要忘记修改ModelMeshEditor中加载prefab的路径。

然后运行场景可就可以看到模型上的控制点了:

然后就可以拖动这些控制点来改变mesh的顶点数据了:

***注意:这里对mesh的修改是即时保存的,并且不能恢复,修改之前请务必做好备份!!!也可以修改我上面的脚本,在开始时复制一个mesh来修改,修改后再决定是否需要保存。

unity 编辑mesh顶点位置相关推荐

  1. Unity - Optimize Mesh Data 导致的 Mesh 顶点数据(法线、切线、UV2~8,Color0~7,等)丢失

    如题,出现这个问题是我们公司项目在优化阶段将部分打包的资源,如:Prefab 中的一些对象的材质,都使用了最简单的 shader,这些 shader 可能只是一个 unlit 这个 unlit 简单到 ...

  2. Unity Shader:Unity网格(1)---顶点,三角形朝向,法线,uv,以及双面渲染三角形

    1,顶点 顶点是网格最基础的组成部分,可通过mesh.vertices获取和赋值.mesh.vertices是一个Vector3的数组,每个Vector3代表了此顶点在世界空间中的位置每个Vector ...

  3. 【Unity】Mesh网格编程(四)麦比乌斯环

    前言 事隔四个多月,第二篇网格编程原创,本次献给大家的是麦比乌斯环. 其实这个早就想做了,还是轻松下来的时候思绪转的快. 不废话,先看效果: 博文首发:http://blog.csdn.net/duz ...

  4. [Unity] 创建网格顶点和三角形

    通过代码生成一个三角形和一个四边形. 定义顶点位置.法线.切线和纹理坐标. 使用简单和高级的 Mesh API. 将顶点数据存储在多个流或单个流中.   这是有关程序Mesh的系列教程中的第一个教程. ...

  5. 学习笔记:unity通过Mesh网格绘制图形:三角形正方体圆柱

    一,介绍 Mesh类:通过脚本创建或是获取网格的类,网格包含多个顶点和三角形数组.顶点信息包含坐标和所在面的法线. unity中3D的世界的所有图形全部都是由三角形构成的. 比如unity已经装配好的 ...

  6. [Unity]利用Mesh在Unity中绘制扇形图片

    背景 最近碰到个功能, 要画一个扇形图案, 如下图: 美术原图: 需求是这个图形跟随角色, 在角色背后, 并且每个角色的扇形角度可能不同. So, NGUI和UGUI很好用的FilledType是用不 ...

  7. Unity用Mesh画多边形、圆形

    首先贴上效果图 上面两个图就是使用Unity的Mesh画出的正五边形和正八变形. 无论是研究过Mesh还是只是有所听说,应该都听过网格,上面两个图形就是利用来网格的特性来实现的. 首先讲一下Mesh原 ...

  8. unity中Mesh网格编程

    上图是效果 一.关于mesh的意义 有了mesh网格,物体才能被渲染出来. (1)mesh中包含顶点, mesh.vertices (2)顶点对应的uv(一张图的uv左下角00,右上角11) mesh ...

  9. Unity Polybrush与顶点色着色器

    今年年初,我们宣布了ProBuilder和Polybrush将正式成为Unity的一部分.我们已经详细介绍过使用ProBuilder快速关卡建模,而Polybrush可以帮助我们完成粗略的雕刻.纹理混 ...

最新文章

  1. 影像组学视频学习笔记(18)-使用MRIcroGL软件格式转换、勾画ROI、Li‘s have a solution and plan.
  2. it转正述职报告_普通员工转正述职报告范文
  3. 中国社交产品十年记...
  4. 中石油训练赛 - 斗地主(bfs)
  5. javascript 练习(2)——js数组去重
  6. 基于金融知识图谱的会计欺诈风险识别方法
  7. 谷歌浏览器chrome设置特定网页使用Https(ssl)访问
  8. 杂谈异常处理try-catch-finally
  9. pthread_join()函数理解实验
  10. Atitit.index manager api design 索引管理api设计
  11. 文件搜索工具Listary中文版快速上手使用教程
  12. 热敏电阻、RTD、热电偶的原理和特性
  13. mysql索引,索引结构,索引类型,索引失效
  14. codeforces Dima and Trap Graph
  15. [IOI2018]组合动作——构造
  16. C++调用Matlab生成的DLL动态链接库进行混合编程(win10+VS2015+Matlab2016b)
  17. 平凡程序员一年又一年的感悟(2019)
  18. deepin php7,deepin安装php7
  19. linux同步两台mysql数据,Mysql入门MySQL 数据库两台主机同步实战(linux)
  20. 什么蓝牙耳机性价比高?四款高性价比蓝牙耳机推荐

热门文章

  1. 『创意欣赏』60款惊艳的 iOS App 图标设计《第四季》
  2. The frontend does not match Zabbix database
  3. python爬取b站排行榜_抓取+硒元素,获得Bilibili排行榜(紧急列表)(动态加载),scrapyselenium,获取,哔哩,应援...
  4. 转:090725很神奇的一张图片不得不转
  5. 【2023秋招大厂真题】携程校招-2022.9.28-k-好数组
  6. Gox语言中的并发处理以及用通道实现数据安全共享-GX21
  7. Shopify批量上货助手-Shopify独立站
  8. 2022R1快开门式压力容器操作考试试题及在线模拟考试
  9. CentOS7 输入正确密码提示Sorry,that didnt work,please try again
  10. IDEA运行报错:类文件具有错误的版本 55.0, 应为 52.0 请删除该文件或确保该文件位于正确的类路径子目录中。