SteamVRTrack.cs 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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. meshFilter.mesh = mesh;
  58. }
  59. // Update is called once per frame
  60. void Update()
  61. {
  62. }
  63. CMeshObject getSteamVrMesh(CMeshObjectIterator iterator)
  64. {
  65. ulong count = iterator.Count();
  66. CMeshObject fileMesh;
  67. for (ulong i = 0; i < count; i++)
  68. {
  69. iterator.MoveNext();
  70. fileMesh = iterator.GetCurrentMeshObject();
  71. if (fileMesh.GetName() == "steamvrtrack")
  72. {
  73. return fileMesh;
  74. }
  75. }
  76. return null;
  77. }
  78. }