Пример #1
0
        protected override void OnUpdateFrame(FrameEventArgs e)
        {
            base.OnUpdateFrame(e);
            etime += (float)e.Time;

            if (!paused)
            {
                //update water
                if (--updateCountdown == 0)
                {
                    updateCountdown = 5;
                    t.UpdateState(updates++);
                }
            }

            //move
            Vector3 forward = (target - eye);             //should be a unit vectorial

            forward.Y = 0;
            Vector3 left = new Vector3(forward.Z, 0, -forward.X);
            Vector3 step = Vector3.Zero;

            KeyboardState kb = OpenTK.Input.Keyboard.GetState();

            if (kb[Key.W])
            {
                step += forward;
            }
            if (kb[Key.S])
            {
                step += -forward;
            }
            if (kb[Key.A])
            {
                step += left;
            }
            if (kb[Key.D])
            {
                step += -left;
            }
            if (kb[Key.Escape])
            {
                Close();
            }
            if (kb[Key.Space])
            {
                step = Vector3.UnitY;
            }
            if (kb[Key.ControlLeft])
            {
                step = -Vector3.UnitY;
            }


            if (step != Vector3.Zero)
            {
                step.Normalize();
            }

            step *= move_speed * (float)e.Time;

            eye    += step;
            target += step;

            //look
            MouseState ms       = OpenTK.Input.Mouse.GetState();
            Vector2    mouse    = new Vector2(ms.X, ms.Y);
            float      mouse_ZX = (oldmouse - mouse).X;        //how far the mouse moved sideways
            float      mouse_UD = (mouse - oldmouse).Y;        //how far the mouse moved up and down
            Matrix4    rotate   = Matrix4.CreateRotationY(mouse_ZX * mouse_speed * (float)e.Time);
            Matrix4    rotateUD = Matrix4.CreateFromAxisAngle(left, mouse_UD * mouse_speed * (float)e.Time);

            oldmouse = mouse;

            target -= eye;
            target  = Vector3.Transform(target, rotate);
            Vector3 ud = Vector3.Transform(target, rotateUD);

            if (Vector3.Dot(ud, forward) > 0)
            {
                target = ud;
            }

            target += eye;


            //lighting
            if (movesun)
            {
                lightPos[0] = 50 + (float)Math.Cos(etime / 6) * 300;
                lightPos[1] = 100;
                lightPos[2] = 50 + (float)Math.Sin(etime / 6) * 300;
            }
            else
            {
                lightPos[0] = 50;
                lightPos[1] = 100;
                lightPos[2] = 50;
            }
        }