示例#1
0
            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;
            }
示例#2
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));
        }
示例#3
0
        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
        }
示例#4
0
        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;
        }
示例#5
0
            /// <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;
            }
示例#6
0
        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;
        }
示例#7
0
        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;
            }

        }
示例#9
0
        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);
        }