SteamVRTrack.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using Lib3MF;
  6. public class SteamVRTrack : MonoBehaviour
  7. {
  8. public string filePath;
  9. // Start is called before the first frame update
  10. void Start()
  11. {
  12. MeshRenderer meshRenderer = gameObject.AddComponent<MeshRenderer>();
  13. meshRenderer.sharedMaterial = new Material(Shader.Find("Standard"));
  14. MeshFilter meshFilter = gameObject.AddComponent<MeshFilter>();
  15. Mesh mesh = new Mesh();
  16. // Load trackpoint file
  17. CModel model = Wrapper.CreateModel();
  18. CReader reader = model.QueryReader("3mf");
  19. reader.ReadFromFile(filePath);
  20. CMeshObjectIterator iterator = model.GetMeshObjects();
  21. CMeshObject fileMesh = getSteamVrMesh(iterator);
  22. if (fileMesh == null)
  23. {
  24. Debug.Log("TrackpointApp Error: No valid mesh found.");
  25. return;
  26. }
  27. sPosition[] fileVertices;
  28. sTriangle[] fileTriangles;
  29. fileMesh.GetVertices(out fileVertices);
  30. fileMesh.GetTriangleIndices(out fileTriangles);
  31. uint vertexCount = fileMesh.GetTriangleCount() * 3;
  32. Vector3[] vertices = new Vector3[vertexCount];
  33. int[] tris = new int[vertexCount];
  34. Vector3[] normals = new Vector3[vertexCount];
  35. for (int i = 0; i < fileMesh.GetTriangleCount(); i++)
  36. {
  37. sTriangle current = fileTriangles[i];
  38. sPosition one = fileVertices[current.Indices[0]];
  39. vertices[i * 3] = new Vector3(one.Coordinates[0], one.Coordinates[1], one.Coordinates[2]);
  40. sPosition two = fileVertices[current.Indices[1]];
  41. vertices[i * 3 + 1] = new Vector3(two.Coordinates[0], two.Coordinates[1], two.Coordinates[2]);
  42. sPosition three = fileVertices[current.Indices[2]];
  43. vertices[i * 3 + 2] = new Vector3(three.Coordinates[0], three.Coordinates[1], three.Coordinates[2]);
  44. tris[i * 3] = i * 3;
  45. tris[i * 3 + 1] = i * 3 + 1;
  46. tris[i * 3 + 2] = i * 3 + 2;
  47. Vector3 lineOne = vertices[i * 3 + 1] - vertices[i * 3];
  48. Vector3 lineTwo = vertices[i * 3 + 2] - vertices[i * 3];
  49. Vector3 normal = Vector3.Cross(lineOne, lineTwo).normalized;
  50. normals[i * 3] = normal;
  51. normals[i * 3 + 1] = normal;
  52. normals[i * 3 + 2] = normal;
  53. }
  54. mesh.vertices = vertices;
  55. mesh.triangles = tris;
  56. mesh.normals = normals;
  57. /*Vector2[] uv = new Vector2[4]
  58. {
  59. new Vector2(0, 0),
  60. new Vector2(1, 0),
  61. new Vector2(0, 1),
  62. new Vector2(1, 1)
  63. };
  64. mesh.uv = uv;*/
  65. meshFilter.mesh = mesh;
  66. }
  67. // Update is called once per frame
  68. void Update()
  69. {
  70. }
  71. CMeshObject getSteamVrMesh(CMeshObjectIterator iterator)
  72. {
  73. ulong count = iterator.Count();
  74. CMeshObject fileMesh;
  75. for (ulong i = 0; i < count; i++)
  76. {
  77. iterator.MoveNext();
  78. fileMesh = iterator.GetCurrentMeshObject();
  79. if (fileMesh.GetName() == "steamvrtrack")
  80. {
  81. return fileMesh;
  82. }
  83. }
  84. return null;
  85. }
  86. }