public static Fov GetFovDistancesLeft(DisplayParameters display, HmdParameters hmd) { float outerDist = 0.5f * (display.Size.x - hmd.InterlensDistance); float innerDist = 0.5f * hmd.InterlensDistance; float bottomDist = hmd.EyeOffsetY; float topDist = display.Size.y - bottomDist; return(new Fov(outerDist, innerDist, bottomDist, topDist)); }
void UpdateView(HmdParameters hmd, DisplayParameters display) { Distortion distortion = new Distortion(hmd.DistortionK1, 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; _camWorldLeft.projectionMatrix = projWorldLeft; _camWorldRight.projectionMatrix = projWorldRight; float maxWorldFovTanAngle = GetMaxDiagonalValue(fovWorldTanAnglesLeft); UpdateUndistortionTex(distortion, maxWorldFovTanAngle); EyeMaterial.SetFloat("_MaxWorldFovTanAngle", maxWorldFovTanAngle); EyeMaterial.SetTexture("_UndistortionTex", _undistortionTex); EyeMaterial.SetVector("_ProjectionWorldLeft", ComposeProjectionVector(projWorldLeft)); EyeMaterial.SetVector("_ProjectionEyeLeft", ComposeProjectionVector(projEyeLeft)); }
void OnHmdParamsChanged(HmdParameters hmd) { _hmdParamsDirty = true; }