Отрегулируйте размер и масштаб меню холста в HoloWorld

Следующий скрипт должен увеличить 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);
    }   
}

1 ответ

Решение

При применении соотношения к чему-либо. Это соотношение рассчитывается на основе сравнения двух вещей. В этом случае вы сравниваете расстояние между u и меню с базовым расстоянием между u и меню. Так что вам нужно фиксированное расстояние, чтобы сравнить фактическое расстояние с.

Frustum - это буквально конусообразная форма, которую порождает камера (с наконечником, начинающимся у камеры), и она будет рендерить все, что находится внутри этого конуса. Его размеры всегда будут одинаковыми, если не связываться с камерой. Если вы хотите задействовать высоту усеченного конуса, вам нужно выяснить, где находится объект в этом конусе. Затем выясните размеры этого среза конуса.

Самое простое решение; Не указывайте высоту усеченного конуса, и ваше решение будет очень простым; Игрок становится ближе увеличивать масштаб. Наоборот

Другие вопросы по тегам