1.  

  1.  
  2. using UnityEngine;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5.  
  6. public struct SegmentPoint
  7. {
  8. public Vector3 normal;
  9. public Vector3 pos;
  10. };
  11.  
  12. public class DrawMesh_Plane : MonoBehaviour {
  13.  
  14. MeshFilter meshFilter;
  15. /// <summary>
  16. /// 面片中的最后一个点
  17. /// </summary>
  18. SegmentPoint lastPoint;
  19. SegmentPoint penultPoint;
  20.  
  21. bool startDraw = false;
  22. bool twoPoint = false;
  23.  
  24. /// <summary>
  25. /// 线条半径
  26. /// </summary>
  27. float r;
  28. /// <summary>
  29. /// 包含meshfilter、meshrenderer、材质球组件的预设体
  30. /// </summary>
  31. public GameObject linePrefab;
  32. public Transform lineParent;
  33. /// <summary>
  34. /// 平滑点数
  35. /// </summary>
  36. public int smooth = 3;
  37.  
  38. [HideInInspector]
  39. public Color lineColor;
  40.  
  41. public VRTracketObjManager vrtom;
  42. public bool usePressure;
  43.  
  44. public DrawMeshManager drawMeshManager;
  45.  
  46.  
  47. void Start()
  48. {
  49. lineColor = drawMeshManager.color;
  50. }
  51.  
  52.  
  53. void Update()
  54. {
  55.  
  56. DrawMeshByCollider();
  57. }
  58.  
  59.  
  60. void DrawMeshVR()
  61. {
  62. var device = SteamVR_Controller.Input((int)vrtom.trackedObj_Left.index);
  63. if (device.GetPress(SteamVR_Controller.ButtonMask.Trigger))
  64. {
  65. if (usePressure)
  66. {
  67. r = device.GetAxis(Valve.VR.EVRButtonId.k_EButton_Axis1).x * drawMeshManager.brushRadius;
  68. }
  69. else
  70. {
  71. r = drawMeshManager.brushRadius;
  72. }
  73. if (!startDraw && !twoPoint)
  74. {
  75. GameObject line = Instantiate(linePrefab);
  76. line.transform.SetParent(lineParent);
  77. meshFilter = line.GetComponent<MeshFilter>();
  78. line.GetComponent<MeshRenderer>().material.SetColor("_Color", lineColor);
  79. if (drawMeshManager.addStep != null)
  80. {
  81. drawMeshManager.addStep(line);
  82. }
  83. }
  84. float dis = Vector3.Distance(vrtom.leftPenPoint.position, lastPoint.pos);
  85. if (!startDraw)
  86. {
  87. lastPoint.pos = vrtom.leftPenPoint.position;
  88. lastPoint.normal = -vrtom.leftPenPoint.up;
  89. startDraw = true;
  90. }
  91. else if (!twoPoint && dis > drawMeshManager.spaceDis)
  92. {
  93. SegmentPoint hitP;
  94. hitP.pos = vrtom.leftPenPoint.position;
  95. hitP.normal = -vrtom.leftPenPoint.up;
  96. meshFilter.mesh = CreateStartMesh(lastPoint, hitP);
  97. penultPoint = lastPoint;
  98. lastPoint = hitP;
  99. twoPoint = true;
  100. }
  101. else if (dis > drawMeshManager.spaceDis)
  102. {
  103. SegmentPoint hitP;
  104. hitP.pos = vrtom.leftPenPoint.position;
  105. hitP.normal = -vrtom.leftPenPoint.up;
  106. SegmentPoint[] newSP = SmoothPoints(lastPoint, penultPoint, hitP);
  107. List<Vector3> nv = new List<Vector3>();
  108. for (int i = 0; i <= newSP.Length - 2; i++)
  109. {
  110. nv.AddRange(ComputeVertex(newSP[i], newSP[i + 1]));
  111. }
  112. penultPoint = newSP[newSP.Length - 2];
  113. lastPoint = hitP;
  114. SetMesh(nv.ToArray());
  115. }
  116. }
  117. if (device.GetPressUp(SteamVR_Controller.ButtonMask.Trigger))
  118. {
  119. startDraw = false;
  120. twoPoint = false;
  121. meshFilter = null;
  122. }
  123. }
  124.  
  125. /// <summary>
  126. /// 贴合模型画线
  127. /// </summary>
  128. void DrawMeshByCollider()
  129. {
  130. r = drawMeshManager.brushRadius;
  131. if (Input.GetMouseButton(0))
  132. {
  133. RaycastHit hit;
  134. Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
  135. if (Physics.Raycast(ray, out hit) && hit.collider.tag == TagManager.Line)
  136. {
  137. if (!startDraw && !twoPoint)
  138. {
  139. GameObject line = Instantiate(linePrefab);
  140. line.transform.SetParent(lineParent);
  141. meshFilter = line.GetComponent<MeshFilter>();
  142. line.GetComponent<MeshRenderer>().material.SetColor("_Color", lineColor);
  143. if (drawMeshManager.addStep != null)
  144. {
  145. drawMeshManager.addStep(line);
  146. }
  147. }
  148. float dis = Vector3.Distance(hit.point, lastPoint.pos);
  149. if (!startDraw) //开始创建第一个点
  150. {
  151. lastPoint.pos = hit.point;
  152. lastPoint.normal = hit.normal;
  153. startDraw = true;
  154. }
  155. else if (!twoPoint && dis > drawMeshManager.spaceDis) //开始创建第一个面片
  156. {
  157. SegmentPoint hitP;
  158. hitP.pos = hit.point;
  159. hitP.normal = hit.normal;
  160. meshFilter.mesh = CreateStartMesh(lastPoint, hitP);
  161. penultPoint = lastPoint;
  162. lastPoint = hitP;
  163. twoPoint = true;
  164. }
  165. else if (dis > drawMeshManager.spaceDis)
  166. {
  167. SegmentPoint hitP;
  168. hitP.pos = hit.point;
  169. hitP.normal = hit.normal;
  170. SegmentPoint[] newSP = SmoothPoints(lastPoint, penultPoint, hitP);
  171. List<Vector3> nv = new List<Vector3>();
  172. for (int i = 0; i <= newSP.Length - 2; i++)
  173. {
  174. nv.AddRange(ComputeVertex(newSP[i], newSP[i + 1]));
  175. }
  176. penultPoint = newSP[newSP.Length - 2];
  177. lastPoint = hitP;
  178. SetMesh(nv.ToArray());
  179. }
  180. }
  181. else
  182. {
  183. startDraw = false;
  184. twoPoint = false;
  185. meshFilter = null;
  186. }
  187. }
  188. if (Input.GetMouseButtonUp(0))
  189. {
  190. startDraw = false;
  191. twoPoint = false;
  192. meshFilter = null;
  193. }
  194. }
  195.  
  196. /// <summary>
  197. /// 创建第一个面片
  198. /// </summary>
  199. /// <param name="startP"></param>
  200. /// <param name="endP"></param>
  201. /// <returns></returns>
  202. Mesh CreateStartMesh(SegmentPoint startP,SegmentPoint endP)
  203. {
  204. Vector3 v1 = endP.pos - startP.pos;
  205. Vector3 d1 = Vector3.Cross(v1.normalized, startP.normal);
  206. Vector3 d2 = Vector3.Cross(v1.normalized, endP.normal);
  207. d1 = d1.normalized;
  208. Vector3 p0, p1, p2, p3;
  209. p0 = startP.pos - d1 * r * 0.5f + startP.normal * drawMeshManager.expand;
  210. p1 = startP.pos + d1 * r * 0.5f + startP.normal * drawMeshManager.expand;
  211. p2 = endP.pos - d2 * r * 0.5f + endP.normal * drawMeshManager.expand;
  212. p3 = endP.pos + d2 * r * 0.5f + endP.normal * drawMeshManager.expand;
  213. Vector3[] newVertices = {p0, p1, p2, p3 };
  214. Vector2[] newUV = { new Vector2(p0.x, p0.y), new Vector2(p1.x, p1.y), new Vector2(p2.x, p2.y), new Vector2(p3.x, p3.y) };
  215. int[] newTriangles = { 0, 1, 2, 1, 3, 2 };
  216. Mesh mesh = new Mesh();
  217. mesh.vertices = newVertices;
  218. mesh.uv = newUV;
  219. mesh.triangles = newTriangles;
  220. return mesh;
  221. }
  222.  
  223.  
  224. /// <summary>
  225. /// 获取原先面片
  226. /// </summary>
  227. /// <param name="vert"></param>
  228. /// <param name="uvs"></param>
  229. /// <param name="tri"></param>
  230. void GetMesh(out List<Vector3> vert,out List<Vector2> uvs,out List<int> tri)
  231. {
  232. vert = new List<Vector3>();
  233. uvs = new List<Vector2>();
  234. tri = new List<int>();
  235. vert.AddRange(meshFilter.mesh.vertices);
  236. uvs.AddRange(meshFilter.mesh.uv);
  237. tri.AddRange(meshFilter.mesh.triangles);
  238. }
  239.  
  240. public void GenerateMesh(LineData ld)
  241. {
  242. GameObject l = Instantiate(linePrefab);
  243. l.AddComponent<MeshFilter>();
  244. l.AddComponent<MeshRenderer>();
  245. l.transform.position = ld.position;
  246. l.transform.eulerAngles = ld.rotation;
  247. Vector3[] newVertices = ld.vertex;
  248. Vector2[] newUV = ld.uv;
  249. int[] newTriangles = ld.triangle;
  250. Mesh mesh = new Mesh();
  251. mesh.vertices = newVertices;
  252. mesh.uv = newUV;
  253. mesh.triangles = newTriangles;
  254. l.GetComponent<MeshFilter>().mesh = mesh;
  255. l.GetComponent<MeshRenderer>().material.color = ld.color;
  256. }
  257.  
  258. /// <summary>
  259. /// 使用贝塞尔平滑线段
  260. /// </summary>
  261. /// <param name="last"></param>
  262. /// <param name="penult"></param>
  263. /// <param name="current"></param>
  264. /// <returns></returns>
  265. SegmentPoint[] SmoothPoints(SegmentPoint last, SegmentPoint penult, SegmentPoint current)
  266. {
  267. float d = 1f / (float)smooth;
  268.  
  269. SegmentPoint[] ps = new SegmentPoint[smooth - 1];
  270. for (int i = 0; i < ps.Length; i++)
  271. {
  272. float t = d * (i + 1);
  273. ps[i].pos = (1 - t) * (1 - t) * penult.pos + 2 * t * (1 - t) * last.pos + t * t * current.pos;
  274. ps[i].normal = Vector3.LerpUnclamped(penult.normal, current.normal, t);
  275. }
  276. List<SegmentPoint> segs = new List<SegmentPoint>();
  277. segs.Add(penult);
  278. segs.AddRange(ps);
  279. segs.Add(current);
  280. return segs.ToArray();
  281. }
  282.  
  283. Vector3[] ComputeVertex(SegmentPoint p1,SegmentPoint p2)
  284. {
  285. Vector3 dir = p2.pos - p1.pos;
  286.  
  287. Vector3 d = Vector3.Cross(dir, p2.normal).normalized;
  288. Vector3[] ps = new Vector3[2];
  289. ps[0] = p2.pos - d * 0.5f * r + p2.normal * drawMeshManager.expand;
  290. ps[1] = p2.pos + d * 0.5f * r + p2.normal * drawMeshManager.expand;
  291.  
  292. return ps;
  293. }
  294.  
  295. /// <summary>
  296. /// 添加mesh
  297. /// </summary>
  298. /// <param name="vetexes"></param>
  299. void SetMesh(Vector3[] vertexes)
  300. {
  301.  
  302. List<Vector3> vert;
  303. List<Vector2> uvs;
  304. List<int> tri;
  305. GetMesh(out vert, out uvs, out tri);
  306. Vector3[] newVert = vertexes;
  307. Vector2[] newUv = new Vector2[vertexes.Length];
  308. for (int i = 0; i < newVert.Length; i++)
  309. {
  310. newUv[i] = newVert[i];
  311. }
  312.  
  313. vert.RemoveAt(vert.Count - 1);
  314. vert.RemoveAt(vert.Count - 1);
  315. vert.AddRange(newVert);
  316.  
  317. uvs.RemoveAt(uvs.Count - 1);
  318. uvs.RemoveAt(uvs.Count - 1);
  319. uvs.AddRange(newUv);
  320.  
  321. int[] newTri = new int[vert.Count * 3 - 6];
  322. for (int i = 0; i < newTri.Length / 6; i++)
  323. {
  324. if (i == 0)
  325. {
  326. newTri[i] = 0;
  327. newTri[i + 1] = 1;
  328. newTri[i + 2] = 2;
  329. newTri[i + 3] = 1;
  330. newTri[i + 4] = 3;
  331. newTri[i + 5] = 2;
  332. }
  333. else
  334. {
  335. newTri[i * 6] = newTri[i * 6 - 6] + 2;
  336. newTri[i * 6 + 1] = newTri[i * 6 - 5] + 2;
  337. newTri[i * 6 + 2] = newTri[i * 6 - 4] + 2;
  338. newTri[i * 6 + 3] = newTri[i * 6 - 3] + 2;
  339. newTri[i * 6 + 4] = newTri[i * 6 - 2] + 2;
  340. newTri[i * 6 + 5] = newTri[i * 6 - 1] + 2;
  341. }
  342. }
  343. Mesh m = new Mesh();
  344. m.SetVertices(vert);
  345. m.uv = uvs.ToArray();
  346. m.triangles = newTri;
  347. meshFilter.mesh.Clear();
  348. meshFilter.mesh = m;
  349. }
  350. }
  351.  
  352. =====================================================================
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using LitJson;
  5. using System.Text;
  6. using System.IO;
  7. using UnityEditor;
  8.  
  9. public class DrawMeshManager : MonoBehaviour {
  10.  
  11. /// <summary>
  12. /// 线条半径
  13. /// </summary>
  14. public float brushRadius = 0.01f;
  15. /// <summary>
  16. /// 点之间最小间隔
  17. /// </summary>
  18. public float spaceDis = 0.04f;
  19. /// <summary>
  20. /// 面片向外扩展距离
  21. /// </summary>
  22. public float expand = 0.01f;
  23. public Color color;
  24. public float alpha;
  25.  
  26. public delegate void AddStep(GameObject gameObj);
  27. public AddStep addStep;
  28.  
  29. /// <summary>
  30. /// 最大保存步数
  31. /// </summary>
  32. public int maxCount = 10;
  33.  
  34. public GameObject line;
  35. public GameObject tips;
  36.  
  37. List<GameObject> allLine = new List<GameObject>();
  38.  
  39. LineData[] allLineData ;
  40. StringBuilder stringB;
  41. string filepath;
  42.  
  43. // Use this for initialization
  44. void Start () {
  45. filepath = Application.dataPath + @"/StreamingAssets/json_line.txt";
  46. addStep = new AddStep(AddDrawStep);
  47. }
  48.  
  49. // Update is called once per frame
  50. void Update () {
  51.  
  52. }
  53.  
  54.  
  55. void AddDrawStep(GameObject mesh)
  56. {
  57. if (allLine.Count == maxCount)
  58. {
  59. allLine.RemoveAt(maxCount - allLine.Count);
  60. }
  61. allLine.Add(mesh);
  62. }
  63.  
  64. void Undo()
  65. {
  66. if (Input.GetKeyDown(KeyCode.Z))
  67. {
  68. if (allLine.Count > 0)
  69. {
  70. Destroy(allLine[allLine.Count - 1]);
  71. allLine.RemoveAt(allLine.Count - 1);
  72. }
  73. }
  74. }
  75.  
  76. public void SaveI()
  77. {
  78. SaveAsyn();
  79. }
  80.  
  81.  
  82. void SaveAsyn()
  83. {
  84. allLineData = new LineData[line.transform.childCount];
  85. print(allLineData.Length);
  86. for (int i = 0; i < allLineData.Length; i++)
  87. {
  88. allLineData[i] = new LineData();
  89. allLineData[i].name = line.transform.GetChild(i).name;
  90. allLineData[i].position = line.transform.GetChild(i).position;
  91. allLineData[i].rotation = line.transform.GetChild(i).eulerAngles;
  92. allLineData[i].vertex = line.transform.GetChild(i).GetComponent<MeshFilter>().mesh.vertices;
  93. allLineData[i].uv = line.transform.GetChild(i).GetComponent<MeshFilter>().mesh.uv;
  94. allLineData[i].triangle = line.transform.GetChild(i).GetComponent<MeshFilter>().mesh.triangles;
  95. allLineData[i].color = line.transform.GetChild(i).GetComponent<MeshRenderer>().material.color;
  96. }
  97.  
  98. StringBuilder sb = LineData2Jason(allLineData);
  99. stringB = sb;
  100.  
  101.  
  102. //Loom.RunAsync(()=> { WriteToText(sb,filepath); });
  103. WriteToText(sb, filepath);
  104. //AssetDatabase.Refresh();
  105.  
  106. }
  107.  
  108. void WriteToText(StringBuilder sb,string filepath)
  109. {
  110. FileInfo t = new FileInfo(filepath);
  111. if (!File.Exists(filepath))
  112. {
  113. File.Delete(filepath);
  114. }
  115.  
  116. StreamWriter sw = t.CreateText();
  117. sw.WriteLine(sb.ToString());
  118. sw.Close();
  119. sw.Dispose();
  120. }
  121.  
  122. /// <summary>
  123. /// 所有line转换为json
  124. /// </summary>
  125. /// <param name="ld"></param>
  126. /// <returns></returns>
  127. StringBuilder LineData2Jason(LineData[] ld)
  128. {
  129. StringBuilder sb = new StringBuilder();
  130. JsonWriter writer = new JsonWriter(sb);
  131. writer.WriteObjectStart();
  132. writer.WritePropertyName("allLine");
  133. writer.WriteArrayStart();
  134. foreach (LineData data in ld)
  135. {
  136. writer.WriteObjectStart();
  137. writer.WritePropertyName("name");
  138. writer.Write(data.name);
  139.  
  140. writer.WritePropertyName("position");
  141. writer.WriteArrayStart();
  142. writer.WriteObjectStart();
  143. writer.WritePropertyName("x");
  144. writer.Write(data.position.x.ToString("F5"));
  145. writer.WritePropertyName("y");
  146. writer.Write(data.position.x.ToString("F5"));
  147. writer.WritePropertyName("z");
  148. writer.Write(data.position.x.ToString("F5"));
  149. writer.WriteObjectEnd();
  150. writer.WriteArrayEnd();
  151.  
  152. writer.WritePropertyName("rotation");
  153. writer.WriteArrayStart();
  154. writer.WriteObjectStart();
  155. writer.WritePropertyName("x");
  156. writer.Write(data.rotation.x.ToString("F5"));
  157. writer.WritePropertyName("y");
  158. writer.Write(data.rotation.y.ToString("F5"));
  159. writer.WritePropertyName("z");
  160. writer.Write(data.rotation.z.ToString("F5"));
  161. writer.WriteObjectEnd();
  162. writer.WriteArrayEnd();
  163.  
  164. writer.WritePropertyName("vertex");
  165. writer.WriteArrayStart();
  166. for (int i = 0; i < data.vertex.Length; i++)
  167. {
  168. writer.WriteObjectStart();
  169. writer.WritePropertyName("index");
  170. writer.Write(i.ToString());
  171.  
  172. writer.WritePropertyName("x");
  173. writer.Write(data.vertex[i].x.ToString("F5"));
  174. writer.WritePropertyName("y");
  175. writer.Write(data.vertex[i].y.ToString("F5"));
  176. writer.WritePropertyName("z");
  177. writer.Write(data.vertex[i].z.ToString("F5"));
  178.  
  179. writer.WriteObjectEnd();
  180. }
  181. writer.WriteArrayEnd();
  182.  
  183. writer.WritePropertyName("uv");
  184. writer.WriteArrayStart();
  185. for (int i = 0; i < data.uv.Length; i++)
  186. {
  187. writer.WriteObjectStart();
  188. writer.WritePropertyName("index");
  189. writer.Write(i.ToString());
  190.  
  191. writer.WritePropertyName("x");
  192. writer.Write(data.uv[i].x.ToString("F5"));
  193. writer.WritePropertyName("y");
  194. writer.Write(data.uv[i].y.ToString("F5"));
  195.  
  196. writer.WriteObjectEnd();
  197. }
  198. writer.WriteArrayEnd();
  199.  
  200. writer.WritePropertyName("triangle");
  201. writer.WriteArrayStart();
  202. for (int i = 0; i < data.triangle.Length; i++)
  203. {
  204. writer.WriteObjectStart();
  205. writer.WritePropertyName("index");
  206. writer.Write(i.ToString());
  207.  
  208. writer.WritePropertyName("value");
  209. writer.Write(data.triangle[i].ToString());
  210.  
  211. writer.WriteObjectEnd();
  212. }
  213. writer.WriteArrayEnd();
  214.  
  215. writer.WritePropertyName("color");
  216. writer.WriteArrayStart();
  217. writer.WriteObjectStart();
  218. writer.WritePropertyName("r");
  219. writer.Write(data.color.r.ToString("F5"));
  220. writer.WritePropertyName("g");
  221. writer.Write(data.color.g.ToString("F5"));
  222. writer.WritePropertyName("b");
  223. writer.Write(data.color.b.ToString("F5"));
  224. writer.WritePropertyName("a");
  225. writer.Write(data.color.a.ToString("F5"));
  226. writer.WriteObjectEnd();
  227. writer.WriteArrayEnd();
  228.  
  229. writer.WriteObjectEnd();
  230. }
  231. writer.WriteArrayEnd();
  232. writer.WriteObjectEnd();
  233. return sb;
  234. }
  235.  
  236.  
  237.  
  238. public void Read()
  239. {
  240. LineData[] ld;
  241.  
  242. StreamReader sr = File.OpenText(filepath);
  243. string strLine = sr.ReadToEnd();
  244. JsonData jd = JsonMapper.ToObject(strLine);
  245. JsonData lineArray = jd["allLine"];
  246.  
  247. ld = new LineData[lineArray.Count];
  248.  
  249. for (int i = 0; i < lineArray.Count; i++)
  250. {
  251. ld[i] = new LineData();
  252. JsonData name, px, py, pz, rx, ry, rz, cr, cg, cb, ca;
  253.  
  254. name = lineArray[i]["name"];
  255.  
  256. JsonData position = lineArray[i]["position"];
  257. px = position[0]["x"];
  258. py = position[0]["y"];
  259. pz = position[0]["z"];
  260.  
  261. JsonData rotation = lineArray[i]["rotation"];
  262. rx = rotation[0]["x"];
  263. ry = rotation[0]["y"];
  264. rz = rotation[0]["z"];
  265.  
  266. JsonData color = lineArray[i]["color"];
  267. cr = color[0]["r"];
  268. cg = color[0]["g"];
  269. cb = color[0]["b"];
  270. ca = color[0]["a"];
  271.  
  272. ld[i].name = (string)name;
  273.  
  274. ld[i].position.x = float.Parse((string)px);
  275. ld[i].position.y = float.Parse((string)py);
  276. ld[i].position.z = float.Parse((string)pz);
  277.  
  278. ld[i].rotation.x = float.Parse((string)rx);
  279. ld[i].rotation.y = float.Parse((string)ry);
  280. ld[i].rotation.z = float.Parse((string)rz);
  281.  
  282. ld[i].color.r = float.Parse((string)cr);
  283. ld[i].color.g = float.Parse((string)cg);
  284. ld[i].color.b = float.Parse((string)cb);
  285. ld[i].color.a = float.Parse((string)ca);
  286.  
  287. JsonData vertex = lineArray[i]["vertex"];
  288. ld[i].vertex = new Vector3[vertex.Count];
  289. ld[i].uv = new Vector2[vertex.Count];
  290. for (int j = 0; j < vertex.Count; j++)
  291. {
  292. ld[i].vertex[j] = new Vector3();
  293. JsonData vx, vy, vz;
  294. vx = vertex[j]["x"];
  295. vy = vertex[j]["y"];
  296. vz = vertex[j]["z"];
  297.  
  298. ld[i].uv[j] = new Vector2();
  299. ld[i].vertex[j].x = float.Parse((string)vx);
  300. ld[i].vertex[j].y = float.Parse((string)vy);
  301. ld[i].vertex[j].z = float.Parse((string)vz);
  302.  
  303. ld[i].uv[j] = ld[i].vertex[j];
  304.  
  305. }
  306.  
  307. JsonData triangle = lineArray[i]["triangle"];
  308. ld[i].triangle = new int[triangle.Count];
  309. for (int j = 0; j < triangle.Count; j++)
  310. {
  311. ld[i].triangle[j] = int.Parse((string)triangle[j]["value"]);
  312. }
  313.  
  314. }
  315. CreateMesh(ld);
  316. }
  317.  
  318.  
  319.  
  320. void CreateMesh(LineData[] ld)
  321. {
  322. for (int i = 0; i < ld.Length; i++)
  323. {
  324. //drawMesh.GenerateMesh(ld[i]);
  325. }
  326. }
  327.  
  328. }

Unity 绘制Mesh线条的更多相关文章

  1. Unity中Mesh分解与边缘高亮加上深度检测

    一个比较简单的需求,不过遇到些坑,记录下. 房间有多个模型,每个模型可能多个SubMesh,点击后,需要能具体到是那个SubMesh,并且在这个SubMesh上显示边缘高光,以及能个性这单个SubMe ...

  2. Quartz2D常见图形的绘制:线条、多边形、圆

    UI高级 Quartz2D http://ios.itcast.cn  iOS学院 掌握 drawRect:方法的使用 常见图形的绘制:线条.多边形.圆 绘图状态的设置:文字颜色.线宽等 图形上下文状 ...

  3. unity 绘制三角形

    哎 该学的还是要学 参考:http://www.narkii.com/club/thread-369573-1.html unity 顶点绘制三角形 脚本绘制; 其实filter和render就是进行 ...

  4. unity绘制线和绘制面

    绘制线条代码,其实就是指定至少两个点,然后赋予贴图即可,不废话,上代码: using UnityEngine; using System.Collections; public class LineT ...

  5. Unity 绘制多边形

    最近工程需要用到一个多边形用来查看角色属性,于是就研究了下Mesh用网格做了一个.遗憾的的 UGUI 渲染不了 3D 物体,然后又用了一段时间研究了下UGUI的网格绘制. 不过终于还是完成了,虽然有些 ...

  6. 关于Unity中Mesh网格的详解

    3D模型 通过3D建模软件所建出来的点和面,如以三角形为主的点和面,比如人的脑袋一个球,就是由各种各样的三角形组成的点和面. 点和面以及纹理坐标都是通过3D建模软件建模出来的. Unity会帮我们把模 ...

  7. Unity中用Mesh画一个圆环

    Probuider 前几天在做一个小项目的时候,用到了Unity自带的一个包ProBuilder其中的Arch生成1/4圆. 挺好玩的,可以在直接Unity中根据需要用Mesh定制生成图形,而不用建模 ...

  8. Unity - 绘制正五边形网格

    本文简述了Unity中绘制正五边形网格的基本方法:计算顶点信息.设置三角形覆盖信息.创建配置mesh 绘制方法 基本思路:计算出五边形顶点坐标信息作为数组,设置三角形包围方式,再创建新的mesh配置v ...

  9. Unity的Mesh压缩:为什么我的内存没有变化?

    0x00 前言 最近和朋友聊天,谈到了Mesh的内存优化问题,他发现开启Model Importer面板上的Mesh Compression选项之后,内存并没有什么变化.事实上,期望开启Mesh Co ...

随机推荐

  1. Debian 下忘记root密码的特殊修改方式

    当系统开机进入 grub页面时,在启动条目上按下键盘的 e 进入编辑 找到 linux 开头的一行,类似下面这样 linux /boot/vmlinux-4.9.0.8-amd64 root=/dev ...

  2. Java 枚举和抽象类添加状态值

    枚举: public enum CourseTypeEnum { VIDEO_COURSE(1,"录制课程"), LIVE_COURSE(2,"直播课程"), ...

  3. PL/SQL不安装ORACLE客户端

    1.oracle官网下载instantclient,将包解压存放到本地. 在这个路径下D:\oracle-basic\instantclient_12_2\network\admin放入TNS文件. ...

  4. openwrt luci web分析

    openwrt luci web分析 来源 https://www.jianshu.com/p/596485f95cf2 www/cbi-bin/luci #!/usr/bin/lua --cgi的执 ...

  5. 【洛谷 SP8093】 JZPGYZ - Sevenk Love Oimaster(后缀自动机)

    题目链接 广义sam.. #include <cstdio> #include <cstring> #include <algorithm> using names ...

  6. IOS - 总结下swift使用GCD 多线程(二)GCD和DispatchQueue

    1.前言  iOS中处理多核并发的技术有两种分别是:`Grand Central Dispatch`(以下简称`GCD`)和`NSOperationQueue`框架.iOS开发的老司机们在程序开发中处 ...

  7. 删除注册在Eureka的服务(无效,多余)

    例子:http://140.143.67.146:8000/eureka/eureka/apps/ZKR-PRODUCT/172.21.0.10:zkr-product:6868 Request Me ...

  8. 压测工具wrk的编译安装与基础使用

    Linux上编译安装: [root@centos ~]# cd /usr/local/src [root@centos ~]# yum install git -y [root@centos ~]# ...

  9. 在safari下input的placeholder设置行高失效

    在项目中遇到input的placeholder在safari下设置行高失效的问题,亲测 input{ width:250px; height:30px; line-height:30px; font- ...

  10. 跨服务器查询sql语句样例(转)

    若2个数据库在同一台机器上: insert into DataBase_A..Table1(col1,col2,col3----) select col11,col22,col33-- from Da ...