我有一个3D模型附加到图像目标。我想要的是根据相机的位置缩放模型,即当我靠近模型时我希望它变得更大,当我走得更远时,它应该变得更小。我搜索了论坛并尝试了两种不同的解决方案: 解决方案1: 我创建了一个脚本并附加到3d模型:
public class AR_Capsule : MonoBehaviour {
float minimumDistance = 0;
float maximumDistance = 3;
float minimumDistanceScale = 0.3f;
float maximumDistanceScale = 0.1f;
void Update()
{
float distance = (transform.position - Camera.main.transform.position).magnitude;
float norm = (distance - minimumDistance) / (maximumDistance - minimumDistance);
norm = Mathf.Clamp01(norm);
Vector3 minScale = Vector3.one * maximumDistanceScale;
Vector3 maxScale = Vector3.one * minimumDistanceScale;
transform.localScale = Vector3.Lerp(maxScale, minScale, norm);
}
}
解决方案2:
public class AR_Capsule : MonoBehaviour {
public float speed = 10f;
void Update()
{
transform.Translate(0, 0,(-1 * Input.acceleration.z * speed * Time.deltaTime));
}
}
当图像目标可见时,两种解决方案都有效。但是当我从视线中丢失目标时,物体保持静止,相机位置始终为(0.0,0.0,0.0)。 你知道为什么当目标丢失时对象会冻结吗? 我正在为Epson Moverio bt-300开发并使用vuforia眼镜样品应用程序。
感谢。
答案 0 :(得分:0)
我发现了这个问题。问题是获得正确的相机位置。由于我使用的是眼镜Camera.main.transform.position
,因此始终会(0,0,0)
。相反,我使用Camera.main.transform.GetChild(1).transform.position
工作正常。以下是工作代码:
initialDist = Vector3.Distance(transform.position, Camera.main.transform.GetChild(1).transform.position);
distance = Vector3.Distance(lastMarkerpos, Camera.main.transform.GetChild(1).transform.position);
if((transform.localScale.x * (initialDist / distance)) > 0.05 && (transform.localScale.x * (initialDist / distance)) < 2)
{
transform.localScale = new Vector3(transform.localScale.x * (initialDist / distance), transform.localScale.y * (initialDist / distance), transform.localScale.z * (initialDist / distance));
}