Unity3d ARfoundaction放置指示器停留在一个位置,而不是随摄像机移动

Unity3d ARfoundaction放置指示器停留在一个位置,而不是随摄像机移动,unity3d,augmented-reality,arkit,android-augmented-reality,Unity3d,Augmented Reality,Arkit,Android Augmented Reality,我正在构建一个应用程序,使用arfoundation将对象放置在地平面上。为此,我构建了一个放置指示器,但我面临的问题是,它是第一次生成的,但指示器没有随着我的相机移动。谁能帮我一下吗。在下面提供我的代码。我只使用android进行了测试 我还创建了一个函数,用于将对象放置在水龙头上,这也不起作用 使用系统集合; 使用System.Collections.Generic; 使用UnityEngine; 使用UnityEngine.XR.ARFoundation; 使用UnityEngine.Ex

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

我还创建了一个函数,用于将对象放置在水龙头上,这也不起作用

使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
使用UnityEngine.XR.ARFoundation;
使用UnityEngine.Experimental.XR;
使用制度;
公共类艺术场所:单一行为
{
公共游戏对象objectToPlace;
公共游戏对象放置指示器;
私人纵火;
私人姿势放置姿势;
private bool placementPoseIsValid=false;
void Start()
{
arOrigin=FindObjectOfType();
}
无效更新()
{
UpdatePlacementPose();
UpdatePlacementIndicator();
if(placementPoseIsValid&&Input.touchCount>0&&Input.GetTouch(0.phase==TouchPhase.Start)
{
PlaceObject();
}
}
私有void PlaceObject()
{
实例化(objectToPlace、placementPose.position、placementPose.rotation);
}
私有void UpdatePlacementIndicator()
{
打印(位置指示器);
如果(placementPoseIsValid)
{
placementIndicator.SetActive(真);
placementIndicator.transform.SetPositionAndRotation(placementPose.position,placementPose.rotation);
}
其他的
{
placementIndicator.SetActive(设置激活)(假);
}
}
私有void UpdatePlacementPose()
{
var screenCenter=Camera.current.ViewportToScreenPoint(新矢量3(0.5f,0.5f));
var hits=新列表();
arOrigin.GetComponent().Raycast(屏幕中心、点击、UnityEngine.XR.ARSubsystems.TrackableType.Planes);
打印(点击次数);
打印(点击次数);
placementPoseIsValid=hits.Count>0;
如果(placementPoseIsValid)
{
placementPose=点击次数[0]。姿势;
var camerafroward=Camera.current.transform.forward;
var cameraBearing=新矢量3(camerafroward.x,0,camerafroward.z)。标准化;
placementPose.rotation=四元数.LookRotation(cameraBearing);
}
}
}

这可能与线路有关

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

大多数情况下,你会想用它来代替。仅在实现以下事件之一时使用此函数:

因此,您更希望使用当前场景的主摄影机

var camerafroward=Camera.main.transform.forward;

一般来说,此调用非常昂贵,因此您应该将其存储在app start上,并重用引用

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

我会将文档扩展到“…如果它被多次使用。”

//如果可能,已经通过检查器引用了它
[SerializeField]专用摄像头(U摄像头);
私人空间
{
//否则在运行时获取一次
如果(!\u camera)\u camera=camera.main;
}
...
var cameraForward=_camera.transform.forward;

这可能与线路有关

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

大多数情况下,你会想用它来代替。仅在实现以下事件之一时使用此函数:

因此,您更希望使用当前场景的主摄影机

var camerafroward=Camera.main.transform.forward;

一般来说,此调用非常昂贵,因此您应该将其存储在app start上,并重用引用

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

我会将文档扩展到“…如果它被多次使用。”

//如果可能,已经通过检查器引用了它
[SerializeField]专用摄像头(U摄像头);
私人空间
{
//否则在运行时获取一次
如果(!\u camera)\u camera=camera.main;
}
...
var cameraForward=_camera.transform.forward;

id猜测它会用updateplacementindicator覆盖每个帧,updateplacementindicator将位置设置为placementpose.position,并且似乎不会更新为任何新的值。。如果你想让它保持相对位置,为什么不将其设置为父对象。你看到你的placementIndicator游戏对象在移动吗?我猜它会用updateplacementindicator覆盖每一帧,updateplacementindicator将位置设置为placementpose.position,并且似乎不会更新为任何新的值。。如果你想让它保持相对性,为什么不把它作为父对象呢。你看到你的placementIndicator游戏对象在移动吗?