ARfoundaction放置指示器停留在一个位置,而不是与相机一起移动

我正在使用ArFoundation构建一个将对象放置在地平面上的应用程序。我为此目的构建了一个放置指示器,但是我面临的问题是它是第一次生成,但是指示器并没有随相机一起移动。有人可以帮我吗。在下面提供我的代码。我仅使用android进行了测试。

我还创建了一个功能,可以将对象放置在水龙头上,这也不起作用

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.Experimental.XR;
using System;

public class ArTapToPlace : MonoBehaviour
{
    public GameObject objectToPlace;
    public GameObject placementIndicator;

    private ARSessionOrigin arOrigin;
    private Pose placementPose;
    private bool placementPoseIsValid = false;

    void Start()
    {
        arOrigin = FindObjectOfType<ARSessionOrigin>();
    }

    void Update()
    {
        UpdatePlacementPose();
        UpdatePlacementIndicator();

        if (placementPoseIsValid && Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began)
        {
            PlaceObject();
        }
    }

    private void PlaceObject()
    {
        Instantiate(objectToPlace,placementPose.position,placementPose.rotation);
    }

    private void UpdatePlacementIndicator()
    {
        print(placementIndicator);
        if (placementPoseIsValid)
        {
            placementIndicator.Setactive(true);
            placementIndicator.transform.SetPositionAndRotation(placementPose.position,placementPose.rotation);
        }
        else
        {
            placementIndicator.Setactive(false);
        }
    }

    private void UpdatePlacementPose()
    {
        var screenCenter = Camera.current.ViewportToScreenPoint(new Vector3(0.5f,0.5f));
        var hits = new List<ARRaycastHit>();
        arOrigin.getcomponent<ARRaycastManager>().Raycast(screenCenter,hits,UnityEngine.XR.ARSubsystems.TrackableType.Planes);
        print(hits.Count);
        print(hits);


        placementPoseIsValid = hits.Count > 0;
        if (placementPoseIsValid)
        {
            placementPose = hits[0].pose;

            var cameraForward = Camera.current.transform.forward;
            var cameraBearing = new Vector3(cameraForward.x,cameraForward.z).normalized;
            placementPose.rotation = Quaternion.LookRotation(cameraBearing);
        }
    }
}
wudan713 回答:ARfoundaction放置指示器停留在一个位置,而不是与相机一起移动

这可能与该行有关

var cameraForward = Camera.current.transform.forward;

Camera.current(几乎)仅用于后处理,并且仅在渲染期间设置:

  

大多数情况下,您将要使用Camera.main。仅在实现以下事件之一时使用此功能:MonoBehaviour.OnRenderImageOnPreRenderOnPostRender

因此,您宁愿使用Camera.main,它是场景的当前主摄像机。

var cameraForward = Camera.main.transform.forward;

一般而言,此调用非常昂贵,因此您应将其存储在应用启动时并重用引用

  

此属性在内部使用FindGameObjectsWithTag,并且不缓存结果。如果每帧多次使用Camera.main的返回值,建议将其缓存。

并且我会将文档扩展为“ ...如果多次使用。”

// If possible already reference it via the Inspector
[SerializeField] private Camera _camera;

private void Awake()
{
    // otherwise get it once on runtime
    if(!_camera) _camera = Camera.main;
}

...

var cameraForward = _camera.transform.forward;
本文链接:https://www.f2er.com/3154233.html

大家都在问