예제 #1
0
        /// <summary>
        /// 启动gb28181摄像头
        /// </summary>
        /// <param name="cil"></param>
        private static void liveGB28181(CameraInstance cil)
        {
            try
            {
                ResponseStruct rs    = null;
                var            gbRet = CommonApi.LiveVideo(cil.PushMediaServerId,
                                                           cil.CameraDeviceLable,
                                                           cil.CameraChannelLable, out rs, (bool)cil.IfGb28181Tcp !);

                if (gbRet != null && rs.Code == ErrorNumber.None)
                {
                    CameraSession sessionsub = null;
                    lock (Common.CameraSessionLock)
                    {
                        sessionsub = Common.CameraSessions.FindLast(x =>
                                                                    x.App !.Equals(gbRet.App) &&
                                                                    x.Vhost !.Equals(gbRet.Vhost) &&
                                                                    x.StreamId !.Equals(gbRet.MediaId));
                    }


                    if (sessionsub != null)
                    {
                        lock (Common.CameraSessionLock)
                        {
                            sessionsub.CameraId = cil.CameraId;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("liveGB28181 Except:\r\n" + ex.Message + "\r\n" + ex.StackTrace);
            }
        }
예제 #2
0
        public void PoseTest()
        {
            CameraInstance cameraInstance = new CameraInstance(new Camera(new PerspectiveProjection()));
              Assert.IsNotNull(cameraInstance.PoseWorld);
              Assert.AreEqual(Vector3F.Zero, cameraInstance.PoseWorld.Position);
              Assert.AreEqual(Matrix33F.Identity, cameraInstance.PoseWorld.Orientation);

              // Set new Pose
              Vector3F position = new Vector3F(1, 2, 3);
              QuaternionF orientation = QuaternionF.CreateRotation(new Vector3F(3, 4, 5), 0.123f);
              cameraInstance.PoseWorld = new Pose(position, orientation);
              Assert.AreEqual(position, cameraInstance.PoseWorld.Position);
              Assert.AreEqual(orientation.ToRotationMatrix33(), cameraInstance.PoseWorld.Orientation);
              Assert.IsTrue(Matrix44F.AreNumericallyEqual(cameraInstance.PoseWorld.ToMatrix44F(), cameraInstance.ViewInverse));
              Assert.IsTrue(Matrix44F.AreNumericallyEqual(cameraInstance.PoseWorld.Inverse.ToMatrix44F(), cameraInstance.View));

              // Set Position and Orientation
              position = new Vector3F(5, 6, 7);
              orientation = QuaternionF.CreateRotation(new Vector3F(1, -1, 6), -0.123f);
              cameraInstance.PoseWorld = new Pose(position, orientation);
              Assert.AreEqual(position, cameraInstance.PoseWorld.Position);
              Assert.AreEqual(orientation.ToRotationMatrix33(), cameraInstance.PoseWorld.Orientation);
              Assert.IsTrue(Matrix44F.AreNumericallyEqual(cameraInstance.PoseWorld.Inverse.ToMatrix44F(), cameraInstance.View));
              Assert.IsTrue(Matrix44F.AreNumericallyEqual(cameraInstance.PoseWorld.ToMatrix44F(), cameraInstance.ViewInverse));
        }
예제 #3
0
        public FormCamera(CameraInstance instance)
        {
            InitializeComponent();

            _instance       = instance;
            ckFixed.Checked = _instance.Fixed;
        }
        /// <summary>
        /// 停止摄像头
        /// </summary>
        /// <param name="cil"></param>
        private static void stopCamera(CameraInstance cil)
        {
            try
            {
                if (cil != null && cil.EnableLive == false)
                {
                    CameraSession cameraSession = null;
                    cameraSession = getCameraCurrentSession(cil);

                    if (cameraSession != null && cameraSession.IsOnline == true)
                    {
                        switch (cil.CameraType)
                        {
                        case CameraType.Rtsp:

                            stopRtsp(cameraSession);
                            break;

                        case CameraType.GB28181:

                            stopGB28181(cameraSession);
                            break;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("stopCamera Except:\r\n" + ex.Message + "\r\n" + ex.StackTrace);
            }
        }
예제 #5
0
        public void PoseTest()
        {
            CameraInstance cameraInstance = new CameraInstance(new Camera(new PerspectiveProjection()));

            Assert.IsNotNull(cameraInstance.PoseWorld);
            Assert.AreEqual(Vector3.Zero, cameraInstance.PoseWorld.Position);
            Assert.AreEqual(Matrix.Identity, cameraInstance.PoseWorld.Orientation);

            // Set new Pose
            Vector3    position    = new Vector3(1, 2, 3);
            Quaternion orientation = Quaternion.CreateFromRotationMatrix(new Vector3(3, 4, 5), 0.123f);

            cameraInstance.PoseWorld = new Pose(position, orientation);
            Assert.AreEqual(position, cameraInstance.PoseWorld.Position);
            Assert.AreEqual(orientation.ToRotationMatrix33(), cameraInstance.PoseWorld.Orientation);
            Assert.IsTrue(Matrix.AreNumericallyEqual(cameraInstance.PoseWorld.ToMatrix(), cameraInstance.ViewInverse));
            Assert.IsTrue(Matrix.AreNumericallyEqual(cameraInstance.PoseWorld.Inverse.ToMatrix(), cameraInstance.View));

            // Set Position and Orientation
            position    = new Vector3(5, 6, 7);
            orientation = Quaternion.CreateFromRotationMatrix(new Vector3(1, -1, 6), -0.123f);
            cameraInstance.PoseWorld = new Pose(position, orientation);
            Assert.AreEqual(position, cameraInstance.PoseWorld.Position);
            Assert.AreEqual(orientation.ToRotationMatrix33(), cameraInstance.PoseWorld.Orientation);
            Assert.IsTrue(Matrix.AreNumericallyEqual(cameraInstance.PoseWorld.Inverse.ToMatrix(), cameraInstance.View));
            Assert.IsTrue(Matrix.AreNumericallyEqual(cameraInstance.PoseWorld.ToMatrix(), cameraInstance.ViewInverse));
        }
예제 #6
0
        public void PoseChangedTest()
        {
            bool poseChanged = false;
              CameraInstance cameraInstance = new CameraInstance(new Camera(new PerspectiveProjection()));
              cameraInstance.PoseChanged += (sender, eventArgs) => poseChanged = true;

              cameraInstance.PoseWorld = new Pose(new Vector3F(1, 2, 3));
              Assert.IsTrue(poseChanged);
        }
        /// <summary>
        /// 启动摄像头
        /// </summary>
        /// <param name="cil"></param>
        private static void liveCamera(CameraInstance cil)
        {
            try
            {
                CameraSession cameraSession = null;
                if (cil != null && cil.EnableLive)
                {
                    cameraSession = getCameraCurrentSession(cil);

                    if (cameraSession == null || (cameraSession != null && cameraSession.IsOnline == false)
                        ) //camera没有,或者isonline是false要推流
                    {
                        CameraType ctype = cameraSession != null ? cameraSession.CameraType : cil.CameraType;
                        switch (ctype)
                        {
                        case CameraType.Rtsp:

                            liveRtsp(cil);

                            break;

                        case CameraType.GB28181:

                            liveGB28181(cil);

                            break;
                        }
                    }
                    else if (cameraSession != null && string.IsNullOrEmpty(cameraSession.CameraId) &&
                             cameraSession.IsOnline == true
                             ) //当camera不为空,但camera.cameraid为空时,不需要重新推,但要补全这个id
                    {
                        CameraSession sessionsub = null;
                        lock (Common.CameraSessionLock)
                        {
                            sessionsub = Common.CameraSessions.FindLast(x =>
                                                                        x.App !.Equals(cameraSession.App) &&
                                                                        x.Vhost !.Equals(cameraSession.Vhost) &&
                                                                        x.StreamId !.Equals(cameraSession.StreamId));
                        }


                        if (sessionsub != null)
                        {
                            lock (Common.CameraSessionLock)
                            {
                                cameraSession.CameraId = cil.CameraId;
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("liveCamera Except:\r\n" + ex.Message + "\r\n" + ex.StackTrace);
            }
        }
예제 #8
0
        public void PoseChangedTest()
        {
            bool           poseChanged    = false;
            CameraInstance cameraInstance = new CameraInstance(new Camera(new PerspectiveProjection()));

            cameraInstance.PoseChanged += (sender, eventArgs) => poseChanged = true;

            cameraInstance.PoseWorld = new Pose(new Vector3(1, 2, 3));
            Assert.IsTrue(poseChanged);
        }
예제 #9
0
        public void ShapeChangedTest()
        {
            bool           shapeChanged   = false;
            CameraInstance cameraInstance = new CameraInstance(new Camera(new PerspectiveProjection()));

            cameraInstance.BoundingShapeChanged += (sender, eventArgs) => shapeChanged = true;

            cameraInstance.Camera.Projection.Far = 9;
            Assert.IsTrue(shapeChanged);
        }
 private void Awake()
 {
     if (instance == null)
     {
         instance = this;
         DontDestroyOnLoad(gameObject);
     }
     else
     {
         Destroy(gameObject);
     }
 }
예제 #11
0
        /// <summary>
        /// 停止摄像头
        /// </summary>
        /// <param name="cil"></param>
        private static void stopCamera(CameraInstance cil)
        {
            try
            {
                if (cil != null && cil.EnableLive == false)
                {
                    CameraSession cameraSession = null !;
                    cameraSession = GetCameraCurrentSession(cil);

                    if (cameraSession != null && cameraSession.IsOnline == true)
                    {
                        switch (cil.CameraType)
                        {
                        case CameraType.Rtsp:

                            StopRtsp(cameraSession);
                            break;

                        case CameraType.GB28181:

                            bool found = false;
                            lock (Common.SipProcess.SipDeviceLock)
                            {
                                var dev = Common.SipProcess.SipDeviceList.FindLast(x =>
                                                                                   x.DeviceId.Equals(cil.CameraDeviceLable));
                                if (dev != null && dev.CameraExList != null && dev.CameraExList.Count > 0)
                                {
                                    var camera = dev.CameraExList.FindLast(x =>
                                                                           x.Camera != null && x.Camera.DeviceID.Equals(cil.CameraChannelLable));
                                    if (camera != null)
                                    {
                                        found = true;
                                        //break;
                                    }
                                }
                            }

                            if (found == true)
                            {
                                stopGB28181(cameraSession);
                            }

                            break;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Logger.Error("stopCamera Except ->" + ex.Message + "->" + ex.StackTrace);
            }
        }
예제 #12
0
        //public static bool Init = false;


        /// <summary>
        /// 获取摄像头session
        /// </summary>
        /// <param name="cil"></param>
        /// <returns></returns>
        private static CameraSession GetCameraCurrentSession(CameraInstance cil)
        {
            try
            {
                CameraSession session = null !;
                if (cil.CameraType == CameraType.GB28181)
                {
                    lock (Common.CameraSessionLock)
                    {
                        if (cil.MobileCamera == true) //如果是移动摄像头,就不再检查ip地址
                        {
                            session = Common.CameraSessions.FindLast(x =>
                                                                     x.ClientType == ClientType.Camera &&
                                                                     x.CameraType == CameraType.GB28181 &&
                                                                     x.CameraEx !.Camera.DeviceID.Equals(cil.CameraChannelLable) &&
                                                                     x.CameraEx.Camera.ParentID.Equals(cil.CameraDeviceLable)) !;
                        }
                        else
                        {
                            session = Common.CameraSessions.FindLast(x =>
                                                                     x.ClientType == ClientType.Camera &&
                                                                     x.CameraType == CameraType.GB28181 &&
                                                                     x.CameraEx !.Camera.IPAddress.Equals(cil.CameraIpAddress) && //为支持公网远程设备的ip不固定性,取消ip 地址校验
                                                                     x.CameraEx.Camera.DeviceID.Equals(cil.CameraChannelLable) &&
                                                                     x.CameraEx.Camera.ParentID.Equals(cil.CameraDeviceLable)) !;
                        }
                    }
                }


                if (cil.CameraType == CameraType.Rtsp) //rtsp摄像头一定是固定ip地址的
                {
                    lock (Common.CameraSessionLock)
                    {
                        session = Common.CameraSessions.FindLast(x =>
                                                                 x.ClientType == ClientType.Camera &&
                                                                 x.CameraType == CameraType.Rtsp &&
                                                                 x.CameraIpAddress !.Equals(cil.CameraIpAddress) &&
                                                                 x.CameraEx !.InputUrl !.Equals(cil.IfRtspUrl)) !;
                    }
                }

                return(session !);
            }
            catch (Exception ex)
            {
                Logger.Logger.Error("getCameraCurrentSession Except -> " + ex.Message + "->" + ex.StackTrace);
                return(null !);
            }
        }
예제 #13
0
        public void InverseViewTest()
        {
            CameraInstance cameraInstance = new CameraInstance(new Camera(new PerspectiveProjection()));
              Assert.AreEqual(Matrix44F.Identity, cameraInstance.View);
              Assert.AreEqual(Matrix44F.Identity, cameraInstance.ViewInverse);

              Vector3F position = new Vector3F(1, 2, 3);
              Vector3F target = new Vector3F(2, 5, 4);
              Vector3F upVector = new Vector3F(1, 1, 1);
              Matrix44F view = Matrix44F.CreateLookAt(position, target, upVector);

              cameraInstance.ViewInverse = view.Inverse;
              Assert.IsTrue(Matrix44F.AreNumericallyEqual(view, cameraInstance.View));
              Assert.IsTrue(Matrix44F.AreNumericallyEqual(view.Inverse, cameraInstance.ViewInverse));
              Assert.IsTrue(Matrix44F.AreNumericallyEqual(view.Inverse, cameraInstance.PoseWorld.ToMatrix44F()));
        }
예제 #14
0
        public void InverseViewTest()
        {
            CameraInstance cameraInstance = new CameraInstance(new Camera(new PerspectiveProjection()));

            Assert.AreEqual(Matrix.Identity, cameraInstance.View);
            Assert.AreEqual(Matrix.Identity, cameraInstance.ViewInverse);

            Vector3 position = new Vector3(1, 2, 3);
            Vector3 target   = new Vector3(2, 5, 4);
            Vector3 upVector = new Vector3(1, 1, 1);
            Matrix  view     = Matrix.CreateLookAt(position, target, upVector);

            cameraInstance.ViewInverse = view.Inverse;
            Assert.IsTrue(Matrix.AreNumericallyEqual(view, cameraInstance.View));
            Assert.IsTrue(Matrix.AreNumericallyEqual(view.Inverse, cameraInstance.ViewInverse));
            Assert.IsTrue(Matrix.AreNumericallyEqual(view.Inverse, cameraInstance.PoseWorld.ToMatrix()));
        }
예제 #15
0
 public void camlist1()  //콤보박스 강제로 불러와서 그값으로 실행시키기
 {
     {
         NeptuneDevice iDev  = DeviceManager.Instance.GetDeviceFromSerial(m_CamInfo1[1].strSerial);
         NeptuneDevice iDev1 = DeviceManager.Instance.GetDeviceFromSerial(m_CamInfo1[0].strSerial);
         try
         {
             Cam1[0] = new CameraInstance(iDev, ENeptuneDevAccess.NEPTUNE_DEV_ACCESS_EXCLUSIVE);
             Cam1[1] = new CameraInstance(iDev1, ENeptuneDevAccess.NEPTUNE_DEV_ACCESS_EXCLUSIVE);
         }
         catch (Exception exp)
         {
         }
         m_Display1[1] = new DisplayImage(pictureBoxDisplay1[1].Handle);
         m_Display1[0] = new DisplayImage(pictureBoxDisplay1[0].Handle);
     }
 }
예제 #16
0
        public void SetProjectionTest()
        {
            Matrix projectionMatrix = Matrix.CreateOrthographicOffCenter(1, 4, 2, 5, 6, 11);
            OrthographicProjection orthographicProjection = new OrthographicProjection();

            orthographicProjection.Set(projectionMatrix);
            CameraInstance cameraInstance = new CameraInstance(new Camera(orthographicProjection));

            Assert.AreEqual(Vector3.Zero, cameraInstance.PoseWorld.Position);
            Assert.AreEqual(Matrix.Identity, cameraInstance.PoseWorld.Orientation);
            Assert.That(Numeric.AreEqual(3, cameraInstance.Camera.Projection.Width));
            Assert.That(Numeric.AreEqual(3, cameraInstance.Camera.Projection.Height));
            Assert.That(Numeric.AreEqual(1f, cameraInstance.Camera.Projection.AspectRatio));
            Assert.That(Numeric.AreEqual(6, cameraInstance.Camera.Projection.Near));
            Assert.That(Numeric.AreEqual(11, cameraInstance.Camera.Projection.Far));
            Assert.That(Numeric.AreEqual(1, cameraInstance.Camera.Projection.Left));
            Assert.That(Numeric.AreEqual(4, cameraInstance.Camera.Projection.Right));
            Assert.That(Numeric.AreEqual(2, cameraInstance.Camera.Projection.Bottom));
            Assert.That(Numeric.AreEqual(5, cameraInstance.Camera.Projection.Top));
            Assert.That(Numeric.AreEqual(5, cameraInstance.Camera.Projection.Depth));
            Assert.That(Matrix.AreNumericallyEqual(orthographicProjection, cameraInstance.Camera.Projection));
            Assert.That(Matrix.AreNumericallyEqual(orthographicProjection.Inverse, cameraInstance.Camera.Projection.Inverse));
            Assert.IsNotNull(cameraInstance.BoundingShape);

            PerspectiveProjection perspectiveProjection = new PerspectiveProjection();

            perspectiveProjection.Inverse = Matrix.CreatePerspectiveOffCenter(1, 5, 2, 5, 1, 10).Inverse;
            cameraInstance = new CameraInstance(new Camera(perspectiveProjection));

            Assert.AreEqual(Vector3.Zero, cameraInstance.PoseWorld.Position);
            Assert.AreEqual(Matrix.Identity, cameraInstance.PoseWorld.Orientation);
            Assert.That(Numeric.AreEqual(MathHelper.ToRadians(33.690067f), cameraInstance.Camera.Projection.FieldOfViewX));
            Assert.That(Numeric.AreEqual(MathHelper.ToRadians(15.255119f), cameraInstance.Camera.Projection.FieldOfViewY));
            Assert.That(Numeric.AreEqual(4, cameraInstance.Camera.Projection.Width));
            Assert.That(Numeric.AreEqual(3, cameraInstance.Camera.Projection.Height));
            Assert.That(Numeric.AreEqual(4.0f / 3.0f, cameraInstance.Camera.Projection.AspectRatio));
            Assert.That(Numeric.AreEqual(1, cameraInstance.Camera.Projection.Left));
            Assert.That(Numeric.AreEqual(5, cameraInstance.Camera.Projection.Right));
            Assert.That(Numeric.AreEqual(2, cameraInstance.Camera.Projection.Bottom));
            Assert.That(Numeric.AreEqual(5, cameraInstance.Camera.Projection.Top));
            Assert.That(Numeric.AreEqual(1, cameraInstance.Camera.Projection.Near));
            Assert.That(Numeric.AreEqual(10, cameraInstance.Camera.Projection.Far));
            Assert.That(Numeric.AreEqual(9, cameraInstance.Camera.Projection.Depth));
            Assert.IsNotNull(cameraInstance.BoundingShape);
        }
예제 #17
0
        /// <summary>
        /// 启动gb28181摄像头
        /// </summary>
        /// <param name="cil"></param>
        private static void LiveGb28181(CameraInstance cil)
        {
            try
            {
                ResponseStruct rs = null !;

                var gbRet = CommonApi.LiveVideo(cil.PushMediaServerId,
                                                cil.CameraDeviceLable,
                                                cil.CameraChannelLable, out rs, (bool)cil.IfGb28181Tcp !);

                if (gbRet != null && rs.Code == ErrorNumber.None)
                {
                    Logger.Logger.Info("GB28181推流成功->" + cil.CameraId + "->" + cil.CameraDeviceLable + "->" +
                                       cil.CameraChannelLable + "->" + "(TCP:" + cil.IfGb28181Tcp + ")");

                    CameraSession sessionsub = null !;
                    lock (Common.CameraSessionLock)
                    {
                        sessionsub = Common.CameraSessions.FindLast(x =>
                                                                    x.App !.Equals(gbRet.App) &&
                                                                    x.Vhost !.Equals(gbRet.Vhost) &&
                                                                    x.StreamId !.Equals(gbRet.MediaId)) !;
                    }


                    if (sessionsub != null)
                    {
                        lock (Common.CameraSessionLock)
                        {
                            sessionsub.CameraId = cil.CameraId;
                        }
                    }
                }
                else
                {
                    Logger.Logger.Warn("GB28181推流失败->" + cil.CameraId + "->" + cil.CameraDeviceLable + "->" +
                                       cil.CameraChannelLable + "->" + "(TCP:" + cil.IfGb28181Tcp + ")->" +
                                       JsonHelper.ToJson(rs));
                }
            }
            catch (Exception ex)
            {
                Logger.Logger.Error("liveGB28181 Except -> " + ex.Message + "->" + ex.StackTrace);
            }
        }
예제 #18
0
        public void LookAtTest()
        {
            CameraInstance cameraInstance = new CameraInstance(new Camera(new PerspectiveProjection()));

              Vector3F position = new Vector3F(1, 2, 3);
              Vector3F target = new Vector3F(2, 5, 4);
              Vector3F upVector = new Vector3F(1, 1, 1);

              cameraInstance.PoseWorld = new Pose(new Vector3F(1, 2, 3));
              Matrix44F expected = Matrix44F.CreateLookAt(position, target, upVector);
              cameraInstance.LookAt(target, upVector);
              Assert.That(Matrix44F.AreNumericallyEqual(expected, cameraInstance.View));

              position = new Vector3F(-2, 3, -7.5f);
              expected = Matrix44F.CreateLookAt(position, target, upVector);
              cameraInstance.LookAt(position, target, upVector);
              Assert.That(Vector3F.AreNumericallyEqual(position, cameraInstance.PoseWorld.Position));
              Assert.That(Matrix44F.AreNumericallyEqual(expected, cameraInstance.View));
        }
예제 #19
0
        /// <summary>
        /// 从注册摄像头列表中获取摄像头实例
        /// </summary>
        /// <param name="session"></param>
        /// <returns></returns>
        private static CameraInstance getCameraFromCameraInstance(CameraSession session)
        {
            lock (Common.CameraInstanceListLock)
            {
                if (Common.CameraInstanceList != null && Common.CameraInstanceList.Count() > 0)
                {
                    foreach (var camera in Common.CameraInstanceList)
                    {
                        if (camera != null && camera.CameraChannelLable.Equals(session.CameraEx.Camera.DeviceID) &&
                            camera.CameraDeviceLable.Equals(session.CameraEx.Camera.ParentID))
                        {
                            CameraInstance tmp = null;
                            return(JsonHelper.FromJson <CameraInstance>(JsonHelper.ToJson(camera)));
                        }
                    }
                }
            }

            return(null);
        }
예제 #20
0
        public void LookAtTest()
        {
            CameraInstance cameraInstance = new CameraInstance(new Camera(new PerspectiveProjection()));

            Vector3 position = new Vector3(1, 2, 3);
            Vector3 target   = new Vector3(2, 5, 4);
            Vector3 upVector = new Vector3(1, 1, 1);

            cameraInstance.PoseWorld = new Pose(new Vector3(1, 2, 3));
            Matrix expected = Matrix.CreateLookAt(position, target, upVector);

            cameraInstance.LookAt(target, upVector);
            Assert.That(Matrix.AreNumericallyEqual(expected, cameraInstance.View));

            position = new Vector3(-2, 3, -7.5f);
            expected = Matrix.CreateLookAt(position, target, upVector);
            cameraInstance.LookAt(position, target, upVector);
            Assert.That(Vector3.AreNumericallyEqual(position, cameraInstance.PoseWorld.Position));
            Assert.That(Matrix.AreNumericallyEqual(expected, cameraInstance.View));
        }
예제 #21
0
        public void ViewTest()
        {
            CameraInstance cameraInstance = new CameraInstance(new Camera(new PerspectiveProjection()));

            Assert.AreEqual(Matrix.Identity, cameraInstance.View);
            Assert.AreEqual(Matrix.Identity, cameraInstance.ViewInverse);

            Vector3 position = new Vector3(1, 2, 3);
            Vector3 target   = new Vector3(2, 5, 4);
            Vector3 upVector = new Vector3(1, 1, 1);
            Matrix  view     = Matrix.CreateLookAt(position, target, upVector);

            cameraInstance.View = view;

            Assert.AreEqual(view, cameraInstance.View);
            Assert.AreEqual(view.Inverse, cameraInstance.ViewInverse);

            Vector3 originOfCamera = cameraInstance.PoseWorld.Position;

            originOfCamera = cameraInstance.View.TransformPosition(originOfCamera);
            Assert.IsTrue(Vector3.AreNumericallyEqual(Vector3.Zero, originOfCamera));

            Vector4 positionView = new Vector4(0, 0, -1, 1);
            Vector4 positionView2;

            // Transform a point from view space to world space.
            Vector4 positionWorld  = cameraInstance.PoseWorld * positionView;
            Vector4 positionWorld2 = cameraInstance.ViewInverse * positionView;

            Assert.IsTrue(Vector4.AreNumericallyEqual(positionWorld, positionWorld2));

            // Transform a point from world space to view space.
            positionView  = cameraInstance.PoseWorld.Inverse * positionWorld;
            positionView2 = cameraInstance.View * positionWorld;
            Assert.IsTrue(Vector4.AreNumericallyEqual(positionView, positionView2));

            cameraInstance.View = Matrix.Identity;
            Assert.AreEqual(Vector3.Zero, cameraInstance.PoseWorld.Position);
            Assert.AreEqual(Matrix.Identity, cameraInstance.PoseWorld.Orientation);
        }
예제 #22
0
        public void ViewTest()
        {
            CameraInstance cameraInstance = new CameraInstance(new Camera(new PerspectiveProjection()));
              Assert.AreEqual(Matrix44F.Identity, cameraInstance.View);
              Assert.AreEqual(Matrix44F.Identity, cameraInstance.ViewInverse);

              Vector3F position = new Vector3F(1, 2, 3);
              Vector3F target = new Vector3F(2, 5, 4);
              Vector3F upVector = new Vector3F(1, 1, 1);
              Matrix44F view = Matrix44F.CreateLookAt(position, target, upVector);

              cameraInstance.View = view;

              Assert.AreEqual(view, cameraInstance.View);
              Assert.AreEqual(view.Inverse, cameraInstance.ViewInverse);

              Vector3F originOfCamera = cameraInstance.PoseWorld.Position;
              originOfCamera = cameraInstance.View.TransformPosition(originOfCamera);
              Assert.IsTrue(Vector3F.AreNumericallyEqual(Vector3F.Zero, originOfCamera));

              Vector4F positionView = new Vector4F(0, 0, -1, 1);
              Vector4F positionView2;

              // Transform a point from view space to world space.
              Vector4F positionWorld = cameraInstance.PoseWorld * positionView;
              Vector4F positionWorld2 = cameraInstance.ViewInverse * positionView;
              Assert.IsTrue(Vector4F.AreNumericallyEqual(positionWorld, positionWorld2));

              // Transform a point from world space to view space.
              positionView = cameraInstance.PoseWorld.Inverse * positionWorld;
              positionView2 = cameraInstance.View * positionWorld;
              Assert.IsTrue(Vector4F.AreNumericallyEqual(positionView, positionView2));

              cameraInstance.View = Matrix44F.Identity;
              Assert.AreEqual(Vector3F.Zero, cameraInstance.PoseWorld.Position);
              Assert.AreEqual(Matrix33F.Identity, cameraInstance.PoseWorld.Orientation);
        }
        public void PerspectiveOffCenterTest()
        {
            Vector3F position = new Vector3F(1, 2, 3);
              QuaternionF orientation = QuaternionF.CreateRotation(new Vector3F(2, 3, 6), 0.123f);
              CameraInstance cameraInstance = new CameraInstance(new Camera(new PerspectiveProjection()))
              {
            PoseLocal = new Pose(position, orientation),
              };
              ((PerspectiveProjection)cameraInstance.Camera.Projection).SetOffCenter(1, 5, 2, 5, 1, 10);

              Matrix44F projection = Matrix44F.CreatePerspectiveOffCenter(1, 5, 2, 5, 1, 10);
              Assert.AreEqual(position, cameraInstance.PoseWorld.Position);
              Assert.AreEqual(orientation.ToRotationMatrix33(), cameraInstance.PoseWorld.Orientation);
              Assert.IsTrue(Numeric.AreEqual(MathHelper.ToRadians(33.690067f), cameraInstance.Camera.Projection.FieldOfViewX));
              Assert.IsTrue(Numeric.AreEqual(MathHelper.ToRadians(15.255119f), cameraInstance.Camera.Projection.FieldOfViewY));
              Assert.AreEqual(4.0f / 3.0f, cameraInstance.Camera.Projection.AspectRatio);
              Assert.AreEqual(4, cameraInstance.Camera.Projection.Width);
              Assert.AreEqual(3, cameraInstance.Camera.Projection.Height);
              Assert.AreEqual(1, cameraInstance.Camera.Projection.Left);
              Assert.AreEqual(5, cameraInstance.Camera.Projection.Right);
              Assert.AreEqual(2, cameraInstance.Camera.Projection.Bottom);
              Assert.AreEqual(5, cameraInstance.Camera.Projection.Top);
              Assert.AreEqual(1, cameraInstance.Camera.Projection.Near);
              Assert.AreEqual(10, cameraInstance.Camera.Projection.Far);
              Assert.AreEqual(9, cameraInstance.Camera.Projection.Depth);
              Assert.IsTrue(Matrix44F.AreNumericallyEqual(projection, cameraInstance.Camera.Projection));
              Assert.IsTrue(Matrix44F.AreNumericallyEqual(projection.Inverse, cameraInstance.Camera.Projection.Inverse));
              Assert.IsNotNull(cameraInstance.BoundingShape);

              // Test shape using collision detection. Remove rotation to simplify test.
              cameraInstance.PoseWorld = new Pose(cameraInstance.PoseWorld.Position);
              CollisionDetection collisionDetection = new CollisionDetection();
              var point = new PointShape();
              CollisionObject pointCollisionObject = new CollisionObject(new GeometricObject(point));
              CollisionObject cameraCollisionObject = new CollisionObject(cameraInstance);

              point.Position = position + new Vector3F(3, 3, -1);
              Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(30, 30, -10);
              Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(3, 3, -0.9f);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(30, 30, -10.1f);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));

              point.Position = position + new Vector3F(1, 2, -1);
              Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(0.9f, 2, -1);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(1, 1.9f, -1);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(5, 5, -1);
              Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(5.1f, 5, -1);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(5, 5.1f, -1);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));

              point.Position = position + new Vector3F(10, 20, -10);
              Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(9.9f, 20, -10);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(10, 19.9f, -10);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(50, 50, -10);
              Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(50.1f, 50, -10);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(50, 50.1f, -10);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
        }
        public void OrthographicTest()
        {
            Vector3F position = new Vector3F(1, 2, 3);
              QuaternionF orientation = QuaternionF.CreateRotation(new Vector3F(2, 3, 6), 0.123f);
              CameraInstance cameraInstance = new CameraInstance(new Camera(new OrthographicProjection()))
              {
            PoseLocal = new Pose(position, orientation),
              };

              ((OrthographicProjection)cameraInstance.Camera.Projection).Set(4, 3, 2, 10);
              Matrix44F projection = Matrix44F.CreateOrthographic(4, 3, 2, 10);
              Assert.AreEqual(position, cameraInstance.PoseWorld.Position);
              Assert.AreEqual(orientation.ToRotationMatrix33(), cameraInstance.PoseWorld.Orientation);
              Assert.AreEqual(4, cameraInstance.Camera.Projection.Width);
              Assert.AreEqual(3, cameraInstance.Camera.Projection.Height);
              Assert.AreEqual(4.0f / 3.0f, cameraInstance.Camera.Projection.AspectRatio);
              Assert.AreEqual(2, cameraInstance.Camera.Projection.Near);
              Assert.AreEqual(10, cameraInstance.Camera.Projection.Far);
              Assert.AreEqual(-2, cameraInstance.Camera.Projection.Left);
              Assert.AreEqual(2, cameraInstance.Camera.Projection.Right);
              Assert.AreEqual(-1.5f, cameraInstance.Camera.Projection.Bottom);
              Assert.AreEqual(1.5f, cameraInstance.Camera.Projection.Top);
              Assert.AreEqual(8, cameraInstance.Camera.Projection.Depth);
              Assert.IsTrue(Matrix44F.AreNumericallyEqual(projection, cameraInstance.Camera.Projection));
              Assert.IsTrue(Matrix44F.AreNumericallyEqual(projection.Inverse, cameraInstance.Camera.Projection.Inverse));
              Assert.IsNotNull(cameraInstance.BoundingShape);

              // Test shape using collision detection. Remove rotation to simplify test.
              cameraInstance.PoseWorld = new Pose(cameraInstance.PoseWorld.Position);
              CollisionDetection collisionDetection = new CollisionDetection();
              var point = new PointShape();
              CollisionObject pointCollisionObject = new CollisionObject(new GeometricObject(point));
              CollisionObject cameraCollisionObject = new CollisionObject(cameraInstance);

              point.Position = position + new Vector3F(-2, -1.5f, -2);
              Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(-2.1f, -1.6f, -1.9f);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(2, 1.5f, -10);
              Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(2.1f, 1.6f, -10.1f);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));

              cameraInstance.PoseWorld = new Pose(position, orientation);
              ((OrthographicProjection)cameraInstance.Camera.Projection).Set(8, 4, 1, 100);
              cameraInstance.Camera.Projection.Near = 1;
              cameraInstance.Camera.Projection.Far = 100;
              projection = Matrix44F.CreateOrthographic(8, 4, 1, 100);
              Assert.IsTrue(Matrix44F.AreNumericallyEqual(projection.Inverse, cameraInstance.Camera.Projection.Inverse));
              Assert.IsTrue(Matrix44F.AreNumericallyEqual(projection, cameraInstance.Camera.Projection));

              // Test shape using collision detection. Remove rotation to simplify test.
              cameraInstance.PoseWorld = new Pose(cameraInstance.PoseWorld.Position);
              point.Position = position + new Vector3F(-4, -2f, -1);
              Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(-4.1f, -1.9f, -0.9f);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(4, 2f, -100);
              Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(4.1f, 2.1f, -100.1f);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
        }
예제 #25
0
        public void OrthographicTest()
        {
            Vector3F       position       = new Vector3F(1, 2, 3);
            QuaternionF    orientation    = QuaternionF.CreateRotation(new Vector3F(2, 3, 6), 0.123f);
            CameraInstance cameraInstance = new CameraInstance(new Camera(new OrthographicProjection()))
            {
                PoseLocal = new Pose(position, orientation),
            };

            ((OrthographicProjection)cameraInstance.Camera.Projection).Set(4, 3, 2, 10);
            Matrix44F projection = Matrix44F.CreateOrthographic(4, 3, 2, 10);

            Assert.AreEqual(position, cameraInstance.PoseWorld.Position);
            Assert.AreEqual(orientation.ToRotationMatrix33(), cameraInstance.PoseWorld.Orientation);
            Assert.AreEqual(4, cameraInstance.Camera.Projection.Width);
            Assert.AreEqual(3, cameraInstance.Camera.Projection.Height);
            Assert.AreEqual(4.0f / 3.0f, cameraInstance.Camera.Projection.AspectRatio);
            Assert.AreEqual(2, cameraInstance.Camera.Projection.Near);
            Assert.AreEqual(10, cameraInstance.Camera.Projection.Far);
            Assert.AreEqual(-2, cameraInstance.Camera.Projection.Left);
            Assert.AreEqual(2, cameraInstance.Camera.Projection.Right);
            Assert.AreEqual(-1.5f, cameraInstance.Camera.Projection.Bottom);
            Assert.AreEqual(1.5f, cameraInstance.Camera.Projection.Top);
            Assert.AreEqual(8, cameraInstance.Camera.Projection.Depth);
            Assert.IsTrue(Matrix44F.AreNumericallyEqual(projection, cameraInstance.Camera.Projection));
            Assert.IsTrue(Matrix44F.AreNumericallyEqual(projection.Inverse, cameraInstance.Camera.Projection.Inverse));
            Assert.IsNotNull(cameraInstance.BoundingShape);

            // Test shape using collision detection. Remove rotation to simplify test.
            cameraInstance.PoseWorld = new Pose(cameraInstance.PoseWorld.Position);
            CollisionDetection collisionDetection = new CollisionDetection();
            var             point = new PointShape();
            CollisionObject pointCollisionObject  = new CollisionObject(new GeometricObject(point));
            CollisionObject cameraCollisionObject = new CollisionObject(cameraInstance);

            point.Position = position + new Vector3F(-2, -1.5f, -2);
            Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
            point.Position = position + new Vector3F(-2.1f, -1.6f, -1.9f);
            Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
            point.Position = position + new Vector3F(2, 1.5f, -10);
            Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
            point.Position = position + new Vector3F(2.1f, 1.6f, -10.1f);
            Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));

            cameraInstance.PoseWorld = new Pose(position, orientation);
            ((OrthographicProjection)cameraInstance.Camera.Projection).Set(8, 4, 1, 100);
            cameraInstance.Camera.Projection.Near = 1;
            cameraInstance.Camera.Projection.Far  = 100;
            projection = Matrix44F.CreateOrthographic(8, 4, 1, 100);
            Assert.IsTrue(Matrix44F.AreNumericallyEqual(projection.Inverse, cameraInstance.Camera.Projection.Inverse));
            Assert.IsTrue(Matrix44F.AreNumericallyEqual(projection, cameraInstance.Camera.Projection));

            // Test shape using collision detection. Remove rotation to simplify test.
            cameraInstance.PoseWorld = new Pose(cameraInstance.PoseWorld.Position);
            point.Position           = position + new Vector3F(-4, -2f, -1);
            Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
            point.Position = position + new Vector3F(-4.1f, -1.9f, -0.9f);
            Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
            point.Position = position + new Vector3F(4, 2f, -100);
            Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
            point.Position = position + new Vector3F(4.1f, 2.1f, -100.1f);
            Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
        }
예제 #26
0
        public void SetProjectionTest()
        {
            Matrix44F projectionMatrix = Matrix44F.CreateOrthographicOffCenter(1, 4, 2, 5, 6, 11);
              OrthographicProjection orthographicProjection = new OrthographicProjection();
              orthographicProjection.Set(projectionMatrix);
              CameraInstance cameraInstance = new CameraInstance(new Camera(orthographicProjection));

              Assert.AreEqual(Vector3F.Zero, cameraInstance.PoseWorld.Position);
              Assert.AreEqual(Matrix33F.Identity, cameraInstance.PoseWorld.Orientation);
              Assert.That(Numeric.AreEqual(3, cameraInstance.Camera.Projection.Width));
              Assert.That(Numeric.AreEqual(3, cameraInstance.Camera.Projection.Height));
              Assert.That(Numeric.AreEqual(1f, cameraInstance.Camera.Projection.AspectRatio));
              Assert.That(Numeric.AreEqual(6, cameraInstance.Camera.Projection.Near));
              Assert.That(Numeric.AreEqual(11, cameraInstance.Camera.Projection.Far));
              Assert.That(Numeric.AreEqual(1, cameraInstance.Camera.Projection.Left));
              Assert.That(Numeric.AreEqual(4, cameraInstance.Camera.Projection.Right));
              Assert.That(Numeric.AreEqual(2, cameraInstance.Camera.Projection.Bottom));
              Assert.That(Numeric.AreEqual(5, cameraInstance.Camera.Projection.Top));
              Assert.That(Numeric.AreEqual(5, cameraInstance.Camera.Projection.Depth));
              Assert.That(Matrix44F.AreNumericallyEqual(orthographicProjection, cameraInstance.Camera.Projection));
              Assert.That(Matrix44F.AreNumericallyEqual(orthographicProjection.Inverse, cameraInstance.Camera.Projection.Inverse));
              Assert.IsNotNull(cameraInstance.BoundingShape);

              PerspectiveProjection perspectiveProjection = new PerspectiveProjection();
              perspectiveProjection.Inverse = Matrix44F.CreatePerspectiveOffCenter(1, 5, 2, 5, 1, 10).Inverse;
              cameraInstance = new CameraInstance(new Camera(perspectiveProjection));

              Assert.AreEqual(Vector3F.Zero, cameraInstance.PoseWorld.Position);
              Assert.AreEqual(Matrix33F.Identity, cameraInstance.PoseWorld.Orientation);
              Assert.That(Numeric.AreEqual(MathHelper.ToRadians(33.690067f), cameraInstance.Camera.Projection.FieldOfViewX));
              Assert.That(Numeric.AreEqual(MathHelper.ToRadians(15.255119f), cameraInstance.Camera.Projection.FieldOfViewY));
              Assert.That(Numeric.AreEqual(4, cameraInstance.Camera.Projection.Width));
              Assert.That(Numeric.AreEqual(3, cameraInstance.Camera.Projection.Height));
              Assert.That(Numeric.AreEqual(4.0f / 3.0f, cameraInstance.Camera.Projection.AspectRatio));
              Assert.That(Numeric.AreEqual(1, cameraInstance.Camera.Projection.Left));
              Assert.That(Numeric.AreEqual(5, cameraInstance.Camera.Projection.Right));
              Assert.That(Numeric.AreEqual(2, cameraInstance.Camera.Projection.Bottom));
              Assert.That(Numeric.AreEqual(5, cameraInstance.Camera.Projection.Top));
              Assert.That(Numeric.AreEqual(1, cameraInstance.Camera.Projection.Near));
              Assert.That(Numeric.AreEqual(10, cameraInstance.Camera.Projection.Far));
              Assert.That(Numeric.AreEqual(9, cameraInstance.Camera.Projection.Depth));
              Assert.IsNotNull(cameraInstance.BoundingShape);
        }
        public void PerspectiveTest()
        {
            Vector3F       position       = new Vector3F(1, 2, 3);
            QuaternionF    orientation    = QuaternionF.CreateRotation(new Vector3F(2, 3, 6), 0.123f);
            CameraInstance cameraInstance = new CameraInstance(new Camera(new PerspectiveProjection()))
            {
                PoseLocal = new Pose(position, orientation),
            };

            ((PerspectiveProjection)cameraInstance.Camera.Projection).SetFieldOfView(MathHelper.ToRadians(60), 16.0f / 10.0f, 1, 10);
            Matrix44F projection = Matrix44F.CreatePerspectiveFieldOfView(MathHelper.ToRadians(60), 16.0f / 10.0f, 1, 10);

            Assert.AreEqual(position, cameraInstance.PoseWorld.Position);
            Assert.AreEqual(orientation.ToRotationMatrix33(), cameraInstance.PoseWorld.Orientation);
            Assert.AreEqual(MathHelper.ToRadians(60), cameraInstance.Camera.Projection.FieldOfViewY);
            Assert.IsTrue(Numeric.AreEqual(MathHelper.ToRadians(85.4601055f), cameraInstance.Camera.Projection.FieldOfViewX));
            Assert.AreEqual(16.0f / 10.0f, cameraInstance.Camera.Projection.AspectRatio);
            Assert.IsTrue(Numeric.AreEqual(1.8475209f, cameraInstance.Camera.Projection.Width));
            Assert.IsTrue(Numeric.AreEqual(1.1547005f, cameraInstance.Camera.Projection.Height));
            Assert.AreEqual(1, cameraInstance.Camera.Projection.Near);
            Assert.AreEqual(10, cameraInstance.Camera.Projection.Far);
            Assert.IsTrue(Numeric.AreEqual(-0.9237604f, cameraInstance.Camera.Projection.Left));
            Assert.IsTrue(Numeric.AreEqual(0.9237604f, cameraInstance.Camera.Projection.Right));
            Assert.IsTrue(Numeric.AreEqual(-0.5773503f, cameraInstance.Camera.Projection.Bottom));
            Assert.IsTrue(Numeric.AreEqual(0.5773503f, cameraInstance.Camera.Projection.Top));
            Assert.AreEqual(9, cameraInstance.Camera.Projection.Depth);
            Assert.IsTrue(Matrix44F.AreNumericallyEqual(projection, cameraInstance.Camera.Projection));
            Assert.IsTrue(Matrix44F.AreNumericallyEqual(projection.Inverse, cameraInstance.Camera.Projection.Inverse));
            Assert.IsNotNull(cameraInstance.BoundingShape);

            // Test shape using collision detection. Remove rotation to simplify test.
            cameraInstance.PoseWorld = new Pose(cameraInstance.PoseWorld.Position);
            CollisionDetection collisionDetection = new CollisionDetection();
            var             point = new PointShape();
            CollisionObject pointCollisionObject  = new CollisionObject(new GeometricObject(point));
            CollisionObject cameraCollisionObject = new CollisionObject(cameraInstance);

            point.Position = position + new Vector3F(0, 0, -1);
            Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
            point.Position = position + new Vector3F(0, 0, -10);
            Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
            point.Position = position + new Vector3F(0, 0, -0.9f);
            Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
            point.Position = position + new Vector3F(0, 0, -10.1f);
            Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));

            point.Position = position + new Vector3F(-0.9237604f, -0.5773f, -1);
            Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
            point.Position = position + new Vector3F(-0.924f, -0.5773f, -1);
            Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
            point.Position = position + new Vector3F(-0.9237604f, -0.58f, -1);
            Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
            point.Position = position + new Vector3F(0.9237604f, 0.5773f, -1);
            Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
            point.Position = position + new Vector3F(0.924f, 0.5773f, -1);
            Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
            point.Position = position + new Vector3F(0.9237604f, 0.58f, -1);
            Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));

            point.Position = position + new Vector3F(-9.237604f, -5.773f, -10);
            Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
            point.Position = position + new Vector3F(-9.24f, -5.773f, -10);
            Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
            point.Position = position + new Vector3F(-9.237604f, -5.8f, -10);
            Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
            point.Position = position + new Vector3F(9.237604f, 5.773f, -10);
            Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
            point.Position = position + new Vector3F(9.24f, 5.773f, -10);
            Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
            point.Position = position + new Vector3F(9.237604f, 5.8f, -10);
            Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
        }
        public void PerspectiveOffCenterTest()
        {
            Vector3F       position       = new Vector3F(1, 2, 3);
            QuaternionF    orientation    = QuaternionF.CreateRotation(new Vector3F(2, 3, 6), 0.123f);
            CameraInstance cameraInstance = new CameraInstance(new Camera(new PerspectiveProjection()))
            {
                PoseLocal = new Pose(position, orientation),
            };

            ((PerspectiveProjection)cameraInstance.Camera.Projection).SetOffCenter(1, 5, 2, 5, 1, 10);

            Matrix44F projection = Matrix44F.CreatePerspectiveOffCenter(1, 5, 2, 5, 1, 10);

            Assert.AreEqual(position, cameraInstance.PoseWorld.Position);
            Assert.AreEqual(orientation.ToRotationMatrix33(), cameraInstance.PoseWorld.Orientation);
            Assert.IsTrue(Numeric.AreEqual(MathHelper.ToRadians(33.690067f), cameraInstance.Camera.Projection.FieldOfViewX));
            Assert.IsTrue(Numeric.AreEqual(MathHelper.ToRadians(15.255119f), cameraInstance.Camera.Projection.FieldOfViewY));
            Assert.AreEqual(4.0f / 3.0f, cameraInstance.Camera.Projection.AspectRatio);
            Assert.AreEqual(4, cameraInstance.Camera.Projection.Width);
            Assert.AreEqual(3, cameraInstance.Camera.Projection.Height);
            Assert.AreEqual(1, cameraInstance.Camera.Projection.Left);
            Assert.AreEqual(5, cameraInstance.Camera.Projection.Right);
            Assert.AreEqual(2, cameraInstance.Camera.Projection.Bottom);
            Assert.AreEqual(5, cameraInstance.Camera.Projection.Top);
            Assert.AreEqual(1, cameraInstance.Camera.Projection.Near);
            Assert.AreEqual(10, cameraInstance.Camera.Projection.Far);
            Assert.AreEqual(9, cameraInstance.Camera.Projection.Depth);
            Assert.IsTrue(Matrix44F.AreNumericallyEqual(projection, cameraInstance.Camera.Projection));
            Assert.IsTrue(Matrix44F.AreNumericallyEqual(projection.Inverse, cameraInstance.Camera.Projection.Inverse));
            Assert.IsNotNull(cameraInstance.BoundingShape);

            // Test shape using collision detection. Remove rotation to simplify test.
            cameraInstance.PoseWorld = new Pose(cameraInstance.PoseWorld.Position);
            CollisionDetection collisionDetection = new CollisionDetection();
            var             point = new PointShape();
            CollisionObject pointCollisionObject  = new CollisionObject(new GeometricObject(point));
            CollisionObject cameraCollisionObject = new CollisionObject(cameraInstance);

            point.Position = position + new Vector3F(3, 3, -1);
            Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
            point.Position = position + new Vector3F(30, 30, -10);
            Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
            point.Position = position + new Vector3F(3, 3, -0.9f);
            Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
            point.Position = position + new Vector3F(30, 30, -10.1f);
            Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));

            point.Position = position + new Vector3F(1, 2, -1);
            Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
            point.Position = position + new Vector3F(0.9f, 2, -1);
            Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
            point.Position = position + new Vector3F(1, 1.9f, -1);
            Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
            point.Position = position + new Vector3F(5, 5, -1);
            Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
            point.Position = position + new Vector3F(5.1f, 5, -1);
            Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
            point.Position = position + new Vector3F(5, 5.1f, -1);
            Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));

            point.Position = position + new Vector3F(10, 20, -10);
            Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
            point.Position = position + new Vector3F(9.9f, 20, -10);
            Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
            point.Position = position + new Vector3F(10, 19.9f, -10);
            Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
            point.Position = position + new Vector3F(50, 50, -10);
            Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
            point.Position = position + new Vector3F(50.1f, 50, -10);
            Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
            point.Position = position + new Vector3F(50, 50.1f, -10);
            Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
        }
예제 #29
0
        public void ShapeChangedTest()
        {
            bool shapeChanged = false;
              CameraInstance cameraInstance = new CameraInstance(new Camera(new PerspectiveProjection()));
              cameraInstance.BoundingShapeChanged += (sender, eventArgs) => shapeChanged = true;

              cameraInstance.Camera.Projection.Far = 9;
              Assert.IsTrue(shapeChanged);
        }
예제 #30
0
        /// <summary>
        /// 启动摄像头
        /// </summary>
        /// <param name="cil"></param>
        private static void liveCamera(CameraInstance cil)
        {
            try
            {
                CameraSession cameraSession = null !;
                if (cil != null && cil.EnableLive)
                {
                    cameraSession = GetCameraCurrentSession(cil);

                    if (cameraSession == null || (cameraSession != null && cameraSession.IsOnline == false)
                        ) //camera没有,或者isonline是false要推流
                    {
                        CameraType ctype = cameraSession != null ? cameraSession.CameraType : cil.CameraType;
                        switch (ctype)
                        {
                        case CameraType.Rtsp:

                            liveRtsp(cil);

                            break;

                        case CameraType.GB28181:

                            bool found = false;
                            lock (Common.SipProcess.SipDeviceLock)
                            {
                                var dev = Common.SipProcess.SipDeviceList.FindLast(x =>
                                                                                   x.DeviceId.Equals(cil.CameraDeviceLable));
                                if (dev != null && dev.CameraExList != null && dev.CameraExList.Count > 0)
                                {
                                    var camera = dev.CameraExList.FindLast(x =>
                                                                           x.Camera != null && x.Camera.DeviceID.Equals(cil.CameraChannelLable));
                                    if (camera != null)
                                    {
                                        found = true;
                                    }
                                }
                            }

                            if (found)

                            {
                                LiveGb28181(cil);
                            }

                            break;
                        }
                    }
                    else if (cameraSession != null && string.IsNullOrEmpty(cameraSession.CameraId) &&
                             cameraSession.IsOnline == true
                             ) //当camera不为空,但camera.cameraid为空时,不需要重新推,但要补全这个id
                    {
                        CameraSession sessionsub = null !;
                        lock (Common.CameraSessionLock)
                        {
                            sessionsub = Common.CameraSessions.FindLast(x =>
                                                                        x.App !.Equals(cameraSession.App) &&
                                                                        x.Vhost !.Equals(cameraSession.Vhost) &&
                                                                        x.StreamId !.Equals(cameraSession.StreamId)) !;
                        }


                        if (sessionsub != null)
                        {
                            lock (Common.CameraSessionLock)
                            {
                                cameraSession.CameraId = cil.CameraId;
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Logger.Error("liveCamera Except -> " + ex.Message + "->" + ex.StackTrace);
            }
        }
        public void OrthographicOffCenterTest()
        {
            Vector3        position       = new Vector3(1, 2, 3);
            Quaternion     orientation    = Quaternion.CreateFromRotationMatrix(new Vector3(2, 3, 6), 0.123f);
            CameraInstance cameraInstance = new CameraInstance(new Camera(new OrthographicProjection()))
            {
                PoseLocal = new Pose(position, orientation),
            };

            ((OrthographicProjection)cameraInstance.Camera.Projection).SetOffCenter(0, 16, 0, 9, 2, 10);
            Matrix projection = Matrix.CreateOrthographicOffCenter(0, 16, 0, 9, 2, 10);

            Assert.AreEqual(position, cameraInstance.PoseWorld.Position);
            Assert.AreEqual(orientation.ToRotationMatrix33(), cameraInstance.PoseWorld.Orientation);
            Assert.AreEqual(16, cameraInstance.Camera.Projection.Width);
            Assert.AreEqual(9, cameraInstance.Camera.Projection.Height);
            Assert.AreEqual(16.0f / 9.0f, cameraInstance.Camera.Projection.AspectRatio);
            Assert.AreEqual(2, cameraInstance.Camera.Projection.Near);
            Assert.AreEqual(10, cameraInstance.Camera.Projection.Far);
            Assert.AreEqual(0, cameraInstance.Camera.Projection.Left);
            Assert.AreEqual(16, cameraInstance.Camera.Projection.Right);
            Assert.AreEqual(0, cameraInstance.Camera.Projection.Bottom);
            Assert.AreEqual(9, cameraInstance.Camera.Projection.Top);
            Assert.AreEqual(8, cameraInstance.Camera.Projection.Depth);
            Assert.IsTrue(Matrix.AreNumericallyEqual(projection, cameraInstance.Camera.Projection));
            Assert.IsTrue(Matrix.AreNumericallyEqual(projection.Inverse, cameraInstance.Camera.Projection.Inverse));
            Assert.IsNotNull(cameraInstance.BoundingShape);

            CollisionDetection collisionDetection = new CollisionDetection();
            var             point = new PointShape();
            CollisionObject pointCollisionObject  = new CollisionObject(new GeometricObject(point));
            CollisionObject cameraCollisionObject = new CollisionObject(cameraInstance);

            // Test shape using collision detection. Remove rotation to simplify test.
            cameraInstance.PoseWorld = new Pose(cameraInstance.PoseWorld.Position);
            point.Position           = position + new Vector3(0, 0, -2);
            Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
            point.Position = position + new Vector3(-0.1f, -0.1f, -1.9f);
            Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
            point.Position = position + new Vector3(16, 9, -10);
            Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
            point.Position = position + new Vector3(16.1f, 9.1f, -10.1f);
            Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));

            cameraInstance.Camera.Projection.Left   = -2;
            cameraInstance.Camera.Projection.Right  = 4;
            cameraInstance.Camera.Projection.Bottom = 10;
            cameraInstance.Camera.Projection.Top    = 14;
            cameraInstance.Camera.Projection.Near   = 15;
            cameraInstance.Camera.Projection.Far    = 100;
            projection = Matrix.CreateOrthographicOffCenter(-2, 4, 10, 14, 15, 100);
            Assert.IsTrue(Matrix.AreNumericallyEqual(projection.Inverse, cameraInstance.Camera.Projection.Inverse));
            Assert.IsTrue(Matrix.AreNumericallyEqual(projection, cameraInstance.Camera.Projection));

            // Test shape using collision detection. Remove rotation to simplify test.
            cameraInstance.PoseWorld = new Pose(cameraInstance.PoseWorld.Position);
            point.Position           = position + new Vector3(-2, 10, -15);
            Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
            point.Position = position + new Vector3(-2.1f, -10.1f, -14.9f);
            Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
            point.Position = position + new Vector3(4, 14, -100);
            Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
            point.Position = position + new Vector3(4.1f, 14.1f, -100.1f);
            Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
        }
        public void PerspectiveTest()
        {
            Vector3F position = new Vector3F(1, 2, 3);
              QuaternionF orientation = QuaternionF.CreateRotation(new Vector3F(2, 3, 6), 0.123f);
              CameraInstance cameraInstance = new CameraInstance(new Camera(new PerspectiveProjection()))
              {
            PoseLocal = new Pose(position, orientation),
              };

              ((PerspectiveProjection)cameraInstance.Camera.Projection).SetFieldOfView(MathHelper.ToRadians(60), 16.0f / 10.0f, 1, 10);
              Matrix44F projection = Matrix44F.CreatePerspectiveFieldOfView(MathHelper.ToRadians(60), 16.0f / 10.0f, 1, 10);
              Assert.AreEqual(position, cameraInstance.PoseWorld.Position);
              Assert.AreEqual(orientation.ToRotationMatrix33(), cameraInstance.PoseWorld.Orientation);
              Assert.AreEqual(MathHelper.ToRadians(60), cameraInstance.Camera.Projection.FieldOfViewY);
              Assert.IsTrue(Numeric.AreEqual(MathHelper.ToRadians(85.4601055f), cameraInstance.Camera.Projection.FieldOfViewX));
              Assert.AreEqual(16.0f / 10.0f, cameraInstance.Camera.Projection.AspectRatio);
              Assert.IsTrue(Numeric.AreEqual(1.8475209f, cameraInstance.Camera.Projection.Width));
              Assert.IsTrue(Numeric.AreEqual(1.1547005f, cameraInstance.Camera.Projection.Height));
              Assert.AreEqual(1, cameraInstance.Camera.Projection.Near);
              Assert.AreEqual(10, cameraInstance.Camera.Projection.Far);
              Assert.IsTrue(Numeric.AreEqual(-0.9237604f, cameraInstance.Camera.Projection.Left));
              Assert.IsTrue(Numeric.AreEqual(0.9237604f, cameraInstance.Camera.Projection.Right));
              Assert.IsTrue(Numeric.AreEqual(-0.5773503f, cameraInstance.Camera.Projection.Bottom));
              Assert.IsTrue(Numeric.AreEqual(0.5773503f, cameraInstance.Camera.Projection.Top));
              Assert.AreEqual(9, cameraInstance.Camera.Projection.Depth);
              Assert.IsTrue(Matrix44F.AreNumericallyEqual(projection, cameraInstance.Camera.Projection));
              Assert.IsTrue(Matrix44F.AreNumericallyEqual(projection.Inverse, cameraInstance.Camera.Projection.Inverse));
              Assert.IsNotNull(cameraInstance.BoundingShape);

              // Test shape using collision detection. Remove rotation to simplify test.
              cameraInstance.PoseWorld = new Pose(cameraInstance.PoseWorld.Position);
              CollisionDetection collisionDetection = new CollisionDetection();
              var point = new PointShape();
              CollisionObject pointCollisionObject = new CollisionObject(new GeometricObject(point));
              CollisionObject cameraCollisionObject = new CollisionObject(cameraInstance);

              point.Position = position + new Vector3F(0, 0, -1);
              Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(0, 0, -10);
              Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(0, 0, -0.9f);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(0, 0, -10.1f);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));

              point.Position = position + new Vector3F(-0.9237604f, -0.5773f, -1);
              Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(-0.924f, -0.5773f, -1);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(-0.9237604f, -0.58f, -1);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(0.9237604f, 0.5773f, -1);
              Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(0.924f, 0.5773f, -1);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(0.9237604f, 0.58f, -1);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));

              point.Position = position + new Vector3F(-9.237604f, -5.773f, -10);
              Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(-9.24f, -5.773f, -10);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(-9.237604f, -5.8f, -10);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(9.237604f, 5.773f, -10);
              Assert.IsTrue(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(9.24f, 5.773f, -10);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
              point.Position = position + new Vector3F(9.237604f, 5.8f, -10);
              Assert.IsFalse(collisionDetection.HaveContact(pointCollisionObject, cameraCollisionObject));
        }
        private void Run()
        {
            int i = 0;

            while (true)
            {
                try
                {
                    i++;
                    if (Common.MediaServerList == null || Common.MediaServerList.Count <= 0)
                    {
                        Thread.Sleep(5000);
                        continue;
                    }
                    foreach (var mediaServer in Common.MediaServerList)
                    {
                        if (mediaServer != null && mediaServer.IsRunning)
                        {
                            if (i % 50 == 0)
                            {
                                mediaServer.ClearNoFileDir(out _);     //清除空目录
                            }

                            ReqGetDvrPlan rgdp = new ReqGetDvrPlan();
                            rgdp.MediaServerId = mediaServer.MediaServerId;
                            var dvrPlanList = DvrPlanApis.GetDvrPlanList(rgdp, out ResponseStruct rs);
                            if (dvrPlanList == null || dvrPlanList.Count == 0)
                            {
                                continue;
                            }
                            foreach (var dvrPlan in dvrPlanList)
                            {
                                if (dvrPlan == null || dvrPlan.Enable == false)
                                {
                                    var ret = getDvrOnorOff(
                                        dvrPlan);     //如果录制计划为停止状态,在处理下一个计划任务前要查看该录制计划是否正在执行,正在扫行的话,要停掉它
                                    if (ret)
                                    {
                                        setDvrOnorOff(dvrPlan, false);
                                    }

                                    continue;
                                }

                                CameraInstance camera = null;
                                lock (Common.CameraInstanceList)
                                {
                                    camera =
                                        Common.CameraInstanceList.FindLast(x =>
                                                                           x.CameraId.Equals(dvrPlan.CameraId));
                                }

                                if (camera != null)
                                {
                                    ExecDelete(dvrPlan);
                                    if (camera.EnableLive &&
                                        getCameraSessionStatus(camera.PushMediaServerId, camera.CameraId))
                                    {
                                        execOnOrOff(dvrPlan);
                                    }
                                }

                                Thread.Sleep(2000);
                            }
                        }
                    }

                    Thread.Sleep(5000);
                }
                catch (Exception ex)
                {
                    Console.WriteLine("报错了:\r\n" + ex.Message + "\r\n" + ex.StackTrace);
                    continue;
                }
            }
        }
예제 #34
0
        /// <summary>
        /// 启动rtsp摄像头
        /// </summary>
        /// <param name="cil"></param>
        private static void liveRtsp(CameraInstance cil)
        {
            try
            {
                ResponseStruct rs       = null !;
                var            mediaObj =
                    Common.MediaServerList.FindLast(x => x.MediaServerId.Equals(cil.PushMediaServerId));

                if (mediaObj == null || mediaObj.IsRunning == false)
                {
                    return;
                }

                bool useFFmpeg = true;

                if (cil.RetryTimes < 2)
                {
                    //rtsp方式,先跳过三次,因为zlmediakit会自动维护掉线的ffmpeg,要延迟处理一下,不然会重复创建ffmpeg
                    cil.RetryTimes++;
                    return;
                }

                cil.RetryTimes = 0;
                ResZLMediaKitAddFFmpegProxy ret = null !;
                if (useFFmpeg)
                {
                    ret = MediaServerApis.AddFFmpegProxy(
                        mediaObj.MediaServerId,
                        cil.IfRtspUrl, out rs);
                }
                else
                {
                    ret = MediaServerApis.AddStreamProxy(mediaObj.MediaServerId,
                                                         cil.IfRtspUrl, out rs);
                }

                if (ret != null && rs.Code == ErrorNumber.None)
                {
                    Logger.Logger.Info("Rtsp推流成功->" + cil.CameraId + "->" + cil.IfRtspUrl);
                    CameraSession sessionsub = null !;
                    lock (Common.CameraSessionLock)
                    {
                        sessionsub = Common.CameraSessions.FindLast(x =>
                                                                    x.App !.Equals(ret.App) &&
                                                                    x.Vhost !.Equals(ret.Vhost) &&
                                                                    x.StreamId !.Equals(ret.StreamId)) !;
                    }

                    if (sessionsub != null)
                    {
                        lock (Common.CameraSessionLock)
                        {
                            sessionsub.CameraId = cil.CameraId;
                        }
                    }
                }
                else
                {
                    Logger.Logger.Warn(
                        "Rtsp推流失败->" + cil.CameraId + "->" + cil.IfRtspUrl + "->" + JsonHelper.ToJson(rs));
                }
            }
            catch (Exception ex)
            {
                Logger.Logger.Error("liveRtsp Except ->" + ex.Message + "->" + ex.StackTrace);
            }
        }