private void UpdateShadowCasters() { var shadowCaster = LunarHorizon.SunPosition(_currentTime); OpenGLWindow.TheWorld.Terrain.UpdateShadowcaster(shadowCaster); OpenGLWindow.Invalidate(); }
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(); }