private void UpdateCameraDirection(Point mousePos)
        {
            if (!IsMouseCaptured || lastPoint.Equals(mousePos))
            {
                return;
            }

            var deltaX = (float)(mousePos.X - lastPoint.X) * (float)SpeedMultipler * 2;
            var deltaY = (float)(mousePos.Y - lastPoint.Y) * (float)SpeedMultipler * 2;

            var upAnchor      = Viewport.ModelUpDirection.ToNumericsVector3();
            var upVector      = Numerics.Vector3.Normalize(Viewport.Camera.UpDirection.ToNumericsVector3());
            var forwardVector = Numerics.Vector3.Normalize(Viewport.Camera.LookDirection.ToNumericsVector3());
            var rightVector   = Numerics.Vector3.Normalize(Numerics.Vector3.Cross(forwardVector, upVector));

            var yaw = Numerics.Matrix4x4.CreateFromAxisAngle(upAnchor, -deltaX);

            forwardVector = Numerics.Vector3.TransformNormal(forwardVector, yaw);
            rightVector   = Numerics.Vector3.TransformNormal(rightVector, yaw);

            var pitch = Numerics.Matrix4x4.CreateFromAxisAngle(rightVector, -deltaY);

            forwardVector = Numerics.Vector3.TransformNormal(forwardVector, pitch);
            upVector      = Numerics.Vector3.Normalize(Numerics.Vector3.Cross(rightVector, forwardVector));

            Viewport.Camera.LookDirection = new Media3D.Vector3D(forwardVector.X, forwardVector.Y, forwardVector.Z);
            Viewport.Camera.UpDirection   = new Media3D.Vector3D(upVector.X, upVector.Y, upVector.Z);

            Yaw   = Math.Atan2(forwardVector.X, forwardVector.Y);
            Pitch = Math.Asin(-forwardVector.Z);

            NativeMethods.SetCursorPos((int)lastPoint.X, (int)lastPoint.Y);
        }
        private void Timer_Tick(object sender, EventArgs e)
        {
            var cursorPos = new System.Drawing.Point();

            NativeMethods.GetCursorPos(out cursorPos);

            UpdateCameraPosition();
            UpdateCameraDirection(new Point(cursorPos.X, cursorPos.Y));
        }
 private static bool CheckKeyState(Keys keys)
 {
     return((NativeMethods.GetAsyncKeyState((int)keys) & 32768) != 0);
 }