我正在使用 Unity、Vuforia 和 HoloLens 开发 AR 应用程序。我的目标是在相对于 Vuforia 图像目标的特定位置创建一个球体(例如,相对于图像目标的原点的 (1, 2, 3))。
我尝试过的:
手动: 我在 Unity Inspector 中的 (1, 2, 3) 处创建了一个球体作为 Vuforia 图像目标的子项,它出现在正确的位置。 通过脚本:但是,通过脚本创建球体时,其位置与预期不符。
代码: 在我的脚本中,我尝试按如下方式定位球体:
sphere.transform.position = targetTransform.position + localPosition;
这里,
targetTransform
是Transform
(Vuforia的目标)的ObserverBehaviour
。尽管如此,与手动放置的球体相比,球体出现在不同的位置。
完整脚本:
这是我的代码中用于创建和定位球体的相关部分:
public class SphereManager
{
private GameObject sphere;
private Vector3 localPosition;
public SphereManager(Vector3 position)
{
localPosition = position;
}
public void CreateSphere(Transform targetTransform)
{
if (sphere == null)
{
sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
sphere.transform.SetParent(targetTransform, false);
sphere.transform.position = targetTransform.position + localPosition;
sphere.transform.localScale = new Vector3(0.5f, 0.5f, 0.5f);
}
}
public void DestroySphere()
{
if (sphere != null)
{
GameObject.Destroy(sphere);
sphere = null;
}
}
public bool IsSphereActive() => sphere != null;
}
以及处理 Vuforia 目标检测的脚本:
public class SphereCreator : MonoBehaviour
{
public Vector3 pose = Vector3.zero;
private SphereManager sphereManager;
private ObserverBehaviour observerBehaviour;
void Start()
{
sphereManager = new SphereManager(pose);
observerBehaviour = GetComponent<ObserverBehaviour>() ?? GetComponentInChildren<ObserverBehaviour>() ?? GetComponentInParent<ObserverBehaviour>();
if (observerBehaviour)
{
observerBehaviour.OnTargetStatusChanged += OnTargetStatusChanged;
}
else
{
Debug.LogWarning("ObserverBehaviour component not found.");
}
}
private void OnTargetStatusChanged(ObserverBehaviour behaviour, TargetStatus targetStatus)
{
if (targetStatus.Status == Status.TRACKED || targetStatus.Status == Status.EXTENDED_TRACKED)
{
sphereManager.CreateSphere(behaviour.transform);
}
else
{
sphereManager.DestroySphere();
}
}
private void OnDestroy()
{
if (observerBehaviour != null)
{
observerBehaviour.OnTargetStatusChanged -= OnTargetStatusChanged;
}
}
}
问题:
通过脚本创建的球体与在检查器中手动放置的球体不一致。我应该如何在脚本中设置球体的位置以确保它与手动放置的球体匹配?
以下行更改球体的世界坐标,但不更改其相对于 Vuforia 图像目标的本地位置。
sphere.transform.Position = targetTransform.position + localPosition;
您可以将其替换为:
sphere.transform.localPosition = targetTransform.position + localPosition;