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;
}
}
答案 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;
。祝你好运!