C# ARSessionOrigin变换位置和旋转,使创建的ArtrackDimage变为单位空间零

C# ARSessionOrigin变换位置和旋转,使创建的ArtrackDimage变为单位空间零,c#,unity3d,augmented-reality,C#,Unity3d,Augmented Reality,我正在使用带有跟踪图像的ARFoundation(图像库只有一个图像可供查找)。 当图像被找到时,我将订阅该事件 [SerializeField] ARTrackedImageManager _arTrackedImageManager; void Awake() { _arTrackedImageManager.trackedImagesChanged += ImageChangedHandle; } void ImageChangedHandle(ARTrackedImagesC

我正在使用带有跟踪图像的
ARFoundation
(图像库只有一个图像可供查找)。 当图像被找到时,我将订阅该事件

[SerializeField]
ARTrackedImageManager _arTrackedImageManager;

void Awake()
{
    _arTrackedImageManager.trackedImagesChanged += ImageChangedHandle;
}

void ImageChangedHandle(ARTrackedImagesChangedEventArgs imgChangedArgs)
{
    foreach (var item in imgChangedArgs.added)
    {
        var go = item.gameObject;

        _arkitChecker.DisplayFoundTrackedImage(item);
    }
}
_arkitChecker是具有DisplayFoundTrackeImage方法的我的类的实例:

internal void DisplayFoundTrackedImage(ARTrackedImage targetImageGameObject)
{
    var arOrig = GameObject.FindObjectOfType<ARSessionOrigin>();

    arOrig.transform.Translate(-targetImageGameObject.transform.position, Space.World);

    float babyAngle;
    Vector3 babyAxis;
    targetImageGameObject.transform.rotation.ToAngleAxis(out babyAngle, out babyAxis);

    arOrig.transform.RotateAround(Vector3.zero, babyAxis, -babyAngle);
}

我只需要解决同样的问题,我能够使用
ARSessionOrigin
MakeContentAppearAt()
方法,使用跟踪图像的位置和旋转(我使用的是ARFoundation v3.0.0 preview 4)

该方法没有很好的文档记录,经过一些尝试和错误,我发现您需要使用跟踪图像的
localRotation
,而不是世界空间
rotation
,否则方向将不正确

无论何时找到或更新跟踪的图像,我都会运行以下操作:

void onTrackedImageSchangedEventArgs(ArtrackDimagesSchangedEventArgs)
{
如果(eventArgs.updated.Count>0)
{
ARTRACKDIMAGE trackedImage=eventArgs.updated[0];
arSessionOrigin.MakeContentAppearAt(worldOrigin.transform、TrackeImage.transform.position、TrackeImage.transform.localRotation);
}
}
worldOrigin.transform
只是一个位于位置0,0,0的空游戏对象,没有旋转

因此,这段代码的意思是:我希望worldOrigin变换通过调整AR相机的变换进行补偿(worldOrigin.transform未修改),使其看起来好像位于轨迹图像位置/旋转处

arOrig.MakeContentAppearAt(targetImageGameObject.transform, Vector3.zero, Quaternion.identity);