如何使面板显示在镜头前

时间:2019-07-24 19:25:20

标签: c# unity3d virtual-reality

我有一个项目,我单击一个对象,然后画布会显示出来,供玩家选择画布内的一个选项。我需要将画布设置为世界空间,以便玩家可以移动其头部,并且画布在前面保持静止。问题是场景周围有很多物体,每次玩家单击一个物体时,我都需要更新画布的位置。

我尝试使用“ transform.position”,但是它不能按照我想要的方式工作。

obs: painel_escolha =带面板的帆布; transform_tela =相机。

  painel_escolha.transform.position = transform_tela.transform.position;

2 个答案:

答案 0 :(得分:0)

使用它可以将画布/面板移动到相机前面,使其面向相机

// move the canvas distance meters in front of the camera
painel_escolha.transform.position = transform_tela.position + transform_tela.transform.forward * distance;
// make the canvas point in the same direction as the camera
painel_escolha.transform.rotation = transform_tela.transform.rotation;

LateUpdate中执行此操作(!因此,在用户输入以及位置和旋转更改得到处理之后)使您的面板绝对头部稳定,这意味着它始终位于用户的前面,他可以基本上不会移开视线。

通常,您宁愿使用某种平滑的拖拉方法,例如做

[Range(0,1)]
public float interpolationRatePosition = 0.5f;

[Range(0,1)]
public float interpolationRateRotation = 0.5f;

privtae Vector3 lastPosition;
private Quaternion lastRotation;

privtae void LateUpdate()
{
    painel_escolha.transform.position = Vector3.Lerp(painel_escolha.transform.position, transform_tela.position, interpolationRatePosition);

    painel_escolha.transform.rotation = Quaterinon.Lerp(painel_escolha.transform.rotation, transform_tela.rotation, interpolationRateRotation);
} 

此结果基本上位于相同的最终位置,但看起来更平滑。

答案 1 :(得分:0)

画布位置基本上是2D屏幕位置。您可以使用transform.position获取被点击对象的世界位置,但是要使画布元素指向该对象(位于其顶部),您需要通过https://docs.unity3d.com/ScriptReference/Camera.WorldToScreenPoint.html

将该世界位置转换为屏幕位置