private void UpdateShadowCasters()
        {
            var shadowCaster = LunarHorizon.SunPosition(_currentTime);

            OpenGLWindow.TheWorld.Terrain.UpdateShadowcaster(shadowCaster);
            OpenGLWindow.Invalidate();
        }
Пример #2
0
        public override void Drag(OpenGLControlWrapper w, MouseEventArgs e)
        {
            if (_dragging == DragState.Idle)
            {
                return;
            }
            Lookat = Target.Position;
            switch (_dragging)
            {
            case DragState.ArcBalling:     // moving
            {
                var relativePosition = _eye - _lookat;
                var lookToward       = new Vector3d(-relativePosition);
                lookToward.Normalize();
                var right       = Vector3d.Cross(lookToward, Up);
                var yaw         = YawGain * (e.Location.X - _lastLocation.X);
                var yawMatrix   = Matrix4d.CreateFromAxisAngle(Up, yaw);
                var pitch       = PitchGain * (e.Location.Y - _lastLocation.Y);
                var pitchMatrix = Matrix4d.CreateFromAxisAngle(right, pitch);
                var distance    = relativePosition.Length;
                relativePosition = Vector3d.TransformVector(relativePosition, yawMatrix * pitchMatrix);
                relativePosition.Normalize();
                relativePosition = relativePosition * distance;

                _eye = _lookat + relativePosition;
                relativePosition.Normalize();
                Up = Vector3d.Cross(relativePosition, right);
                Up.Normalize();
                _lastLocation = e.Location;
            }
            break;

            case DragState.Scaling:     // scaling
            {
                var d    = ZoomGain * (e.Location.Y - _lastLocation.Y);
                var zoom = Math.Exp(d);
                var rp   = _startPosition * (ZoomFactor * zoom);
                _eye = _lookat + rp;
            }
            break;

            case DragState.RotatingUp:
            {
                var centerX = w.Width / 2;
                var centerY = w.Height / 2;
                var v1      = new Vector3d(_lastLocation.X - centerX, _lastLocation.Y - centerY, 0d);
                var v2      = new Vector3d(e.Location.X - centerX, e.Location.Y - centerY, 0d);
                var v3      = Vector3d.Cross(v1, v2);
                var v3Mag   = v3[2];
                var angDeg  = Math.Asin(v3Mag / (v1.Length * v2.Length));         //*180d/Math.PI
                var axis    = _lookat - _eye;
                axis.Normalize();
                var mat = Matrix4d.CreateFromAxisAngle(axis, -angDeg);
                Up = Vector3d.TransformVector(Up, mat); // was _startUp
                Up.Normalize();
                _lastLocation = e.Location;             // not sure about this
            }
            break;
            }
            Dirty = true;
            w.Invalidate();
        }