【问题标题】:Point Cloud Unity example only renders points for the upper half of displayPoint Cloud Unity 示例仅渲染显示上半部分的点
【发布时间】:2016-02-24 15:03:39
【问题描述】:

我们正在尝试让 Point Cloud Unity 示例正常工作。 我们尝试了 git 中的两个示例: https://github.com/googlesamples/tango-examples-unity/tree/master/UnityExamples/Assets/TangoSDK/Examples/PointCloud

以及深度感知教程: https://developers.google.com/project-tango/apis/unity/unity-prefab-depth

但出于某种原因,我们只能在屏幕的上半部分渲染点。 当我们快速向上倾斜我们的设备时,我们可以看到更多的点,但一旦渲染器赶上它们,它们就会再次消失。

我们很确定它适用于旧版本,但我们可能会弄错。 我们使用 Unity 5.3.3,Unity SDK 是 Gemma(1.31 版,2016 年 2 月)。

有什么想法吗?

【问题讨论】:

  • 得到一个工具包做得很好
  • 点云是用Unity的粒子系统渲染的吗?我用它渲染沉没,然后在 3D 船中扫描,每当粒子系统的原点脱离截锥体时,即使某些粒子确实在截锥体中,也不再渲染整个粒子系统。我当时的解决方案是将粒子系统细分为 N 个其他粒子系统,并将每个系统重新定位在其质心上。问题仍然存在,但随着 N 的增长而最小化。
  • 嗨蒂莫西,这是因为设备外部没有被应用到场景中的 deltaPoseController。深度相机有大约 13 度的旋转指向一点点。但是,报告的设备姿势没有 13 度旋转。我认为这应该得到解决。但是你介意让我知道你的用例是什么吗?我可能可以直接帮助您解决问题,而不是帮助您修复增量姿势控制器。

标签: unity3d google-project-tango


【解决方案1】:

Unity 中的 TangoDeltaPoseController 和 TangoPoseController 都假设 Unity Camera Frame 与 Device (Default) Frame 对齐,所以矩阵 dTuc 为 一个常数矩阵

m_dTuc = new Matrix4x4();
m_dTuc.SetColumn(0, new Vector4(1.0f, 0.0f, 0.0f, 0.0f));
m_dTuc.SetColumn(1, new Vector4(0.0f, 1.0f, 0.0f, 0.0f));
m_dTuc.SetColumn(2, new Vector4(0.0f, 0.0f, -1.0f, 0.0f));
m_dTuc.SetColumn(3, new Vector4(0.0f, 0.0f, 0.0f, 1.0f));

但对于 AR 或点云之类的应用程序,叠加图像或点云是 由颜色/深度相机捕获,m_dTuc 需要额外的转换而不是使用默认的常量矩阵

在 TangoARPoseController 中

// Get the transformation of device frame with respect to IMU frame.
        pair.baseFrame = TangoEnums.TangoCoordinateFrameType.TANGO_COORDINATE_FRAME_IMU;
        pair.targetFrame = TangoEnums.TangoCoordinateFrameType.TANGO_COORDINATE_FRAME_DEVICE;
        PoseProvider.GetPoseAtTime(poseData, timestamp, pair);
        Matrix4x4 imuTd = poseData.ToMatrix4x4();

        // Get the transformation of IMU frame with respect to color camera frame.
        pair.baseFrame = TangoEnums.TangoCoordinateFrameType.TANGO_COORDINATE_FRAME_IMU;
        pair.targetFrame = TangoEnums.TangoCoordinateFrameType.TANGO_COORDINATE_FRAME_CAMERA_COLOR;
        PoseProvider.GetPoseAtTime(poseData, timestamp, pair);
        Matrix4x4 imuTc = poseData.ToMatrix4x4();

        // Get the transform of the Unity Camera frame with respect to the Color Camera frame.
        Matrix4x4 cTuc = new Matrix4x4();
        cTuc.SetColumn(0, new Vector4(1.0f, 0.0f, 0.0f, 0.0f));
        cTuc.SetColumn(1, new Vector4(0.0f, -1.0f, 0.0f, 0.0f));
        cTuc.SetColumn(2, new Vector4(0.0f, 0.0f, 1.0f, 0.0f));
        cTuc.SetColumn(3, new Vector4(0.0f, 0.0f, 0.0f, 1.0f));

        m_dTuc = Matrix4x4.Inverse(imuTd) * imuTc * cTuc;

我希望这会对你有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    相关资源
    最近更新 更多