Exemplo n.º 1
0
    /// <summary>
    /// Get most recent updated depthTexture.
    /// </summary>
    /// <param name="usingFilter"> If use the depth noise filter.</param>
    /// <param name="maxLength"> Farest(max) value from depth.</param>
    /// <param name="filterLevel"> Levels of surrounding points check in filter.</param>
    /// <returns>Depth texture.</returns>
    public Texture2D GetDepthTexture(bool usingFilter, float maxLength, int filterLevel)
    {
        DepthProvider.GetLatestFrame(ref m_depthMillimeterArr, ref m_timeStamp);
        if (m_timeStamp == m_prevTimeStamp)
        {
            return(m_depthTexture);
        }
        m_prevTimeStamp = m_timeStamp;
        _GetZFromRaw(ref m_depthMeterArr, m_depthMillimeterArr);

        float[] zarray;
        if (usingFilter)
        {
            Helper.Filter(m_depthMeterArr, m_filteredDepthMeterArr, filterLevel);
            zarray = m_filteredDepthMeterArr;
        }
        else
        {
            zarray = m_depthMeterArr;
        }

        float maxLengthInverse = 1.0f / maxLength;

        for (int i = 0; i < DEPTH_TEX_WIDTH * DEPTH_TEX_HEIGHT; i++)
        {
            m_depthColorArr[i].r = zarray[i] * maxLengthInverse;
            m_depthColorArr[i].g = zarray[i] * maxLengthInverse;
            m_depthColorArr[i].b = zarray[i] * maxLengthInverse;
        }
        m_depthTexture.SetPixels(m_depthColorArr);
        m_depthTexture.Apply();
        return(m_depthTexture);
    }
Exemplo n.º 2
0
    /// <summary>
    /// Update the mesh m_vertices and m_triangles
    /// separated computation into different frame.
    /// </summary>
    private void _UpdateMesh()
    {
        if (m_frameCounter == 0)
        {
            DepthProvider.GetLatestFrame(ref m_depthArr_int, ref m_timeStamp);
            if (m_prevTimestamp == m_timeStamp)
            {
                return;
            }
            m_prevTimestamp = m_timeStamp;

            // convert the compressed int array to z meters array
            _GetZFromRaw(ref m_depthMeter, m_depthArr_int);
            m_frameCounter++;
            return;
        }

        if (m_frameCounter == 1)
        {
            int   vertexCounter = 0;
            float xd            = m_screenWidth / m_traverseWidth;
            float yd            = m_screenHeight / m_traverseHeight;
            for (int i = 0; i < m_traverseHeight; i++)
            {
                for (int j = 0; j < m_traverseWidth; j++)
                {
                    m_vertices[vertexCounter] =
                        m_camObj.camera.ScreenToWorldPoint(new Vector3(j * (float)xd,
                                                                       i * (float)yd,
                                                                       m_depthMeter[(i * m_stepSize * m_texWidth) + (j * m_stepSize)]));
                    vertexCounter++;
                }
            }
            m_frameCounter++;
            return;
        }

        if (m_frameCounter == 2)
        {
            int w = m_traverseWidth - 1;
            int h = m_traverseHeight - 1;

            int triCounter = 0;
            int len        = 6 * w * h;
            for (int i = 0; i < len; i++)
            {
                m_triangles[i] = 0;
            }
            for (int i = 0; i < h; i++)
            {
                for (int j = 0; j < w; j++)
                {
                    // w + 1 is the real width of m_vertices
                    // vertex index map
                    // 1 3
                    // 0 2
                    int index0 = (i * m_stepSize * m_texWidth) + (j * m_stepSize);
                    int index1 = ((i + 1) * m_stepSize * m_texWidth) + (j * m_stepSize);
                    int index2 = (i * m_stepSize * m_texWidth) + ((j + 1) * m_stepSize);
                    int index3 = ((i + 1) * m_stepSize * m_texWidth) + ((j + 1) * m_stepSize);

                    // triangle 1
                    float distance = Mathf.Abs(m_depthMeter[index0] - m_depthMeter[index1]);
                    distance += Mathf.Abs(m_depthMeter[index0] - m_depthMeter[index2]);
                    distance += Mathf.Abs(m_depthMeter[index1] - m_depthMeter[index2]);
                    if (m_depthMeter[index0] > m_depthDistThreshold &&
                        m_depthMeter[index1] > m_depthDistThreshold &&
                        m_depthMeter[index2] > m_depthDistThreshold &&
                        distance < m_neighborDistThreshold)
                    {
                        m_triangles[triCounter]     = (i * (w + 1)) + j;
                        m_triangles[triCounter + 1] = ((i + 1) * (w + 1)) + j;
                        m_triangles[triCounter + 2] = (i * (w + 1)) + (j + 1);
                    }

                    // triangle 2
                    distance  = 0.0f;
                    distance += Mathf.Abs(m_depthMeter[index1] - m_depthMeter[index2]);
                    distance += Mathf.Abs(m_depthMeter[index2] - m_depthMeter[index3]);
                    distance += Mathf.Abs(m_depthMeter[index1] - m_depthMeter[index3]);
                    if (m_depthMeter[index1] > m_depthDistThreshold &&
                        m_depthMeter[index3] > m_depthDistThreshold &&
                        m_depthMeter[index2] > m_depthDistThreshold &&
                        distance < m_neighborDistThreshold)
                    {
                        m_triangles[triCounter + 3] = ((i + 1) * (w + 1)) + j;
                        m_triangles[triCounter + 4] = ((i + 1) * (w + 1)) + (j + 1);
                        m_triangles[triCounter + 5] = (i * (w + 1)) + (j + 1);
                    }
                    triCounter += 6;
                }
            }
            m_frameCounter++;
            return;
        }
        if (m_frameCounter == 3)
        {
            // update the m_vertices
            m_mesh.vertices  = m_vertices;
            m_mesh.triangles = m_triangles;
            m_mesh.RecalculateBounds();
            m_mesh.RecalculateNormals();
            m_mesh.SetIndices(m_triangles, m_renderMode, 0);
            _UpdateTexture();
            m_frameCounter = 0;
        }
    }