如何在 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 .
如题目所示,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 .