如何在 Unity3D 中导出点云数据(Project Tango)?

How do I export Point Cloud Data (Project Tango) in Unity3D?

如题目所示,Unity3D制作的apk中的点云数据如何导出?我如何使用这些数据在 Unity3D 中创建 3D 网格或模型?

在 Unity3D 中使用 Tango 创建 3D 网格或模型

Unity Tango SDK 中有一个示例场景,可让您直接在 apk 应用程序中获取和导出彩色网格。看看Assets\TangoSDK\Examples\Scenes\ExperimentalMeshBuilderWithColor.unity.

在apk中导出点云数据

我认为 SDK 中没有直接执行此操作的函数,但请查看以下脚本:Assets\TangoSDK\Examples\Common\Scripts\TangoDynamicMesh.cs 更准确地说是导出的函数 public void ExportMeshToObj(string filepath)将 TangoDynamicMesh 转换为 OBJ 文件格式。

您可以创建一个类似的脚本,从 TangoPointCloud.m_mesh 而不是 TangoDynamicMesh 获取值,以将您的点云导出为 OBJ 文件。

也看看这个问题:How do I export Point Cloud Data (Project Tango)

在 Unity 中从 3D 点创建网格

从 3D 点创建网格并不是那么容易,在 Unity 中没有直接的方法来完成。从导出的 OBJ 点云中,您可以使用 Point Cloud Library or Meshlab.

等外部工具

按此example即可获取点云数据。按照指南设置好所有内容后,您可以轻松获取所有点的坐标:

private Vector3[] GetPointCloudData()
{
    TangoPointCloud pointCloud = FindObjectOfType<TangoPointCloud>();
    return pointCloud.m_points;
}

但是,通过这种方式,您只能获得设备屏幕上当前可见的点数。

将它们发送到服务器后,创建包含网格的游戏对象并绘制点:

public void CreateMesh(Vector3[] points)
{
    Util.Debug("Drawing...");
    mesh.Clear();

    int[] indecies = new int[points.Length];
    Color[] colors = new Color[points.Length];
    for (int i = 0; i < points.Length; ++i)
    {
        indecies[i] = i;
        colors[i] = Color.green;
    }

    mesh.vertices = points;
    mesh.colors = colors;
    mesh.SetIndices(indecies, MeshTopology.Points, 0);

}

注意颜色是硬编码的,我没能从点云数据中获取它们。

要提取网格,您可以按照此 example .