在 HoloWorld 中调整 Canvas 菜单大小和比例
Adjust Canvas Menu Size and Scale in a HoloWorld
以下脚本应该在世界 space 中放大一个 UI Canvas
菜单,因此当用户走得远时,菜单的大小和比例都会增加,而当用户靠近它时,它按比例缩小。
我们实际上是在尝试将菜单的高度更新为相机的截锥体高度,以便菜单始终正好占据相机视图的垂直高度。
这是解决问题的方法吗?新尺寸与凸轮的截锥体高度不匹配,我们做错了什么?我们已将此脚本放在应用场景中的 HoloLensCamera
...
public class Adjuster : MonoBehaviour
{
public RectTransform _rectTransform;
private float _ratio;
private float _pixPerUnit = 100f;
private Vector3 _gazeOrigin;
private Vector3 _uiOrigin;
private float _frustumHeight;
private float _distance;
public bool _reSizeCanvas;
private Camera _camera;
private float _canvasWidth;
private float _canvasHeight;
private void Start()
{
if (_reSizeCanvas)
{
Vector2 initialSize = _rectTransform.sizeDelta;
_ratio = _rectTransform.rect.width / _rectTransform.rect.height;
}
}
private void LateUpdate()
{
_gazeOrigin = transform.position;
_uiOrigin = _rectTransform.position;
_distance = Vector3.Distance(_gazeOrigin, _uiOrigin);
_frustumHeight = 2.0f * _distance * Mathf.Tan( this.GetComponent<Camera>().fieldOfView * 0.5f * Mathf.Deg2Rad );
_rectTransform.sizeDelta = new Vector2(_ratio * _frustumHeight * _pixPerUnit, _frustumHeight * _pixPerUnit);
}
}
将比率应用于某物时。该比率是根据两件事的比较计算得出的。在这种情况下,你将你和菜单之间的距离与你和菜单之间的基线距离进行比较。所以你需要固定距离来比较你的实际距离。
平截头体实际上是摄像机生成的圆锥体形状(尖端从摄像机开始),它将渲染该圆锥体内部的任何东西。如果您不弄乱相机,它的尺寸将始终相同。如果你想获得平截头体高度,你需要找出物体在那个圆锥体中的位置。然后找出该圆锥体切片的尺寸。
最简单的解决方案;
将平截头体高度排除在外,您的解决方案就非常简单;玩家靠近增加规模。反之亦然
以下脚本应该在世界 space 中放大一个 UI Canvas
菜单,因此当用户走得远时,菜单的大小和比例都会增加,而当用户靠近它时,它按比例缩小。
我们实际上是在尝试将菜单的高度更新为相机的截锥体高度,以便菜单始终正好占据相机视图的垂直高度。
这是解决问题的方法吗?新尺寸与凸轮的截锥体高度不匹配,我们做错了什么?我们已将此脚本放在应用场景中的 HoloLensCamera
...
public class Adjuster : MonoBehaviour
{
public RectTransform _rectTransform;
private float _ratio;
private float _pixPerUnit = 100f;
private Vector3 _gazeOrigin;
private Vector3 _uiOrigin;
private float _frustumHeight;
private float _distance;
public bool _reSizeCanvas;
private Camera _camera;
private float _canvasWidth;
private float _canvasHeight;
private void Start()
{
if (_reSizeCanvas)
{
Vector2 initialSize = _rectTransform.sizeDelta;
_ratio = _rectTransform.rect.width / _rectTransform.rect.height;
}
}
private void LateUpdate()
{
_gazeOrigin = transform.position;
_uiOrigin = _rectTransform.position;
_distance = Vector3.Distance(_gazeOrigin, _uiOrigin);
_frustumHeight = 2.0f * _distance * Mathf.Tan( this.GetComponent<Camera>().fieldOfView * 0.5f * Mathf.Deg2Rad );
_rectTransform.sizeDelta = new Vector2(_ratio * _frustumHeight * _pixPerUnit, _frustumHeight * _pixPerUnit);
}
}
将比率应用于某物时。该比率是根据两件事的比较计算得出的。在这种情况下,你将你和菜单之间的距离与你和菜单之间的基线距离进行比较。所以你需要固定距离来比较你的实际距离。
平截头体实际上是摄像机生成的圆锥体形状(尖端从摄像机开始),它将渲染该圆锥体内部的任何东西。如果您不弄乱相机,它的尺寸将始终相同。如果你想获得平截头体高度,你需要找出物体在那个圆锥体中的位置。然后找出该圆锥体切片的尺寸。
最简单的解决方案; 将平截头体高度排除在外,您的解决方案就非常简单;玩家靠近增加规模。反之亦然