protected override void Update(double deltaTime)
        {
            base.Update(deltaTime);

            var cam     = MMW.MainCamera;
            var prevPos = cam.Transform.Position;

            if (CameraType == "third person")
            {
                GameObject.GetComponent <MeshRenderer>().Visible = true;
                MMW.MainCamera.FoV = 1.2f;
                var center = Target != null ? Target.WorldPosition : Vector3.Zero;

                targetRot    -= Input.MouseDelta.X * 0.005f;
                targetHeight += Input.MouseDelta.Y * 0.005f;
                targetHeight  = MMWMath.Clamp(targetHeight, -MathHelper.PiOver6, MathHelper.PiOver2 - 0.3f);

                rot    = MMWMath.Lerp(rot, targetRot, (float)deltaTime * 16.0f);
                height = MMWMath.Lerp(height, targetHeight, (float)deltaTime * 16.0f);
                Vector3.Lerp(ref target, ref center, (float)deltaTime * 6.0f, out target);

                var y = Math.Sin(height);
                var x = Math.Cos(height) * Math.Sin(rot);
                var z = Math.Cos(height) * Math.Cos(rot);

                var dx = (float)Math.Sin(MMW.TotalElapsedTime * 0.5);
                var dy = (float)Math.Cos(MMW.TotalElapsedTime * 0.7);
                var dz = (float)Math.Cos(MMW.TotalElapsedTime * 0.3);

                var pos = new Vector3((float)x, (float)y, (float)z) * Distance;
                pos += target;

                var rays = Physics.Bullet.RayTest(target, Vector3.Lerp(target, pos, 1.1f), GameObject);
                if (rays.Count > 0)
                {
                    var l   = rays.Min(r => r.Rate);
                    var ray = rays.Find(r => r.Rate == l);
                    if (ray != null)
                    {
                        pos = Vector3.Lerp(target, ray.Position, 0.9f);
                    }
                }

                var nx = Noise.Fbm((float)MMW.TotalElapsedTime * 0.15f * NoiseSpeed, 3) * 0.01f;
                var ny = Noise.Fbm((float)MMW.TotalElapsedTime * 0.1f * NoiseSpeed, 4) * 0.01f;
                var nz = Noise.Fbm((float)MMW.TotalElapsedTime * 0.05f * NoiseSpeed, 5) * 0.01f;
                var rt = new Vector3(nx, ny, nz) * NoiseIntensity * 7.0f;
                var rp = new Vector3(ny, nz, nx) * NoiseIntensity * 4.0f;

                cam.Up                 = Matrix3.CreateRotationZ(nx * NoiseIntensity * 2.0f) * Vector3.UnitY;
                cam.Target             = target + rt;
                cam.Transform.Position = pos + rp;
            }
            else if (CameraType == "first person")
            {
                GameObject.GetComponent <MeshRenderer>().Visible = false;
                MMW.MainCamera.FoV  = 1.4f;
                Transform.Rotate.Y += Input.MouseDelta.X * 0.005f;

                var t = new Vector4(pi.Character.EyePosition, 1.0f) * Transform.WorldTransform;
                cam.Transform.Position = t.Xyz;

                fpHeight -= Input.MouseDelta.Y * 0.005f;
                fpHeight  = MMWMath.Clamp(fpHeight, -MathHelper.PiOver2 + 0.1f, MathHelper.PiOver2 - 0.1f);
                var dir = ct.WorldDirectionZ;
                dir   *= (float)Math.Cos(fpHeight);
                dir.Y += (float)Math.Sin(fpHeight);

                var target = dir + t.Xyz;
                Vector3.Lerp(ref nowDir, ref target, (float)deltaTime * 30.0f, out nowDir);
                cam.Target = nowDir;
            }
        }