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); }
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); }
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(); } }
void OnHmdParamsChanged(HmdParameters hmd) { _hmdParamsDirty = true; }