コード例 #1
0
        void Start()
        {
            _hmd  = HmdParameters.Instance;
            _mesh = MeshParameters.Instance;

            UpdateControls();

            InterlensDistanceSlider.onValueChanged.AddListener((val) => _hmd.InterlensDistance = 0.001f * val);
            ScreenToLensDistSlider.onValueChanged.AddListener((val) => _hmd.ScreenToLensDist   = 0.001f * val);
            EyeOffsetYSlider.onValueChanged.AddListener((val) => _hmd.EyeOffsetY     = 0.001f * val);
            DistortionK1Slider.onValueChanged.AddListener((val) => _hmd.DistortionK1 = val);
            DistortionK2Slider.onValueChanged.AddListener((val) => _hmd.DistortionK2 = val);
            FovLeftSlider.onValueChanged.AddListener((val) => _hmd.MaxFovAngles      = new Fov(val, _hmd.MaxFovAngles.Right, _hmd.MaxFovAngles.Bottom, _hmd.MaxFovAngles.Top));
            FovRightSlider.onValueChanged.AddListener((val) => _hmd.MaxFovAngles     = new Fov(_hmd.MaxFovAngles.Left, val, _hmd.MaxFovAngles.Bottom, _hmd.MaxFovAngles.Top));
            FovTopSlider.onValueChanged.AddListener((val) => _hmd.MaxFovAngles       = new Fov(_hmd.MaxFovAngles.Left, _hmd.MaxFovAngles.Right, _hmd.MaxFovAngles.Bottom, val));
            FovBottomSlider.onValueChanged.AddListener((val) => _hmd.MaxFovAngles    = new Fov(_hmd.MaxFovAngles.Left, _hmd.MaxFovAngles.Right, val, _hmd.MaxFovAngles.Top));

            MeshHorizontalSegmentsSlider.onValueChanged.AddListener((val) => _mesh.SegmentWidth = (int)val);
            MeshVerticalSegmentsSlider.onValueChanged.AddListener((val) => _mesh.SegmentHeight  = (int)val);

            GridToggle.onValueChanged.AddListener((val) => GridCm.SetActive(val));

            RestoreDefaultsButton.onClick.AddListener(RestoreDefaultSettings);
            LoadButton.onClick.AddListener(LoadSettings);
            SaveButton.onClick.AddListener(SaveSettings);
        }
コード例 #2
0
        void UpdateViewAndMaterialParameters(HmdParameters hmd, DisplayParameters display)
        {
            Distortion distortion = new Distortion(hmd.DistortionK1, hmd.DistortionK2);

            distortion.DistortionK1 = hmd.DistortionK1;
            distortion.DistortionK2 = hmd.DistortionK2;

            float zNear = _camWorldLeft.nearClipPlane;
            float zFar  = _camWorldLeft.farClipPlane;

            Fov displayDistancesLeft = Calculator.GetFovDistancesLeft(display, hmd);

            // То, как должен видеть левый глаз свой кусок экрана. Без линзы. C учётом только размеров дисплея
            Fov fovDisplayTanAngles = displayDistancesLeft / hmd.ScreenToLensDist;

            // FoV шлема
            Fov hmdMaxFovTanAngles = Fov.AnglesToTanAngles(hmd.MaxFovAngles);

            // То, как должен видеть левый глаз свой кусок экрана. Без линзы. C учётом размеров дисплея и FoV шлема
            Fov fovEyeTanAglesLeft = Fov.Min(fovDisplayTanAngles, hmdMaxFovTanAngles);

            // То, как должен видеть левый глаз. Мнимое изображение (после увеличения идеальной линзой без искажений). С широким углом. Именно так надо снять сцену
            Fov fovWorldTanAnglesLeft = Calculator.DistortTanAngles(fovEyeTanAglesLeft, distortion);

            Matrix4x4 projWorldLeft;
            Matrix4x4 projWorldRight;

            Calculator.ComposeProjectionMatricesFromFovTanAngles(fovWorldTanAnglesLeft, zNear, zFar, out projWorldLeft, out projWorldRight);

            Matrix4x4 projEyeLeft;
            Matrix4x4 projEyeRight;

            Calculator.ComposeProjectionMatricesFromFovTanAngles(fovDisplayTanAngles, zNear, zFar, out projEyeLeft, out projEyeRight);

            _camWorldLeft.transform.localPosition  = 0.5f * Vector3.left * hmd.InterlensDistance;
            _camWorldRight.transform.localPosition = 0.5f * Vector3.right * hmd.InterlensDistance;

            _camEyeLeft.transform.localPosition  = 0.5f * Vector3.left * hmd.InterlensDistance;
            _camEyeRight.transform.localPosition = 0.5f * Vector3.right * hmd.InterlensDistance;

            _camWorldLeft.projectionMatrix  = projWorldLeft;
            _camWorldRight.projectionMatrix = projWorldRight;

            _camWorldLeftScaler.SetFov(fovWorldTanAnglesLeft);
            _camWorldRightScaler.SetFov(fovWorldTanAnglesLeft.GetFlippedHorizontally());

            _camEyeLeft.projectionMatrix  = projEyeLeft;
            _camEyeRight.projectionMatrix = projEyeRight;

            EyeMaterialLeft.SetFloat("_DistortionK1", hmd.DistortionK1);
            EyeMaterialRight.SetFloat("_DistortionK1", hmd.DistortionK1);

            EyeMaterialLeft.SetFloat("_DistortionK2", hmd.DistortionK2);
            EyeMaterialRight.SetFloat("_DistortionK2", hmd.DistortionK2);
        }
コード例 #3
0
        private void OnGUI()
        {
            HmdParameters  hmd  = HmdParameters.Instance;
            MeshParameters mesh = MeshParameters.Instance;

            EditorGUILayout.BeginVertical("box");
            EditorGUILayout.LabelField("HMD Settings");

            hmd.DistortionK1      = EditorGUILayout.Slider("DistortionK1", hmd.DistortionK1, 0f, 2f, GUILayout.ExpandWidth(true));
            hmd.DistortionK2      = EditorGUILayout.Slider("DistortionK2", hmd.DistortionK2, 0f, 2f, GUILayout.ExpandWidth(true));
            hmd.InterlensDistance = EditorGUILayout.Slider("InterlensDistance", hmd.InterlensDistance, 0f, 0.2f, GUILayout.ExpandWidth(true));
            hmd.ScreenToLensDist  = EditorGUILayout.Slider("ScreenToLensDist", hmd.ScreenToLensDist, 0.01f, 0.2f, GUILayout.ExpandWidth(true));
            hmd.EyeOffsetY        = EditorGUILayout.Slider("EyeOffsetY", hmd.EyeOffsetY, 0f, 0.2f, GUILayout.ExpandWidth(true));

            EditorGUILayout.BeginVertical("box");
            EditorGUILayout.LabelField("FoV");
            float fovLeft   = EditorGUILayout.Slider("Left", hmd.MaxFovAngles.Left, 0f, 89f, GUILayout.ExpandWidth(true));
            float fovRight  = EditorGUILayout.Slider("Right", hmd.MaxFovAngles.Right, 0f, 89f, GUILayout.ExpandWidth(true));
            float fovTop    = EditorGUILayout.Slider("Top", hmd.MaxFovAngles.Top, 0f, 89f, GUILayout.ExpandWidth(true));
            float fovBottom = EditorGUILayout.Slider("Bottom", hmd.MaxFovAngles.Bottom, 0f, 89f, GUILayout.ExpandWidth(true));

            hmd.MaxFovAngles = new Fov(fovLeft, fovRight, fovBottom, fovTop);
            EditorGUILayout.EndVertical();

            EditorGUILayout.EndVertical();

            EditorGUILayout.BeginVertical("box");
            EditorGUILayout.LabelField("Mesh Settings");

            mesh.SegmentWidth  = EditorGUILayout.IntSlider("SegmentWidth", mesh.SegmentWidth, 1, 16, GUILayout.ExpandWidth(true));
            mesh.SegmentHeight = EditorGUILayout.IntSlider("SegmentHeight", mesh.SegmentHeight, 1, 16, GUILayout.ExpandWidth(true));

            EditorGUILayout.EndVertical();

            if (GUILayout.Button("Restore defaults", GUILayout.ExpandWidth(false)))
            {
                hmd.LoadDefaults();
                mesh.LoadDefaults();
            }
        }
コード例 #4
0
 void OnHmdParamsChanged(HmdParameters hmd)
 {
     _hmdParamsDirty = true;
 }