private void FillProjectionMatrix(float zFar = 500, float zNear = 0.1f) { StereoParameters parameters = GetParameters(); float fovx = Mathf.Atan(WidthImage / (parameters.leftCam.fx * 2.0f)) * 2.0f; float fovy = Mathf.Atan(HeightImage / (parameters.leftCam.fy * 2.0f)) * 2.0f; projection[0, 0] = 1.0f / Mathf.Tan(fovx * 0.5f); projection[0, 1] = 0; projection[0, 2] = 2 * ((WidthImage - 1 * parameters.leftCam.cx) / WidthImage) - 1.0f; projection[0, 3] = 0; projection[1, 0] = 0; projection[1, 1] = 1.0f / Mathf.Tan(fovy * 0.5f); projection[1, 2] = 2 * ((HeightImage - 1 * parameters.leftCam.cy) / HeightImage) - 1.0f; projection[1, 3] = 0; projection[2, 0] = 0; projection[2, 1] = 0; projection[2, 2] = -(zFar + zNear) / (zFar - zNear); projection[2, 3] = -(2.0f * zFar * zNear) / (zFar - zNear); projection[3, 0] = 0; projection[3, 1] = 0; projection[3, 2] = -1; projection[3, 3] = 0; }
Stream(ArrayList data, StereoParameters stereoParams) { data.Add(new Snoop.Data.ClassSeparator(typeof(StereoParameters))); data.Add(new Snoop.Data.Double("Magnitude", stereoParams.Magnitude)); data.Add(new Snoop.Data.Double("Parallax", stereoParams.Parallax)); }
private void ReferenceStereo(Area area) { StereoParameters stereo = sceneManager.Camera.StereoParameters; stereo.EyeSeparation.X = stereo.ViewPlaneSize.X / 6.0f; stereo.ViewportCenter.Z = stereo.EyePosition.Z + stereo.ViewPlaneSize.X; //sceneManager.Camera.StereoParameters.EyeSeparation = // s = w / 6; // v.z = e.z + w; //sceneManager.Camera.StereoParameters }
private void ResetCamera(Area area) { Camera camera = sceneManager.Camera; StereoParameters stereo = camera.Projection.StereoParameters; camera.Projection.FarParameter.X = 50.0f; camera.Projection.NearParameter.X = 0.01f; camera.Projection.FovXParameter.X = (float)(System.Math.PI * 0.5); camera.Projection.FovYParameter.X = (float)(System.Math.PI * 0.5); stereo.EyePosition.Set(0.0f, 0.0f, 0.0f); stereo.ViewportCenter.Set(0.0f, 0.0f, 4.0f); stereo.Perspective.X = 1.0f; stereo.EyeSeparation.X = 0.065f; }
/// <summary> /// Get the parameters of the Camera /// </summary> /// <returns></returns> public StereoParameters GetParameters() { StereoParameters param = new StereoParameters(); param.leftCam.disto = new double[5]; param.rightCam.disto = new double[5]; //if (!cameraIsReady) return null; float[] v = new float[30]; Marshal.Copy(dllz_get_parameters(), v, 0, 30); param.baseline = v[0]; param.Ty = v[1]; param.Tz = v[2]; param.convergence = v[3]; param.Rx = v[4]; param.Rz = v[5]; param.leftCam.fx = v[6]; param.leftCam.fy = v[7]; param.leftCam.cx = v[8]; param.leftCam.cy = v[9]; param.leftCam.vFOV = v[10]; param.leftCam.hFOV = v[11]; param.leftCam.dFOV = v[12]; for (int i = 0; i < 5; ++i) { param.leftCam.disto[i] = v[13 + i]; } param.rightCam.fx = v[18]; param.rightCam.fy = v[19]; param.rightCam.cx = v[20]; param.rightCam.cy = v[21]; param.rightCam.vFOV = v[22]; param.rightCam.hFOV = v[23]; param.rightCam.dFOV = v[24]; for (int i = 0; i < 5; ++i) { param.rightCam.disto[i] = v[25 + i]; } return param; }
private void ResetCamera(Area area) { Camera camera = sceneManager.Camera; camera.Frame.LocalToParent.Set( Matrix4.CreateLookAt( sceneManager.Home, Vector3.Zero, Vector3.UnitY ) ); cameraControls.SetTransform(camera.Frame.LocalToParent.Matrix); cameraControls.Clear(); StereoParameters stereo = camera.StereoParameters; camera.FarParameter.X = 50.0f; camera.NearParameter.X = 0.01f; camera.FovXParameter.X = (float)(System.Math.PI * 0.5); camera.FovYParameter.X = (float)(System.Math.PI * 0.5); stereo.EyePosition.Set(0.0f, 0.0f, 0.0f); stereo.ViewportCenter.Set(0.0f, 0.0f, 4.0f); stereo.Perspective.X = 1.0f; stereo.EyeSeparation.X = 0.065f; }
private Area Camera() { Button expand = new Button(renderer, "Camera"); expand.Name = "expand"; expand.Action = TogglePopup; MenuList list = new MenuList(renderer, Orientation.Vertical); Popup popup = new Popup(expand, list); list.Name = "list"; list.ChildLayoutStyle = Area.AreaLayoutStyle.ExtendHorizontal; popup.Name = "popup"; Button collapse = new Button(renderer, "Camera"); collapse.Action = TogglePopup; collapse.Link = popup; collapse.Name = "collapse"; list.Add(collapse); Camera camera = sceneManager.Camera; StereoParameters stereo = camera.StereoParameters; list.ChildLayoutStyle = Area.AreaLayoutStyle.ExtendHorizontal; stereo.ViewportCenter.Z = 4.0f; list.Add(new Slider(renderer, "Fov X", camera.FovXParameter, 0, 0.0f, (float)(System.Math.PI), 0.0f, 180.0f)); list.Add(new Slider(renderer, "Fov Y", camera.FovYParameter, 0, 0.0f, (float)(System.Math.PI), 0.0f, 180.0f)); #if false { list.Add(new Slider(renderer, "Eye Separation", stereo.EyeSeparation, 0, -1.0f, 1.0f, -1.0f, 1.0f)); list.Add(new Slider(renderer, "Perspective", stereo.Perspective, 0, 0.0f, 1.0f, 0.0f, 1.0f)); list.Add(new Slider(renderer, "Center X", stereo.ViewportCenter, 0, -4.0f, 4.0f, -4.0f, 4.0f)); list.Add(new Slider(renderer, "Center Y", stereo.ViewportCenter, 1, -4.0f, 4.0f, -4.0f, 4.0f)); list.Add(new Slider(renderer, "Center Z", stereo.ViewportCenter, 2, 0.0f, 20.0f, 0.0f, 20.0f)); list.Add(new Slider(renderer, "Eye X", stereo.EyePosition, 0, -4.0f, 4.0f, -4.0f, 4.0f)); list.Add(new Slider(renderer, "Eye Y", stereo.EyePosition, 1, -4.0f, 4.0f, -4.0f, 4.0f)); list.Add(new Slider(renderer, "Eye Z", stereo.EyePosition, 2, -20.0f, 20.0f, -20.0f, 20.0f)); //list.Add(new Slider(renderer, "Near", camera.NearParameter, 0, 0.0f, 10.0f, 0.0f, 10.0f)); //list.Add(new Slider(renderer, "Far", camera.FarParameter, 0, 0.0f, 100.0f, 0.0f, 100.0f)); } { Choice choice = new Choice(Orientation.Horizontal); choice.Name = "Focus choice"; choice.Style = Style.NullPadding; choice.Add(new ChoiceItem(renderer, "AutoFocus")); choice.Add(new ChoiceItem(renderer, "Manual")); choice.Action = FocusChoiceAction; choice.Selected = choice.Items.First(); list.Add(choice); } #endif { Choice choice = new Choice(Orientation.Horizontal); choice.Name = "FOV choice"; choice.Style = Style.NullPadding; choice.Add(new ChoiceItem(renderer, "Vertical")); choice.Add(new ChoiceItem(renderer, "Horizontal")); #if false { choice.Add(new ChoiceItem(renderer, "V. Stereo")); choice.Add(new ChoiceItem(renderer, "H. Stereo")); } #endif choice.Action = ProjectionChoiceAction; choice.Selected = choice.Items.First(); list.Add(choice); } #if false { Choice choice = new Choice(Orientation.Horizontal); choice.Name = "StereoMode choice"; choice.Style = Style.NullPadding; foreach (var kvp in stereoModes) { choice.Add(new ChoiceItem(renderer, kvp.Key)); } choice.Action = StereoModeChoiceAction; choice.Selected = choice.Items.First(); list.Add(choice); } { list.Add(new Slider(renderer, "Saturation", (renderer.GlobalParameters["saturation"] as Floats), 0, 0.0f, 1.0f, 0.0f, 1.0f)); list.Add(new Slider(renderer, "Contrast", (renderer.GlobalParameters["contrast"] as Floats), 0, 0.0f, 1.0f, 0.0f, 1.0f)); list.Add(new Slider(renderer, "Deghost", (renderer.GlobalParameters["deghost"] as Floats), 0, 0.0f, 1.0f, 0.0f, 1.0f)); } #endif { Dock dock = new Dock(Orientation.Horizontal); dock.Name = "Reset Home dock"; dock.Style = Style.NullPadding; Button reset = new Button(renderer, "Reset"); reset.Action = ResetCamera; dock.Add(reset); list.Add(dock); } expand.Link = popup; popup.Set(false); return(popup); }
public void ProcessIdBuffer(IDRenderer.HoverInfo hover, int px, int py) { ResetHover(); uint compareId = 0xfffffeu; if(hover.Id == compareId) { HoverModel = null; HoverGroup.Clear(); return; } try { Vector3 positionInWorld = sceneManager.Camera.WorldToClip.InverseMatrix.UnProject( (float)px, (float)py, hover.Depth, renderer.Requested.Viewport.X, renderer.Requested.Viewport.Y, renderer.Requested.Viewport.Width, renderer.Requested.Viewport.Height ); HoverPosition = positionInWorld; if(userInterfaceManager.AutoFocus) { Camera camera = sceneManager.Camera; StereoParameters stereo = camera.Projection.StereoParameters; float distance = camera.Frame.LocalToWorld.Matrix.GetColumn(3).Xyz.Distance(positionInWorld); stereo.ViewportCenter.Z = distance; } HoverDepth = hover.Depth; uint modelPolygonId = 0; uint manipulatorPolygonId = 0; IDListEntry compareKey = new IDListEntry(hover.Id); Model renderModel = null; if(manipulatorManager != null) { manipulatorManager.ManipulatorModel = manipulatorManager.ManipulatorGroup.IdTest(compareKey, out manipulatorPolygonId); if(manipulatorManager.ManipulatorModel == null) { foreach(var group in hover.Groups) { renderModel = group.IdTest(compareKey, out modelPolygonId); if(renderModel != null) { break; } } } } UpdateHover(renderModel, modelPolygonId); } catch(System.Exception) { return; } }
private Area Camera() { var list = new MenuList(renderer, Orientation.Vertical); list.Name = "list"; list.ChildLayoutStyle = Area.AreaLayoutStyle.ExtendHorizontal; Camera camera = sceneManager.Camera; StereoParameters stereo = camera.Projection.StereoParameters; list.ChildLayoutStyle = Area.AreaLayoutStyle.ExtendHorizontal; stereo.ViewportCenter.Z = 4.0f; list.Add(new Slider(renderer, "Fov X", camera.Projection.FovXParameter, 0, 0.0f, (float)(System.Math.PI), 0.0f, 180.0f)); list.Add(new Slider(renderer, "Fov Y", camera.Projection.FovYParameter, 0, 0.0f, (float)(System.Math.PI), 0.0f, 180.0f)); if (Configuration.stereo) { list.Add(new Slider(renderer, "Eye Separation", stereo.EyeSeparation, 0, -1.0f, 1.0f, -1.0f, 1.0f)); list.Add(new Slider(renderer, "Perspective", stereo.Perspective, 0, 0.0f, 1.0f, 0.0f, 1.0f)); list.Add(new Slider(renderer, "Center X", stereo.ViewportCenter, 0, -4.0f, 4.0f, -4.0f, 4.0f)); list.Add(new Slider(renderer, "Center Y", stereo.ViewportCenter, 1, -4.0f, 4.0f, -4.0f, 4.0f)); list.Add(new Slider(renderer, "Center Z", stereo.ViewportCenter, 2, 0.0f, 20.0f, 0.0f, 20.0f)); list.Add(new Slider(renderer, "Eye X", stereo.EyePosition, 0, -4.0f, 4.0f, -4.0f, 4.0f)); list.Add(new Slider(renderer, "Eye Y", stereo.EyePosition, 1, -4.0f, 4.0f, -4.0f, 4.0f)); list.Add(new Slider(renderer, "Eye Z", stereo.EyePosition, 2, -20.0f, 20.0f, -20.0f, 20.0f)); //list.Add(new Slider(renderer, "Near", camera.NearParameter, 0, 0.0f, 10.0f, 0.0f, 10.0f)); //list.Add(new Slider(renderer, "Far", camera.FarParameter, 0, 0.0f, 100.0f, 0.0f, 100.0f)); } if (Configuration.stereo) { Choice choice = new Choice(Orientation.Horizontal); choice.Name = "Focus choice"; choice.Style = Style.NullPadding; choice.Add(new ChoiceItem(renderer, "AutoFocus")); choice.Add(new ChoiceItem(renderer, "Manual")); choice.Action = FocusChoiceAction; choice.Selected = choice.Items.First(); list.Add(choice); } { Choice choice = new Choice(Orientation.Horizontal); choice.Name = "FOV choice"; choice.Style = Style.NullPadding; var dict = new Dictionary <string, ProjectionType>(); dict["Vertical"] = ProjectionType.PerspectiveVertical; dict["Horizontal"] = ProjectionType.PerspectiveHorizontal; dict["V. Stereo"] = ProjectionType.StereoscopicVertical; dict["H. Stereo"] = ProjectionType.StereoscopicHorizontal; foreach (var kvp in dict) { var choiceItem = choice.Add(new ChoiceItem(renderer, kvp.Key)); if (kvp.Value == sceneManager.Camera.Projection.ProjectionType) { choice.Selected = choiceItem; } } choice.Action = ProjectionChoiceAction; list.Add(choice); } { Choice choice = new Choice(Orientation.Horizontal); choice.Name = "StereoMode choice"; choice.Style = Style.NullPadding; foreach (var kvp in stereoModes) { ChoiceItem choiceItem = choice.Add(new ChoiceItem(renderer, kvp.Key)); if (kvp.Value == CurrentStereoMode) { choice.Selected = choiceItem; } } choice.Action = StereoModeChoiceAction; list.Add(choice); } #if false // \todo stereo material if (Configuration.stereo) { list.Add(new Slider(renderer, "Saturation", renderer.Global.Floats("saturation"), 0, 0.0f, 1.0f, 0.0f, 1.0f)); list.Add(new Slider(renderer, "Contrast", renderer.Global.Floats("contrast"), 0, 0.0f, 1.0f, 0.0f, 1.0f)); list.Add(new Slider(renderer, "Deghost", renderer.Global.Floats("deghost"), 0, 0.0f, 1.0f, 0.0f, 1.0f)); } #endif { Dock dock = new Dock(Orientation.Horizontal); dock.Name = "Reset Home dock"; dock.Style = Style.NullPadding; Button reset = new Button(renderer, "Reset"); reset.Action = ResetCamera; dock.Add(reset); /*Button reference = new Button(renderer, "Reference"); * reference.Action = ReferenceStereo; * dock.Add(reference);*/ Button home = new Button(renderer, "Home"); home.Action = HomeCamera; dock.Add(home); list.Add(dock); } var expand = new Button(renderer, "Camera", SetActive); expand.Link = list; return(expand); }