【发布时间】:2020-12-01 04:25:10
【问题描述】:
现在我正在尝试将全息透镜上的空间网格保存为 obj 文件。我的问题是,当尝试打开 obj 文件时,例如在 Blender(或 3D 查看器)中,我收到一条错误消息,上面写着 IndexError: List index out of range。所以我想我给我的三角形提供了错误的索引(在MeshToString() 的最后一部分),但我不知道如何以正确的方式做到这一点。
什么有效: 例如,如果我只从第一个网格过滤器中取出一个网格并在 MeshToString() 中剪掉 + lastFaceIndex,它就可以正常工作。但这只是我房间的一部分。我想要房间里的整个网格,所以我必须遍历所有网格过滤器并获取我的网格,然后将它们写入 obj 文件,但我不知道如何为三角形提供正确的索引。
我还注意到,如果我通过设备门户下载网格,它大约有 4.8MB,但我通过统一应用程序下载的网格只有 1.4MB。
我的设置:
团结 2019.3.14
机读旅行证件 2.4
HoloLens 第二代
GetSpatialMesh():
private void GetSpatialMesh()
{
if (_observer == null)
return;
List<Mesh> meshes = new List<Mesh>();
// Loop through all known Meshes
foreach (SpatialAwarenessMeshObject meshObject in _observer.Meshes.Values)
meshes.Add(meshObject.Filter.mesh);
WriteMeshToFile("MyMesh.obj", meshes);
}
WriteMeshToFile():
public static void WriteMeshToFile(string fileName, IEnumerable<Mesh> meshes)
{
string path = Path.Combine(Application.persistentDataPath, fileName);
using (var file = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Write))
{
faceCount = 0;
using (var writer = new StreamWriter(file, Encoding.UTF8))
{
int o = 0;
foreach (Mesh mesh in meshes)
{
o++;
writer.WriteLine("o Object." + o);
writer.Write(MeshToString(mesh, faceCount));
writer.WriteLine("");
}
}
}
}
MeshToString():
public static string MeshToString(Mesh m, int lastFaceIndex = 0)
{
StringBuilder sb = new StringBuilder();
foreach (Vector3 v in m.vertices)
{
sb.Append(string.Format("v {0} {1} {2}\n", v.x, v.y, v.z));
}
sb.Append("\n");
foreach (Vector3 v in m.normals)
{
sb.Append(string.Format("vn {0} {1} {2}\n", v.x, v.y, v.z));
}
sb.Append("\n");
foreach (Vector3 v in m.uv)
{
sb.Append(string.Format("vt {0} {1}\n", v.x, v.y));
}
for (int material = 0; material < m.subMeshCount; material++)
{
int[] triangles = m.GetTriangles(material);
for (int i = 0; i < triangles.Length; i += 3)
{
faceCount += 3;
sb.Append(string.Format("f {0}/{0}/{0} {1}/{1}/{1} {2}/{2}/{2}\n",
triangles[i] + 1 + lastFaceIndex, triangles[i + 1] + 1 + lastFaceIndex, triangles[i + 2] + 1 + lastFaceIndex));
}
}
return sb.ToString();
}
解决方案:
场景理解sample project对我不起作用,所以我只是通过统一的nuget manager获得了sdk。我使用了来自 SceneUnderstandingManager(这是示例项目的一部分)的代码,Hernando-MSFT 在下面的回答中引用了该代码。
【问题讨论】:
-
Hololens 上的persistentDataPath() 保存到什么位置?
-
Windows 设备门户 → 文件资源管理器 → 本地应用程序数据 → YourApp → LocalState。我花了大约 2 秒钟的时间来谷歌:appzinside.com/2018/08/06/…
标签: unity3d spatial mesh hololens mrtk