FindClosestPoint() public method

Finds the closest point from a point cloud to a position on screen. NOTE: This is slow because it looks at every single point in the point cloud. Avoid calling this more than once a frame.
public FindClosestPoint ( Camera cam, Vector2 pos, int maxDist ) : int
cam Camera The current camera.
pos Vector2 Position on screen (in pixels).
maxDist int The maximum pixel distance to allow.
return int
コード例 #1
0
    /// <summary>
    /// Wait for the next depth update, then find the nearest point in the point
    /// cloud.
    /// </summary>
    /// <param name="touchPosition">Touch position on the screen.</param>
    /// <returns>Coroutine IEnumerator.</returns>
    private IEnumerator _WaitForDepth(Vector2 touchPosition)
    {
        m_waitingForDepth = true;

        // Turn on the camera and wait for a single depth update
        m_tangoApplication.SetDepthCameraRate(
            TangoEnums.TangoDepthCameraRate.MAXIMUM);
        while (m_waitingForDepth)
        {
            yield return(null);
        }

        m_tangoApplication.SetDepthCameraRate(
            TangoEnums.TangoDepthCameraRate.DISABLED);

        Camera cam        = Camera.main;
        int    pointIndex = m_pointCloud.FindClosestPoint(cam, touchPosition, 10);

        if (pointIndex > -1)
        {
            // Index is valid
            m_startPoint = m_endPoint;
            m_endPoint   = m_pointCloud.m_points[pointIndex];

            m_distance = Vector3.Distance(m_startPoint, m_endPoint);
        }
    }
コード例 #2
0
    void placeObject(Vector2 touchPosition, int k)
    {
        // Find the plane.
        Camera  cam = Camera.main;
        Vector3 planeCenter;
        Plane   plane;
        int     index = m_pointCloud.FindClosestPoint(cam, touchPosition, 30);

//		if (!m_pointCloud.FindPlane(cam, touchPosition, out planeCenter, out plane))
//		{
//			Debug.Log("cannot find plane.");
//			return;
//		}
//
        if (index == -1)
        {
            print("cannot find surface");
            return;
        }

        //m_Index.text = "Index at " + m_pointCloud.m_points [index];
        Vector3 pointIndex = m_pointCloud.m_points [index];


        GameObject marker = Instantiate(m_marker, pointIndex, Quaternion.identity);

        m_Index.text            = "d: " + marker.transform.position;
        marker.transform.parent = markersObj.transform;
        marker.tag = tags[k];
        markers.Add(marker);
        if (k < 5)
        {
            setMindMapReferenceColor(k + 1);
        }
    }
コード例 #3
0
ファイル: EdgeTest.cs プロジェクト: minz95/TangoEdgeSpanning
    /// <summary>
    /// Wait for the next depth update, then find the nearest edge in the point
    /// cloud.
    /// </summary>
    /// <param name="touchPosition">Touch position on the screen.</param>
    /// <returns>Coroutine IEnumerator.</returns>
    private IEnumerator _WaitForDepth(Vector2 touchPosition)
    {
        m_waitingForDepth = true;

        // Turn on the camera and wait for a single depth update
        m_tangoApplication.SetDepthCameraRate(
            TangoEnums.TangoDepthCameraRate.MAXIMUM);
        while (m_waitingForDepth)
        {
            yield return(null);
        }

        m_tangoApplication.SetDepthCameraRate(
            TangoEnums.TangoDepthCameraRate.DISABLED);

        m_camera = Camera.main;
        int pointIndex = m_pointCloud.FindClosestPoint(m_camera, touchPosition, 10);

        if (pointIndex > -1)
        {
            m_currTouch = m_pointCloud.m_points[pointIndex];
            //_RenderCustomize(m_currTouch, new Vector3(m_currTouch[0] + 0.005f, m_currTouch[1], m_currTouch[2]));
            Debug.Log("<<<<<<<<<<<<<<<< mouse position: " + m_currTouch[0] + ", " + m_currTouch[1] + ", " + m_currTouch[2]);
        }

        TangoSupport.TangoSupportEdge[] edges;
        int  num_edges;
        bool edgeResult = m_pointCloud.FindEdges(m_imagebuffer, m_camera, touchPosition,
                                                 out edges, out num_edges);

        Debug.Log("<<<<<<<<<<< Edge result: " + edgeResult);

        if (edgeResult == true)
        {
            m_edgeCount    = num_edges;
            m_startPoint   = new Vector3[num_edges];
            m_endPoint     = new Vector3[num_edges];
            m_nearestPoint = new Vector3[num_edges];
            for (int i = 0; i < num_edges; i++)
            {
                Debug.Log("<<<<<<<<< starting point's x: " + edges[i].end_points_x1);
                m_startPoint[i] = new Vector3(edges[i].end_points_x1,
                                              edges[i].end_points_y1,
                                              edges[i].end_points_z1);
                Debug.Log("<<<<<<<<<< " + m_startPoint[i][0] + ", " + m_startPoint[i][1] + ", " + m_startPoint[i][2]);
                m_endPoint[i] = new Vector3(edges[i].end_points_x2,
                                            edges[i].end_points_y2,
                                            edges[i].end_points_z2);
                Debug.Log("<<<<<<<<<< " + m_endPoint[i][0] + ", " + m_endPoint[i][1] + ", " + m_endPoint[i][2]);
                m_nearestPoint[i] = new Vector3(edges[i].closest_point_on_edge_x,
                                                edges[i].closest_point_on_edge_y,
                                                edges[i].closest_point_on_edge_z);
                Debug.Log("<<<<<<<<<< " + m_nearestPoint[i][0] + ", " + m_nearestPoint[i][1] + ", " + m_nearestPoint[i][2]);
            }
            _RenderLine();
        }
    }
コード例 #4
0
    // Free hand drawing -begin
    public void DrawOnScreenFunction()
    {
        if (Input.touchCount == 1)
        {
            Touch   Pen         = Input.GetTouch(0);
            Vector2 guiPosition = new Vector2(Pen.position.x, Screen.height - Pen.position.y);
            Camera  cam         = Camera.main;
            if (showTextArea.Contains(guiPosition) || buttonArea.Contains(guiPosition))
            {
                return;
            }

            int closestIndex = m_pointCloud.FindClosestPoint(cam, Pen.position, TAP_PIXEL_TOLERANCE);
            if (closestIndex < 0)
            {
                return;
            }
            float closestDepth = cam.WorldToScreenPoint(m_pointCloud.m_points [closestIndex]).z;
            Ray   touchRay     = cam.ScreenPointToRay(new Vector3(Pen.position [0], Pen.position [1], 0));
            penDrawPos0 = touchRay.origin + (touchRay.direction * closestDepth);

            if (Pen.phase == TouchPhase.Moved)
            {
                penDrawPos.Add(penDrawPos0);

                if (penDrawPos.Count >= 2)
                {
                    Vector3 penPos1 = penDrawPos[penDrawPos.Count - 1];
                    Vector3 penPos2 = penDrawPos[penDrawPos.Count - 2];

                    GameObject lineMaterial = (GameObject)Instantiate(GameObject.Find("Line"));
                    var        lineRendered = lineMaterial.GetComponent <LineRenderer> ();
                    lineRendered.SetPosition(0, penPos1);
                    lineRendered.SetPosition(1, penPos2);
                    penDraw.Add(lineMaterial);
                }
            }
        }
        else
        {
            penDrawPos.Clear();
        }
    }
コード例 #5
0
    void Update()
    {
        if (Input.touchCount > 0)
        {
            var touch = Input.GetTouch(0);
            var indexOfClosestPoint = tangoPointCloud.FindClosestPoint(Camera.main, touch.position, 500);              // Returns -1 if not found

            if (indexOfClosestPoint != -1)
            {
                var closestPoint = tangoPointCloud.m_points [indexOfClosestPoint];
                var showDragLine = MainMenuController.GetEdgeDetectionMode() == "DRAG";
                if (!_hasStartPoint)
                {
                    _hasStartPoint = true;
                    _firstCorner   = closestPoint;
                    if (showDragLine)
                    {
                        StartLine(closestPoint);
                    }
                }
                _oppositeCorner = closestPoint;
                if (showDragLine)
                {
                    ExtendLine(closestPoint);
                }
            }
            if (touch.phase == TouchPhase.Stationary)
            {
                _stationaryCount++;
            }
            if (touch.phase == TouchPhase.Ended || touch.phase == TouchPhase.Canceled || _stationaryCount > 100)
            {
                _stationaryCount = 0;
                line.SetActive(false);
                if (_hasStartPoint)
                {
                    _hasStartPoint = false;
                    HandleTouch(touch.position);
                }
            }
        }
    }
コード例 #6
0
    /// <summary>
    /// Updates the active placed location.
    /// </summary>
    private void _UpdatePlacedLocation()
    {
        if (Input.touchCount != 1)
        {
            return;
        }

        Touch t = Input.GetTouch(0);

        if (t.phase != TouchPhase.Began)
        {
            return;
        }

        Camera cam          = m_arScreen.m_renderCamera;
        int    closestIndex = m_pointCloud.FindClosestPoint(cam, t.position, TAP_PIXEL_TOLERANCE);

        if (closestIndex < 0)
        {
            return;
        }

        if (m_placedLocation)
        {
            m_placedLocation.SendMessage("Hide");
        }

        float   closestDepth = cam.WorldToScreenPoint(m_pointCloud.m_points[closestIndex]).z;
        Ray     touchRay     = cam.ScreenPointToRay(new Vector3(t.position[0], t.position[1], 0));
        Vector3 pos          = touchRay.origin + (touchRay.direction * closestDepth);

        Vector3 rot = cam.transform.eulerAngles;

        rot[0]           = rot[2] = 0;
        m_placedLocation = (GameObject)Instantiate(m_prefabLocation, pos, Quaternion.Euler(rot));
    }
コード例 #7
0
    /// <summary>
    /// Wait for the next depth update, then find the nearest point in the point
    /// cloud.
    /// </summary>
    /// <param name="touchPosition">Touch position on the screen.</param>
    /// <returns>Coroutine IEnumerator.</returns>
    private IEnumerator _WaitForDepth(Vector2 touchPosition)
    {
        m_waitingForDepth = true;

        // Turn on the camera and wait for a single depth update
        m_tangoApplication.SetDepthCameraRate(
            TangoEnums.TangoDepthCameraRate.MAXIMUM);
        while (m_waitingForDepth)
        {
            yield return(null);
        }

        m_tangoApplication.SetDepthCameraRate(
            TangoEnums.TangoDepthCameraRate.DISABLED);

        Camera cam        = Camera.main;
        int    pointIndex = m_pointCloud.FindClosestPoint(cam, touchPosition, 10);

        if (pointIndex > -1)
        {   // Index is valid
            if (screenTaps == 0)
            {
                m_point0 = m_pointCloud.m_points [pointIndex];
                Debug.Log(m_point0);
            }
            else if (screenTaps == 1)
            {
                m_point1 = m_pointCloud.m_points [pointIndex];
                Debug.Log(m_point1);
            }
            else if (screenTaps == 2)
            {
                m_point2 = m_pointCloud.m_points [pointIndex];
                Debug.Log(m_point2);
            }
            else
            {
                m_point3 = m_pointCloud.m_points [pointIndex];
                Debug.Log(m_point3);
                m_distance23 = Vector3.Distance(m_point2, m_point3);

                createCube(m_point0, m_distance01, m_distance23, m_distance12);
            }
        }
        //    m_startPoint = m_endPoint;
        //  m_point1 = m_pointCloud.m_points [pointIndex];
        //     m_endPoint = m_pointCloud.m_points[pointIndex];

        m_distance12 = Vector3.Distance(m_point1, m_point2);
        m_distance01 = Vector3.Distance(m_point0, m_point1);


        //  m_distance34 = Vector3.Distance(m_point3, m_point4);



        screenTaps = screenTaps + 1;
        Debug.Log(screenTaps);



        //  insertModel (m_point0, "modern_armchair");
    }
コード例 #8
0
    /// <summary>
    /// Wait for the next depth update, then find the plane at the touch position.
    /// </summary>
    /// <returns>Coroutine IEnumerator.</returns>
    /// <param name="touchPosition">Touch position to find a plane at.</param>
    /// <param name="doorCorridorPosition">Door position where to put the door marker.</param>
    /// <param name="wall">Touch position to find a plane at.</param>
    /// <param name="doorCorridorBool">True if we are putting a door marker.</param>
    private IEnumerator _WaitForDepthAndFindPlane(Vector2 touchPosition, Vector3 doorCorridorPosition = new Vector3(), Wall wall = null,
                                                  bool doorCorridorBool = false)
    {
        if (!doorCorridorBool)
        {
            if (m_currentMarkType == 1 || m_currentMarkType == 2)
            {
                AndroidHelper.ShowAndroidToastMessage("Door or corridors must be on walls");
                yield break;
            }
        }

        m_findPlaneWaitingForDepth = true;

        // Turn on the camera and wait for a single depth update.
        m_tangoApplication.SetDepthCameraRate(TangoEnums.TangoDepthCameraRate.MAXIMUM);
        while (m_findPlaneWaitingForDepth)
        {
            yield return(null);
        }

        m_tangoApplication.SetDepthCameraRate(TangoEnums.TangoDepthCameraRate.DISABLED);

        // Find the plane.
        Camera  cam = Camera.main;
        Vector3 planeCenter;
        Plane   plane;

        // If I'm selecting the floor, set the floor plane
        if (m_currentMarkType == 3)
        {
            if (!m_pointCloud.FindPlane(cam, touchPosition, out planeCenter, out plane))
            {
                yield break;
            }
            m_pointCloud.FindFloor();
            floor = new Floor(plane, planeCenter);
            Debug.Log("Height of the floor " + planeCenter.y);
            AndroidHelper.ShowAndroidToastMessage("Floor found!");
            yield break;
        }
        else if (!m_pointCloud.m_floorFound)
        {
            AndroidHelper.ShowAndroidToastMessage("Please, select first the floor");
            yield break;
        }

        // Find me the point I touched on screen on world coordinates if I'm not putting a door...
        if (!doorCorridorBool)
        {
            int i = m_pointCloud.FindClosestPoint(cam, touchPosition, 10);
            if (i < 0)
            {
                yield break;
            }
            planeCenter = m_pointCloud.m_points [i];

            // Put the marker on the floor height
            planeCenter.y = floor.floorCenter.y;
        }         //... else my door position is already set as parameter.
        else
        {
            planeCenter = doorCorridorPosition;
        }

        // Ensure the location is always facing the camera.  This is like a LookRotation, but for the Y axis.
        Vector3 up = floor.floorPlane.normal;
        Vector3 forward;

        if (Vector3.Angle(floor.floorPlane.normal, cam.transform.forward) < 175)
        {
            Vector3 right = Vector3.Cross(up, cam.transform.forward).normalized;
            forward = Vector3.Cross(right, up).normalized;
        }
        else
        {
            // Normal is nearly parallel to camera look direction, the cross product would have too much
            // floating point error in it.
            forward = Vector3.Cross(up, cam.transform.right);
        }

        // Instantiate marker object.
        newMarkObject = Instantiate(m_markPrefabs [m_currentMarkType],
                                    planeCenter,
                                    Quaternion.LookRotation(forward, up)) as GameObject;
        newMarkObject.tag = "CornersAndWalls";

        ARMarker markerScript = newMarkObject.GetComponent <ARMarker> ();

        markerScript.m_type      = m_currentMarkType;
        markerScript.m_timestamp = (float)m_poseController.LastPoseTimestamp;

        Matrix4x4 uwTDevice = Matrix4x4.TRS(m_poseController.transform.position,
                                            m_poseController.transform.rotation,
                                            Vector3.one);
        Matrix4x4 uwTMarker = Matrix4x4.TRS(newMarkObject.transform.position,
                                            newMarkObject.transform.rotation,
                                            Vector3.one);

        markerScript.m_deviceTMarker = Matrix4x4.Inverse(uwTDevice) * uwTMarker;

        m_markerList.Add(newMarkObject);

        prevTouchPos     = null;
        selectedLine     = null;
        m_selectedMarker = null;

        switch (m_currentMarkType)
        {
        // Corner case.
        case 0:
            corners.Add(new Corner(newMarkObject));
            break;

        // Door case.
        case 1:
            TouchScreenKeyboard kb = TouchScreenKeyboard.Open("", TouchScreenKeyboardType.Default, false, false, false, false,
                                                              "Write the name for this destination marker");
            while (!kb.done && !kb.wasCanceled)
            {
                yield return(null);
            }
            newMarkObject.name = kb.text;
            doors.Add(new Corner(newMarkObject, wall));
            break;

        default:
            Debug.Log("No valid point inserted.");
            break;
        }
    }