夹紧Vuforia AR相机中的对象轴

时间:2019-02-19 23:09:21

标签: c# unity3d

screenshot here我想将Y轴夹在立方体上。我可以在Unity相机中做到这一点。但是,当我在Vuforia相机中使用它时,它无法正确反应。 我的问题是立方体跟随摄像机。我希望多维数据集保持其位置,而忽略AR摄像机的位置。我感觉这与WorldtoViewpoint有关,但我无法弄清楚。你能教我怎么做吗?谢谢

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ClampMovementController : MonoBehaviour
{


    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {

        Vector3 pos = transform.localPosition;
        pos.y = Mathf.Clamp(transform.position.y, 0f, 0f);
        transform.localPosition = pos;
    }

}  

2 个答案:

答案 0 :(得分:1)

这是我的解决方案: 其实它很简单。不正确的概念是我的对象附着在AR相机上,因此,对象位置始终与相机位置相关。现在。为了使对象停留在其位置。我需要获取其localPosition。第一。将本地位置存储在Vector3 pos中。然后在Vector3 pos上进行修改。最后,将新值重新分配给对象的本地位置。

public class ClampMovementController : MonoBehaviour
{
    public float currentPos;
    public GameObject capsule;

    void Update()
    {
        //store the value of object localPosition
        Vector3 pos = capsule.transform.localPosition;
        //modification on the value
        pos.y = Mathf.Clamp(pos.y, currentPos, currentPos);
        //rerassign the new value to the object localPosition
        capsule.transform.localPosition = pos;
    }

}

答案 1 :(得分:0)

首先,您的立方体随摄影机一起移动,因为您的图像目标是ARCamera的子级。因此,当您移动摄像机图像目标时,立方体也将移动。确保您的ImageTarget没有父母。

我不明白您为什么必须锁定Y轴上的任何运动。我猜您在移动物体时,精益接触在做错事。我没有使用精益触摸,但是我已经通过键盘输入实现了它。您可以通过修改以下脚本将其转换为倾斜触摸。只需将以下行添加到您的ImageTarget的{​​{1}}脚本中:

DefaultTrackableEventHandler

然后创建一个//Variables for getting capsule and checking if ImageTarget is tracked private bool isTracked = false; private GameObject capsule; 方法来从用户那里获取输入。

Update

如您所见,Y轴没有运动,因为我使用了向前,向左和向右矢量来确保仅在X和Y轴上运动。

最后,您必须确保 void Update() { if(isTracked) { if(Input.GetKey(KeyCode.W)) { //using forward for moving object in z axis only. //Also using local position since you need movement to be relative to image target //Global forward can be very different depending on your World Center Mode capsule.transform.localPosition += Vector3.forward * Time.deltaTime; } else if (Input.GetKey(KeyCode.S)) { capsule.transform.localPosition -= Vector3.forward * Time.deltaTime; } if (Input.GetKey(KeyCode.A)) { //Using Vector3.left and right to be make sure movement is in X axis. capsule.transform.localPosition += Vector3.left * Time.deltaTime; } else if (Input.GetKey(KeyCode.D)) { capsule.transform.localPosition += Vector3.right * Time.deltaTime; } } } 已更新。为此,您必须在isTracked方法中添加isTracked = false;,并在OnTrackingLost方法中添加isTracked = true;。祝你好运!