Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ARCore Unity-触摸/更新帧问题_C#_Unity3d_Augmented Reality_Arcore - Fatal编程技术网

C# ARCore Unity-触摸/更新帧问题

C# ARCore Unity-触摸/更新帧问题,c#,unity3d,augmented-reality,arcore,C#,Unity3d,Augmented Reality,Arcore,我目前正在使用C#中的ARCore和Unity3D创建AR应用程序 我的目标是通过触摸屏幕将两个物体放置在表面上。在获得两个对象之间的距离后,我以编程方式将几个对象放置在两个主要对象之间 代码放在Update()函数中,因为它需要触摸,并且一些按钮需要闪烁 我在技术上成功地实现了它,但问题是update()函数中的Touch在每一帧都被调用,并且会干扰应该更新的块线,即使周围有条件块也会干扰 代码块DrawPoints()创建并显示两个对象“target1”和“target2”之间的对象,它可以

我目前正在使用C#中的ARCore和Unity3D创建AR应用程序

我的目标是通过触摸屏幕将两个物体放置在表面上。在获得两个对象之间的距离后,我以编程方式将几个对象放置在两个主要对象之间

代码放在Update()函数中,因为它需要触摸,并且一些按钮需要闪烁

我在技术上成功地实现了它,但问题是update()函数中的Touch在每一帧都被调用,并且会干扰应该更新的块线,即使周围有条件块也会干扰

代码块DrawPoints()创建并显示两个对象“target1”和“target2”之间的对象,它可以很好地更新并保持不变。但如果我触摸屏幕,它就会消失

if (mIsSecondTargetVisible)
    {
      DrawPoints(target1, target2, Color.red, 0.2f);
    }
我尝试在Update()函数中更改此块的位置,但结果仍然相同

void Update()
{

    _UpdateApplicationLifecycle();

    // Hide snackbar when currently tracking at least one plane.
    Session.GetTrackables<DetectedPlane>(m_AllPlanes);
    bool showSearchingUI = true;
    for (int i = 0; i < m_AllPlanes.Count; i++)
    {
        if (m_AllPlanes[i].TrackingState == TrackingState.Tracking)
        {
            showSearchingUI = false;
            break;
        }
}

SearchingForPlaneUI.SetActive(showSearchingUI);

Touch touch;
if (Input.touchCount < 1 || (touch = Input.GetTouch(0)).phase !=     TouchPhase.Began)
    {
        return;
    }

    TrackableHit hit;
    TrackableHitFlags raycastFilter =     TrackableHitFlags.PlaneWithinPolygon |
        TrackableHitFlags.FeaturePointWithSurfaceNormal;

                          if(!EventSystem.current.IsPointerOverGameObject(touch.fingerId))
    {
        if (Frame.Raycast(touch.position.x, touch.position.y, raycastFilter, out hit))
        {

if ((hit.Trackable is DetectedPlane) &&
                        Vector3.Dot(FirstPersonCamera.transform.position - hit.Pose.position,
  hit.Pose.rotation * Vector3.up) < 0)
 {
 Debug.Log("Hit at back of the current DetectedPlane");
 }
 else
 {

anchor = hit.Trackable.CreateAnchor(hit.Pose);

if (mIsFirsttargetVisible == false){                     
target1 = Instantiate(cubes, hit.Pose.position, hit.Pose.rotation);
target1.transform.localScale = new Vector3(0.02f, 0.001f, 0.02f);
target1.transform.parent = anchor.transform;
mIsFirsttargetVisible = true;                    
}

else if (mIsSecondTargetVisible == false){
target2 = Instantiate(cubes, hit.Pose.position, hit.Pose.rotation);
target2.transform.localScale = new Vector3(0.02f, 0.001f, 0.02f);
target2.transform.parent = anchor.transform;
mIsSecondTargetVisible = true;
              }
            }
        }
    }

if (mIsSecondTargetVisible)
    {
      DrawPoints(target1, target2, Color.red, 0.2f);
    }
}

我解决了我的问题,这里是最后的代码,加上解释。请注意,行块的顺序很重要

void Update()
{

_UpdateApplicationLifecycle();

// Hide snackbar when currently tracking at least one plane.
Session.GetTrackables<DetectedPlane>(m_AllPlanes);
bool showSearchingUI = true;
for (int i = 0; i < m_AllPlanes.Count; i++)
{
    if (m_AllPlanes[i].TrackingState == TrackingState.Tracking)
    {
        showSearchingUI = false;
        break;
    }
}

SearchingForPlaneUI.SetActive(showSearchingUI);


Touch touch;
if (Input.touchCount < 1 || (touch = Input.GetTouch(0)).phase !=     TouchPhase.Began)
{
    return;
}

// Should not handle input if the player is pointing on UI.
if (EventSystem.current.IsPointerOverGameObject(touch.fingerId))
{
    return;
}


if (mIsSecondTargetVisible)
{
    return;
}

TrackableHit hit;
TrackableHitFlags raycastFilter =         TrackableHitFlags.PlaneWithinPolygon |
TrackableHitFlags.FeaturePointWithSurfaceNormal;

if (Frame.Raycast(touch.position.x, touch.position.y, raycastFilter, out hit))
    {

if ((hit.Trackable is DetectedPlane) && Vector3.Dot(FirstPersonCamera.transform.position - hit.Pose.position,
  hit.Pose.rotation * Vector3.up) < 0)
 {
 Debug.Log("Hit at back of the current DetectedPlane");
 }
 else
 {

anchor = hit.Trackable.CreateAnchor(hit.Pose);

if (mIsFirsttargetVisible == false){                     
target1 = Instantiate(cubes, hit.Pose.position, hit.Pose.rotation);
target1.transform.localScale = new Vector3(0.02f, 0.001f, 0.02f);
target1.transform.parent = anchor.transform;
mIsFirsttargetVisible = true;                    
}

else if (mIsSecondTargetVisible == false){
target2 = Instantiate(cubes, hit.Pose.position, hit.Pose.rotation);
target2.transform.localScale = new Vector3(0.02f, 0.001f, 0.02f);
target2.transform.parent = anchor.transform;
mIsSecondTargetVisible = true;
          }
    }
}

if (mIsSecondTargetVisible)
{
  DrawPoints(target1, target2, Color.red, 0.2f);
}
}
关于下面的线框,需要连续显示对象但受到触摸屏Arcore raycast干扰的用户:

if (mIsSecondTargetVisible)
{
  DrawPoints(target1, target2, Color.red, 0.2f);
}
为了避免触摸,我在触摸框光线投射上方添加了此条件:

if (mIsSecondTargetVisible)
{
return;
}

我解决了我的问题,这里是最后的代码,加上解释。请注意,行块的顺序很重要

void Update()
{

_UpdateApplicationLifecycle();

// Hide snackbar when currently tracking at least one plane.
Session.GetTrackables<DetectedPlane>(m_AllPlanes);
bool showSearchingUI = true;
for (int i = 0; i < m_AllPlanes.Count; i++)
{
    if (m_AllPlanes[i].TrackingState == TrackingState.Tracking)
    {
        showSearchingUI = false;
        break;
    }
}

SearchingForPlaneUI.SetActive(showSearchingUI);


Touch touch;
if (Input.touchCount < 1 || (touch = Input.GetTouch(0)).phase !=     TouchPhase.Began)
{
    return;
}

// Should not handle input if the player is pointing on UI.
if (EventSystem.current.IsPointerOverGameObject(touch.fingerId))
{
    return;
}


if (mIsSecondTargetVisible)
{
    return;
}

TrackableHit hit;
TrackableHitFlags raycastFilter =         TrackableHitFlags.PlaneWithinPolygon |
TrackableHitFlags.FeaturePointWithSurfaceNormal;

if (Frame.Raycast(touch.position.x, touch.position.y, raycastFilter, out hit))
    {

if ((hit.Trackable is DetectedPlane) && Vector3.Dot(FirstPersonCamera.transform.position - hit.Pose.position,
  hit.Pose.rotation * Vector3.up) < 0)
 {
 Debug.Log("Hit at back of the current DetectedPlane");
 }
 else
 {

anchor = hit.Trackable.CreateAnchor(hit.Pose);

if (mIsFirsttargetVisible == false){                     
target1 = Instantiate(cubes, hit.Pose.position, hit.Pose.rotation);
target1.transform.localScale = new Vector3(0.02f, 0.001f, 0.02f);
target1.transform.parent = anchor.transform;
mIsFirsttargetVisible = true;                    
}

else if (mIsSecondTargetVisible == false){
target2 = Instantiate(cubes, hit.Pose.position, hit.Pose.rotation);
target2.transform.localScale = new Vector3(0.02f, 0.001f, 0.02f);
target2.transform.parent = anchor.transform;
mIsSecondTargetVisible = true;
          }
    }
}

if (mIsSecondTargetVisible)
{
  DrawPoints(target1, target2, Color.red, 0.2f);
}
}
关于下面的线框,需要连续显示对象但受到触摸屏Arcore raycast干扰的用户:

if (mIsSecondTargetVisible)
{
  DrawPoints(target1, target2, Color.red, 0.2f);
}
为了避免触摸,我在触摸框光线投射上方添加了此条件:

if (mIsSecondTargetVisible)
{
return;
}